_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,然后使用该实例来解析其他类型,但我猜有更好的方法,因为这看起来很混乱。
答案 0 :(得分:1)
看看我对你的第二个问题here的回答。
使用PerResolveLifetimeManager
,解析TypeE
后,TypeE
及其依赖项TypeC
和TypeD
都会获得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”)));