2011-10-04 32 views
1

我有一個WPF MVVM應用程序有一個模型和服務程序集。我試圖弄清楚如何使用Windsor容器來解決本地(服務層中的服務)依賴項,但我唯一能找出的東西感覺混亂和不正確。IWindsorInstaller中的程序集和解決本地依賴項

Services安裝:

public class ServicesInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     //Services 
     container.Register(
      Component.For<IServiceA>().ImplementedBy<ServiceA>().LifeStyle.Singleton, 
      Component.For<IServiceB>().ImplementedBy<ServiceB>().LifeStyle.Singleton 
    } 
} 

服務消費者(位於服務):

public class ServiceConsumer 
{ 
    public SomeMethodThatUsesServiceAOnlyOcassionally() 
    { 
     //buncha logic. 
     if (allThatFailed) 
     { 
       ??? ResolveServiceA ??? 
     } 
    } 
} 

因爲我不是依賴於ServiceA經常,我不想通過傳遞給它的構造函數注入或屬性注入。我會爲安裝程序添加一個靜態容器實例,但我必須相信有一個比這更加習慣的解決方案。

回答

1

爲了你想要的是常見的DI模式。

如果你的服務有一個可選的依賴項(換句話說,它可以在沒有依賴項的情況下完成它),你應該使用屬性注入。如果你的服務需要依賴來正常工作,你應該使用構造器注入(因爲它是一個必需的依賴)。但是,如果創建該服務非常耗時,則應該隱藏該代理後面的依賴項,這可以在第一次調用代理時懶惰地創建該依賴項。

然而,在你的情況下,ServiceA被註冊爲單例,所以它只在應用程序的生命週期中創建一次。換句話說,沒有理由使用代理,並且由於你的服務不能沒有它,你應該只使用構造函數注入,因爲它明確表示IServiceA是必需的依賴項。

+0

那麼從來沒有理由以編程方式解析類型(除了初始化/佈線)嗎? –

+0

@Ritch:如果您手動調用容器(在應用程序邏輯內部)來解析實例?沒有永不!這將導致[服務定位器反模式](http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx)。 – Steven

+0

好的,服務定位器是我的習慣。我明白了,但很容易默認爲舊思維。 –