2011-04-19 27 views
0

我的問題是關於一般的軟件架構。建築用IoC容器取代單件主要對象

讓我們來看一個例子:

我們有一個Windows服務應用程序。

Program.cs創建並啓動MainService類的實例。

MainService繼承自ServiceBase,因此實現了OnStart(string[] args)方法。

通常,當我設計我的申請,我會做這樣的事情在OnStart方法:

MainSingletonObject.Initialize(); 

初始化會讀的app.config的配置數據,並創建所需的類的實例,打開WCF主機(如果有的話)等。

這是啓動服務應用程序的好習慣嗎?什麼是你的個人建築改善設計建議?如何適應IoC容器,以及如果我手動進行依賴注入,爲什麼還需要它?

+1

我看到它的兩個問題:1)你使用單例反模式(http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-自1995年以來),以及2)它沒有任何用處。軟件體系結構不是關於將模式堆疊在彼此之上,而是以易於開發,理解和維護的方式構建程序。任何不利於其中之一的東西在你的架構中都沒有位置。那麼,通過創建這樣的單身人士,普通班級甚至功能,你會獲得什麼? – jalf 2011-04-19 16:10:59

+0

我得到了乾淨的代碼。而不必調用var myMainClass = new MainClass();和myMainClass.Start();我在服務OnStart方法中只有一行代碼。簡單地創建一個對象並運行一個方法有什麼好處? – 2011-04-19 16:19:42

+0

但是你可能是對的,我失去了並且有能力將參數傳遞給構造函數。我可以簡單地在OnStart方法中讀取app.config中的所有依賴項,並且如果出現問題,請指出服務的啓動已失敗。 – 2011-04-19 16:23:20

回答

1

我杜絲竟被國際奧委會這裏的服務引導階段:

ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
       { 
        new ServiceClass() 
       }; 
      ServiceBase.Run(ServicesToRun); 

而不必new ServiceClass我將通過國際奧委會解決服務類在這裏,讓你避免在服務實現一個IoC依賴。如果您需要通過注入構建一個全新的對象,請考慮公開在IoC中註冊的服務ITypeFactory,該服務將您的代碼與您將使用的特定容器隔離開來。一般來說,如果您也對容器進行絕緣,您可以在IoC中測量出良好的設計。

0

單身不能依靠別人來初始化它。它在使用後立即初始化。

這是我會怎麼做:

public class MySingleton 
{ 
    private static readonly MySingleton _instance = new MySingleton(); 

    private MySingleton() 
    { 
     // ... read config 
    } 

    public static MySingleton Instance 
    { 
     get { return _instance; } 
    } 
} 

這裏static readonly確保這是延遲加載