0

我有許多將IMyService作爲構造函數參數的類。Windsor Ioc容器:如何註冊某些構造函數採用不同的接口實現

例如

ClassA(IMyservice myservice) 
// this should take a Concrete1 for IMyService 

ClassB(IMyservice myservice) 
// this should take a Concrete2 for IMyService 

我該如何做我的註冊,以便ClassB獲取Concrete2並且ClassA獲取Concrete1?

另外,有沒有辦法讓一個默認,只指定偏離默認情況下的實例? (由於大多數將採取Concrete1,只有少數會採取Concrete2。)

我使用流暢的接口,不是的XML配置。

回答

1

使用服務覆蓋:

var container = new WindsorContainer(); 
container.Register(
    Component.For<IMyService>().ImplementedBy<Concrete1>().Named("C1"), 
    Component.For<IMyService>().ImplementedBy<Concrete2>().Named("C2"), 
    Component.For<ClassA>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("C1")), 
    Component.For<ClassB>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("C2")) 
); 
+0

是有辦法有一個默認的,只是重寫例外。作爲otherwis,我需要做約100具體註冊concrete1和約3具體2 - 謝謝 – ChrisCa

+0

當組件需要一個「IMyService」,我認爲溫莎將永遠返回第一個註冊。所以你可以跳過ClassA的ServiceOverride(和其他100個案例),並在3個邊緣案例中使用它。 – PatrickSteele

+0

在這種情況下C1和C2是什麼?他們是否給予註冊的任意名稱,以便您可以在serviceOverrides中引用他們?或者它們是否與我項目中的實際課程相對應?再次感謝 – ChrisCa

相關問題