2016-08-12 124 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