2016-08-12 125 views
3

我有一个表被其他应用程序填充。该表格包含一个名为IsMailSent的属性。更改参数 - 谁负责?

EF根据数据库数据构建了Request类型的对象。

物体看起来是这样的:

public class Request { 
    int SomeInt; 
    bool IsMailSent; 
    SomeObject SomeObject; 
} 

现在我想创建一个服务,这将加载所有的条目与IsMailSent == false,并发送此邮件给接收者。

我目前的代码工作如下: 一个名为MailMessageService的类获得了Start()Stop()方法。该Start方法是这样的:

public void Start(int delay) { 
     tokenSource = new CancellationTokenSource(); 
     T = new Task(() => { 
      MailService ms = new MailService(Res.ServerAddress, int.Parse(Res.ServerPort)); 
      while (true) { 
       var messages = GetMailMessages(_context.Requests.Where(o => !o.IsMailSent)); 
       ms.Send(messages); 
       Thread.Sleep(delay); 
      } 
     }, tokenSource.Token); 
    } 

GetMailMessages接收的Request集合和建立的MailMessages集合的方法。目前我创建了一个继承自MailMessage的类,并且包含对相应请求对象的引用。背后的想法是,MailService(负责发送邮件)应将IsMailSent属性设置为true

所以Send()方法应该设置IsMailSent = true

但是,这是做的最好方法是什么?据我了解固体原则,MailService不应该负责设置此属性(因为它负责发送邮件) - 或者我错了吗?

+0

是IsMailSent属性还是字段? –

+0

我不是一个物业 - 直接设置它只是为了轻松解决我的问题(希望不是基于意见的问题)。我不得不承认,那些责任问题是让我保持清醒的那些...... – C4p741nZ

+0

如果这是唯一的发送应用程序,它应该将其设置为true。当多个应用程序可以发送邮件(服务器驻留)时,应该有一个额外的表用于并发。 (像哪个应用程序正在处理什么项目) –

回答

2

您可以添加一个将IsMailSent设置为Request类的方法。所以Request类将最终决定设置或不设置IsMailSenttrue。这样设置的代码仍然在Request类中,并且仍然可以影响该组。

E.g.

public class Request { 
    // Property 
    public bool IsMailSent { get; private set; } 

    public void MailSent() { 
     // TODO check some conditions 
     if (...) { 
      ... 
     } 

     // If everything is correct set the property 
     IsMailSent = true; 
    } 
} 

而在MailService.Send(...)中您可以拨打MailSent方法。

+0

看起来相当像我自己的解决方案 - 虽然请求本身无法确定邮件是否已发送,但我认为最好的解决方案是在Send()方法成功时设置它。谢谢:) +1 – C4p741nZ