我有以下情况:
在基本容器中,我正在注册一个类型。
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更改为其他内容,他还必须修改所有子容器。
所以我错过了什么?这个问题有更好的解决方案吗?
答案 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>>>();