Unity:在子容器中注册装饰器

时间:2011-04-10 13:45:58

标签: unity-container ioc-container

我有以下情况:

在基本容器中,我正在注册一个类型。

container.RegisterType<IFoo,Foo>();

在子容器中,我想注册一个Decorator,它包装基本容器使用的任何内容。所以,如果我有这个课程:

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更改为其他内容,他还必须修改所有子容器。

所以我错过了什么?这个问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

您可以使用命名映射:

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

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

这样装饰器的注册取决于接口IFoo的命名映射“装饰”。

答案 1 :(得分:1)

onof's answer需要摆弄构造函数参数,这些参数可能会在开发期间发生变化。 My answer elsewhere解决了这个问题,但在交换方面有不同的缺点。

根据我的技术,注册将如下所示:

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