3

別のアプリケーションによって埋められるテーブルがあります。このテーブルには、 という属性が含まれていますIsMailSent

EF はRequest、データベース データに基づいて 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は、 のコレクションを受け取り、 のコレクションをRequest構築しますMailMessagesMailMessage現在、対応する Request オブジェクトへの参照を継承して含むクラスを作成しました。背後にある考え方は、MailService(メールの送信を担当する) がIsMailSentプロパティを に設定する必要があるというものtrueです。

したがって、Send()メソッドは設定する必要がありますIsMailSent = true

しかし、これはそれを行うための最良の方法ですか?SOLID Principles を理解しているので、MailServiceこのプロパティの設定に責任を負うべきではありません (メールの送信に責任があるため) - または間違っていますか?

4

1 に答える 1

2

IsMailSentを設定するメソッドをRequestクラスに追加できます。したがって、Requestクラスは最終的に を に設定するかどうかを決定しIsMailSentます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 に答える