我已经实现了一项Windows服务,即从数据库中获取电子邮件列表,并每隔60秒使用.net邮件发送一次。 我使用存储库模式设计了它,请参阅解决方案文件夹和项目的屏幕截图。Click to see the picture
问题:
我有一个SMTP服务类正在实现.net邮件和发送电子邮件,而我正在发送我需要更新数据库的每封电子邮件,我想知道是否将更新逻辑放在SMTP服务中上课是一种很好的做法?它就像下面的
public class SMTPService : ISMTPService
{
SmtpClient client;
MailMessage newMessage;
EmailService emailService;
IEventLoggerService MailCheckerLog;
public async Task SendEmail(tb_Email email)
{...}
void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e, tb_Email email)
{
if (e.Cancelled)
{
}
if (e.Error != null)
{
}
else
{
email.DateSent = DateTime.Now;
emailService.Update(email);
}
client.Dispose();
newMessage.Dispose();
}
}
答案 0 :(得分:0)
我不确定您想要达到的目标以及您拥有的业务要求。
现在结构还可以,但请考虑一下:你有一个用户实体和一个照片实体。每个用户必须有一张与他们相关的照片。你会如何处理这种情况?
您必须创建UserRepository和PhotoRepository。首先,您必须插入用户记录,以便照片记录稍后引用它。 因此,您调用UserRepository的Insert()方法。插入用户时,可以调用PhotoRepository的Insert()方法。但是如果Insert()失败怎么办?现在,您在数据库中有一个没有照片的用户。
您必须在一次交易中将用户和照片一起插入。这就是工作单元模式的用武之地。如果您的业务逻辑涉及多个实体类型,则必须使用它。如果您所做的只是处理电子邮件,那么这很好。如果没有,您必须将该模式添加到您的应用程序。查看示例here。
服务同样是处理业务交易的东西,商业交易可以触及多种类型的商家。同样,工作单元模式可以帮助您解决这个问题。但通常存储库是基于您的entites和基于业务逻辑的服务创建的。在该示例中,您可以拥有一个同时使用UserRepository和PhotoRepository的UserService(通常通过工作单元)。
如果发送电子邮件,我会再次根据我的业务逻辑设计服务。业务逻辑可能是“发送电子邮件”,而不是“通过SMTP发送电子邮件”。如果您决定使用像SendGrid这样的服务会发生什么?那么它不再是SMTPService了。
我可能会创建一个EmailService(你也有),这将有一个SendEmails()方法。这将使用EmailRepository获取电子邮件,使用SMTP发送,然后更新它并通过工作单元保存。
或者,如果您想要非常抽象,可以使用一种方法SendEmail(电子邮件电子邮件)创建一个IEmailSenderService接口。然后,您可以创建一个SmtpEmailSenderService,它实现此接口并包装SmtpClient类并使用SMTP发送电子邮件。如果您决定转移到SendGrid,则可以创建一个SendGridEmailSenderService,它使用HttpClient向SendGrid发出请求。更新仍在使用存储库和工作单元的EmailService中完成,但现在EmailService本身不使用SmtpClient而只使用IEmailSenderService接口。