Windows服务中的EF6存储库模式

时间:2017-08-17 11:11:10

标签: c# .net entity-framework windows-services console-application

我已经实现了一项Windows服务,即从数据库中获取电子邮件列表,并每隔60秒使用.net邮件发送一次。 我使用存储库模式设计了它,请参阅解决方案文件夹和项目的屏幕截图。Click to see the picture

问题:

  1. 就模式而言,我是在正确的轨道上吗?分离项目的结构,为每个存储库创建一个接口,并为每个存储库创建一个服务。
  2. 如果某些业务逻辑与数据库无关,我是否仍需要为它们创建存储库或服务是否足够?
  3. 我有一个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();
    
            }
    

    }

1 个答案:

答案 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接口。