2011-04-10 63 views
3

我有以下情形:Unity:註冊一個裝飾器在兒童容器中

在基本容器中,我正在註冊一個類型。

container.RegisterType<IFoo,Foo>(); 

在一個子容器中,我想註冊一個包裝基本容器使用的裝飾器。所以,如果我有這個類:

public class FooDecorator: IFoo 
{ 
    public FooDecorator(IFoo foo) {} 
} 

我要註冊:

childContainer.RegisterType<IFoo,FooDecorator>(); 

這似乎是合理的,我當孩子容器中FooDecorator構造解析的IFoo,它會嘗試解析父容器的IFoo。但事實並非如此。它試圖再次解析FooDecorator,並因此一次又一次地引發StackOverflow異常。

我知道這可以通過在子容器註冊指定的InjectionConstructor,這樣解決:

childContainer.RegisterType<IFoo,FooDecorator>(
    new InjectionConstructor(new ResolvedParameter<Foo>())); 

但這似乎脆弱。如果有人想將基本容器中IFoo的實際實例從Foo更改爲其他內容,那麼他​​也必須修改所有子容器。

所以我錯過了什麼?有沒有更好的解決方案?

回答

4

您可以使用一個名爲映射:

parentContainer.RegisterType<IFoo, Foo>("decorated"); 

childContainer.RegisterType<IFoo, FooDecorator>(
    new InjectionConstructor(new ResolvedParameter<IFoo>("decorated"))); 

這樣裝飾的註冊取決於「飾」界面的IFoo的命名映射。

+0

呀,這其實目前我在做什麼,但我不喜歡這種解決方案非常多,因爲現在我要手動註冊每種使用IFoo的類型,或者確保在每個子容器中註冊IFoo,即使它不需要重寫默認行爲。 – 2011-04-18 09:37:31

+0

您可以使用相同的映射在父容器中註冊兩次IFoo:一個已命名的註冊和一個默認的註冊。 – onof 2011-04-18 11:10:50

+0

是的,我再次使用了一個解決方案,但似乎有點時髦。我想現在沒有其他辦法了。謝謝 – 2011-04-20 05:29:39

1

onof's answer需要處理構造函數參數,這些參數在開發過程中可能會改變。 My answer elsewhere解決這個問題,但交換中有不同的缺點。

用我的技術登記將如下所示:

unityContainer.RegisterType<IService, LoggedService<ProfiledService<Service>>>();