2009-11-07 17 views
0

在多層應用程序(ASP MVC:UI項目,DAL項目)中,我在web.config中註冊了組件。如何獲得溫莎城堡的服務實例

現在我有這個問題:工作單元模式已經實現,我需要獲取特定服務的當前實例。服務的註冊發生在UI項目中,但我需要在DAL項目中獲取此服務的當前實例。我如何得到這個參考?

在UI項目我已經需要一種方式來得到的東西解決:

container = new WindsorContainer(
       new XmlInterpreter(new ConfigResource("castle")) 
      ); 
      personRepository= container.Resolve<IPersonRepository>(); 

難道即可使用的DAL項目相同的技術?如果是,我應該將配置寫入單獨的文件中,以便可以通過所有圖層(項目)訪問它?

對不起,這個(我認爲)天真的問題,但這是我的第一個項目使用城堡,我想我不明白它的大圖片!

代碼片段會有很大的幫助。

在此先感謝!

回答

1

簡而言之:每個應用程序都有一個容器實例,一個容器配置具有應用程序所需的所有組件。如果您需要DAL中的服務,請通過構造函數(如果依賴項爲需要)或setter(如果依賴項爲可選)在DAL類中注入適當的服務接口。

儘量避免使用靜態IoC網關,它隱藏了組件的真正依賴關係並且妨礙了可測試性。

看到這些相關的問題:

+0

我明白你的意思了! 但我不明白的是:這應該怎麼做! DAL是它自己的一個組合。在它的一個類中,我簡單地使用(IWindsorContainer容器)作爲構造函數參數?如果是的話,我不需要註冊容器本身(在UI項目中)?怎麼樣? 或者可以(應該)使用這樣的東西: WindsorContainer container = new WindsorContainer(); container.Resolve (); 這意味着沒有構造函數注入。 ...想我不明白如何做到這一點的技巧! – 2009-11-08 22:06:52

+0

不,*避免*直接調用容器。不管它是否是另一個程序集,它仍然是同一個應用程序。使用此項目作爲參考:http://code.google.com/p/blogsharp/ – 2009-11-09 01:37:53

-3

看看這個article。它向您展示瞭如何編寫一個使用Castle Windsor執行依賴關係解析的靜態類。您應該考慮將此類放在一個單獨的項目中,該項目可以從您的UI和DAL項目中引用以允許重用代碼。正如文章解釋的那樣,你的班級應該提供一個初始化你的IoC容器的引導程序工具。對你來說,這將是這樣的:

public static class IoC 
{ 
    private WindsorContainer _container; 

    public static void Initialize() 
    { 
     _container = new WindsorContainer(
      new XmlInterpreter(new ConfigResource("castle")) 
     ); 
    } 
} 

引導程序將在應用程序啓動時在你的UI項目Global.asax文件被調用。

從容器中獲取對象實例的其他方法將按照文章。

+2

請不建議這樣做。靜態IoC網關是在IoC惡意環境中獲得IoC功能的**最後一個資源。應該鼓勵定期的DI實踐。 – 2009-11-08 15:16:28