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

时间:2019-03-13 17:03:00

标签: c# .net amazon-web-services aws-sdk

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

using (var client = new AmazonSimpleEmailServiceClient(RegionEndpoint.USWest2))
{
    //...
}

我认为这是可以的,但是,在我的生产应用程序中,我应该只初始化一次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);
    }
}

我的生产应用程序正在发送大量电子邮件。我不确定AmazonSimpleEmailServiceClient对象的行为,但是似乎比每次发送电子邮件时都创建一个实例要好得多。

2 个答案:

答案 0 :(得分:1)

重用课程时,您不仅要关注性能,而且要注意并发性。

话虽如此,对source code的快速浏览显示了该类调用其基类AmazonWebServiceClient的{​​{1}}方法:

Dispose

基类不覆盖Dispose方法,而是依赖于其自己的基类#region Dispose protected override void Dispose(bool disposing) { base.Dispose(disposing); } #endregion

AbstractWebServiceClient

请注意,/// <summary> /// Implements the Dispose pattern for the AmazonWebServiceClient /// </summary> /// <param name="disposing">Whether this object is being disposed via a call to Dispose /// or garbage collected.</param> protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing && logger != null) { logger.Flush(); logger = null; } this.disposed = true; } } 方法正在清理记录器的内部实例。

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

他们关于生命周期的client documentation确实提到了线程安全和类重用:

  

适用于.NET的AWS开发工具包的最著名方面是各种服务   可用于与AWS交互的客户端。客户端对象是   线程安全,一次性使用和可以重复使用。 (客户端对象是   价格便宜,因此通过构建以下内容,您不会招致大笔费用   多个实例,但创建并重用它不是一个坏主意   客户。)

希望有帮助。

答案 1 :(得分:0)

是的,您应该始终实例化将要使用多次的类。在非GarrbageCollector语言(如C ++)中,在任何地方实例化类而不处理它们可能是一个问题。