3

我有一张被另一个应用程序填满的表格。该表包含一个名为 的属性IsMailSent

RequestEF根据数据库数据构建我的 Type 对象。

该对象看起来像这样:

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接收一个 CollectionRequest并构建一个 Collection MailMessages。目前我创建了一个类,它继承自MailMessage并包含对相应请求对象的引用。背后的想法是MailService(负责发送邮件)应该将IsMailSent属性设置为true.

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

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

4

1 回答 1

2

您可以添加一个方法来设置IsMailSentRequest。所以Request班级最终会决定设置或不设置IsMailSentto true。这样,集合代码仍然在Request类中,并且仍然可以影响集合。

例如

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方法中。

于 2016-08-12T06:18:19.413 回答