我应该创建并重用 AmazonSimpleEmailServiceClient 作为单例吗?

ksp*_*rin 3 .net c# amazon-web-services aws-sdk

.NET 的 SES 文档显示使用AmazonSimpleEmailServiceClient初始化语句发送电子邮件using

using (var client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USWest2))
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

我知道这对于一个例子来说是可以的,但是,在我的生产应用程序中,我应该AmazonSimpleEmailServiceClient只初始化一次然后重用它吗?

// MailSender is registered with DI as Singleton
public class MailSender
{
    private AmazonSimpleEmailServiceClient _client;

    public MailSender()
    {
        _client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USWest2);
    }

    public void SendEmail()
    {
        // ...
        _client.SendEmail(request);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的生产应用程序正在发送大量电子邮件。我不确定该AmazonSimpleEmailServiceClient对象的行为方式,但创建单个实例似乎比每次发送电子邮件时更新它的性能更高。

Jua*_*anR 5

当重用一个类时,您关心的不仅仅是性能,还有并发性。

\n\n

话虽这么说,快速浏览一下源代码就会发现这个类调用了它的基类AmazonWebServiceClientDispose方法:

\n\n
#region Dispose\n\nprotected override void Dispose(bool disposing)\n{\n    base.Dispose(disposing);\n}\n#endregion\n
Run Code Online (Sandbox Code Playgroud)\n\n

基类不会重写 Dispose 方法,而是依赖于它自己的基类AbstractWebServiceClient

\n\n
/// <summary>\n/// Implements the Dispose pattern for the AmazonWebServiceClient\n/// </summary>\n/// <param name="disposing">Whether this object is being disposed via a call to Dispose\n/// or garbage collected.</param>\nprotected virtual void Dispose(bool disposing)\n{\n    if (!this.disposed)\n    {\n        if (disposing && logger != null)\n        {\n            logger.Flush();\n            logger = null;\n        }\n        this.disposed = true;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,该Dispose方法正在清理记录器的内部实例。

\n\n

因此,就性能而言,肯定有一些收获。然而,就并发性而言,代码注释中并没有提到该类是线程安全的。

\n\n

然而,他们关于生命周期的客户端文档确实提到了线程安全和类重用:

\n\n
\n

适用于 .NET 的 AWS 开发工具包最著名的方面是可用于与 AWS 交互的各种服务客户端。客户端对象是线程 安全的、一次性的并且可以重用。(客户端对象很便宜,因此构建多个实例不会产生很大的开销,但创建和重用客户端并不是一个坏主意。)

\n
\n\n

希望这有帮助。

\n