注册级联依赖项

时间:2012-02-22 18:25:50

标签: unity-container

_container.RegisterType<TypeA>();
_container.RegisterType<TypeC>(); // TypeC has a dependency to TypeA
_container.RegisterType<TypeD>(); // TypeD has a dependency to TypeA

_container.RegisterType<TypeE>(); // TypeE has a dependencies to TypeC and TypeD
_container.RegisterType<TypeF>(); // TypeF has a dependencies to TypeC and TypeD

如何设置它以便在创建类型E和F时它们都使用TypeA的新实例(间接通过类型C和D)但C和D都使用相同的TypeA?

如果有意义的话,可以想象TypeA是一个存储库,C和D是使用该存储库的服务。类型E和F是ViewModel,它们需要不同的存储库,但通过服务C和D与存储库交互。

我想我可以解析typeA,然后使用该实例来解析其他类型,但我猜有更好的方法,因为这看起来很混乱。

3 个答案:

答案 0 :(得分:1)

看看我对你的第二个问题here的回答。

使用PerResolveLifetimeManager,解析TypeE后,TypeE及其依赖项TypeCTypeD都会获得TypeA的相同实例}。解析TypeF后,将解析新的TypeA,它及其所有依赖项将共享。

PerResolveLifetimeManager是我最喜欢的关于Unity作为IOC容器而非其他容器的事情之一。

答案 1 :(得分:0)

如果将TypeA注册为单例,则请求TypeA对象的所有实例都将使用相同的单引用。使用ContainerControlledLifetimeManager注册类时,它会将对象保持为单例,直到容器被丢弃为止。

myContainer.RegisterType<IRepository, Repository>(new ContainerControlledLifetimeManager());

这是默认行为。要改变这一点,意味着每次都有一个新实例,根据MSDN,您需要使用不同的生命周期:

myContainer.RegisterType<IRepository, Repository>();

答案 2 :(得分:0)

不容易..您应该尝试命名您的实例并使用InjectionConstructor来提供您想要的实例。这样的事情:

_container.RegisterType

_container.RegisterType(                 新的InjectionConstructor(_container.Resolve(“MainRepository”)));

相关问题