2011-04-28 55 views
0

我有一個名爲MessageService的類。這個班負責接收電子郵件(實際流量)。根據郵件的主題,它會檢測哪個流程處於危險中並執行操作。20依賴通過構造函數做IOC

一些代碼來解釋我的問題可能更爲簡單:

public class MessageService 
{ 
    public void ReadEmail() 
    { 
     switch (subject) 
     "1" : 
      Myservice.action1(); break; 
     "2" : 
      Myservice.action2(); break; 
     "qwwerty" : 
      MyOtherservice.Querty(); break; 
      etc... 
    } 
} 

爲了做到控制反轉,我想通過我的課MessageService的構造函數傳遞到服務的引用。

public MessageService(IMyService myService,IMyOtherservice myOtherservice, ect....) 
{ 
    Myservice=myService; 
    MyOtherservice=myOtherservice; 
} 

這對於一些引用很有用,但MessageService類可以處理高達20,30或40個不同的流。這將使我的班級初始化有點沉重。

有沒有更好的方法來實現它?通過一些設計模式?我應該關心國際奧委會嗎(儘管,我喜歡在......之後對班級進行測試)?

感謝您的幫助,

回答

0

你可能會想使用鏈方面的責任的設計模式。創建一個界面,知道如何處理電子郵件,併爲您想要做的每個任務構建單獨的類(大致相當於您的switch語句(switch,btw,是一個非常幼稚的COR實現))。這些課程將分別只提供他們需要的服務。然後在MessageService採取這些接口的列表,並處理它們一次一個,直到其中一個表示它已處理它:

public interface IMessageReader 
{ 
    /// <returns><c>true</c> if handled; otherwise false 
    bool ReadEmail(Mail message); 
} 

public class QwertyMessageReader : IMessageReader 
{ 
    public QwertyMessageReader(IMyOtherService otherService) {/*set*/} 
    public bool ReadEmail(Mail message) 
    { 
    if(message.Subject.Equals("qwwerty")) 
    { 
     otherService.Querty(); 
     return true; 
    } 
    return false; 
    } 
} 

public class MessageService 
{ 
    public MessageService(IEnumerable<IMessageReader> readers) {/*set*/} 
    public void ReadEmail() 
    { 
     var handled = readers.Select(reader => reader.ReadEmail(message)) 
          .FirstOrDefault(result => result); 
    } 
} 

你需要調整接口和上面的代碼,以適應你在做什麼,但這是主要概念。

如果您註冊了多個相同的接口,那麼大多數像樣的IOC容器會爲您自動生成IEnumerable> <>。

+0

不錯的解決方案我很喜歡它。不幸的是,我不確定我的國際奧委會是否會完成這項工作,因爲它有些是由一些同事自己創造的,人們真的不願意轉向不同的東西。我會看看我能做什麼,我會回來..謝謝你! – Arthis 2011-04-29 07:17:55

0

最好的建議是將你的班級分成更小的班級。在一個類中有30或40個依賴關係表明它做得太多了。試着將每個課程分成只做一件事情的東西,然後你可以開始將它們組合成更大的功能。由於您使用的是IoC容器,因此實際上這不應該太難,並且會使您的代碼更易於測試。理想的目標是每個班級爲一個或兩個依賴項拍攝,但實際上,我認爲4或5是一個很好的目標。

不知道你的代碼到底在幹什麼,很難提出具體的設計模式。

+0

這就是我的想法,但我有點失落,因爲知道如何打破我的課程......我會更深入地看,並告訴你,如果我找到任何東西..謝謝你們一樣。 – Arthis 2011-04-29 07:10:38

相關問題