2012-06-01 96 views
2

使用Castle Windsor我可以註冊一個類型的多個實現,例如在Castle Windsor的運行時註冊附加組件實現

container.Register(Component.For<IMyInterceptor>() 
    .ImplementedBy<MyInterceptor>(); 

container.Register(Component.For<IMyInterceptor>() 
    .ImplementedBy<MyInterceptor2>(); 

這所有的作品,你會期望我能解決您在使用ResolveAll()

多種實現。如果我嘗試雖然註冊在運行時另一實現的實例 - 例如

var interceptor = new MyInterceptor3(); 
Container.Register(
    Component.For<IMyInterceptor>() 
     .Instance(interceptor)); 

我得到一個異常:

有一種成分已經註冊給定鍵MyInterceptor3

這是預期的行爲?我試圖達到的目標是使用例如Container.ResolveAll()獲取IMyInterceptor的默認實現列表以及可選的其他實現(即,在啓用調試模式時按請求請求的情況下)。

+0

我collegue向我指出這個鏈接http://stw.castleproject.org/Default.aspx?Page=Registering-components-one-by-one&NS=Windsor&AspxAutoDetectCookieSupport=1 具體做法是: 註冊實例忽略生活方式 當你註冊現有的實例,即使您指定了一種生活方式,它也會被忽略。同時註冊實例,將爲您設置實現類型,因此如果您嘗試手動執行,則會引發異常。 所以它看起來像實例總是單身性質(?) –

回答

1

這會排序你。

var interceptor = new MyInterceptor3(); 
Container.Register(
    Component.For<IMyInterceptor>() 
     .Instance(interceptor).Named("something unique)); 

名稱必須是唯一的。

+0

謝謝。我認爲我遇到的問題是我試圖將組件註冊爲PerWebRequest。在'Instance()'情況下,這被忽略(如上面的註釋),以便在第二個請求中我得到異常(即當試圖覆蓋現有組件(?)時)。 –

+0

有趣的是,在OpenRasta代碼庫中挖掘,似乎有一個解決方法,使用自定義組件https://github.com/openrasta/openrasta-castle-windsor/blob/master/src/OpenRasta.DI.Windsor/ WindsorDependencyResolver.cs(請參閱AddDependencyInstanceCore())。我之前通過OR使用過這個功能,這可以解釋爲什麼我對Castle的預期行爲感到困惑 –

相關問題