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
对象的行为,但是似乎比每次发送电子邮件时都创建一个实例要好得多。
答案 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 ++)中,在任何地方实例化类而不处理它们可能是一个问题。