如何改造邮件发送代码实现SMTP服务单实例复用?
复用SMTP实例优化邮件发送服务
当前代码中Smtp.SendMailSync静态方法每次调用都会创建新的SMTP实例,频繁实例化会消耗系统资源,导致过载。核心解决思路是在服务类中初始化单个SMTP实例并复用,具体实现如下:
步骤1:添加SMTP实例字段
在NotificationQueueService类中添加私有只读的SMTP实例字段,用于存储复用的实例:
private readonly NotificationQueueContext _dbContext; private readonly Smtp _smtpClient; // 替换为你实际的SMTP类类型
步骤2:在构造器中初始化SMTP实例
修改构造器,传入SMTP配置并初始化实例(根据你的SMTP类构造逻辑调整):
protected NotificationQueueService(NotificationQueueContext dbContext, SmtpConfiguration smtpConfiguration) { _dbContext = dbContext; // 初始化SMTP实例,复用配置 _smtpClient = new Smtp(smtpConfiguration); }
步骤3:修改发送方法复用实例
调整SendInstantMailNotification方法,调用已初始化的SMTP实例的发送方法,同时优化查询逻辑减少内存开销:
private void SendInstantMailNotification(string notificationId) { // 直接用First查询,避免ToList后取First的冗余操作 var notification = _dbContext.Notifications.First(x => x.Id.Equals(notificationId)); var message = notification.Content; // 复用已创建的SMTP实例发送邮件 _smtpClient.SendMailSync(message, Smtp.MailTypeEnum.HTML); }
额外注意事项
- 线程安全检查:如果服务运行在多线程环境(比如Web应用),需确认
Smtp类的SendMailSync方法是否支持并发调用。若不支持,可在发送逻辑外添加锁(lock(_smtpClient) { ... })避免并发问题。 - 依赖注入优化:如果使用依赖注入容器(如ASP.NET Core),可将
Smtp类注册为单例(Singleton),直接注入到NotificationQueueService中,实现整个应用范围内的实例复用:// DI容器注册示例(ASP.NET Core) services.AddSingleton<Smtp>(sp => new Smtp(sp.GetRequiredService<SmtpConfiguration>())); services.AddScoped<NotificationQueueService>();
内容的提问来源于stack exchange,提问作者MatejDodevski
相关产品推荐
相关产品推荐

