说,我上了一堂课
class A : IInt {}
我正在Unity中注册课程:
container.RegisterType<A>(new ContainerControlledLifetimeManager());
我想将IInt注册到相同的A实例,就像有人要A本身一样。例如:
A a = container.Resolve<A>(); // Should return instance of A
IInt i = container.Resolve<IInt>(); // Should return THE SAME instance of A
即使上述陈述被颠倒,这也应该以相同的方式工作-首先要求IInt,然后要求A。
如何在Unity中做到这一点?
一个可能但很丑陋的解决方案:
A a = container.Resolve<A>(); // To resolve A's dependencies
container.RegisterInstance(a);
container.RegisterInstance<IInt>(a);
答案 0 :(得分:2)
Unity将在后台自动对注册重复数据删除。这意味着以下将产生预期的结果:
container.RegisterType<A>(new ContainerControlledLifetimeManager());
container.RegisterType<IInt, A>(new ContainerControlledLifetimeManager());
这将防止这种类型的生活方式被撕裂。
同时解析A
和IInt
将产生相同的实例。
您不应不采用建议的解决方案,因为这是危险的做法。 从容器中解决之后,切勿进行任何新的注册。这是一种不好的做法,因为它可能导致各种不良的副作用和错误,并且由于以下原因而被大多数DI容器阻止:那个。
例如,this article描述了使用Simple Injector进行的Register-Resolve-Register反模式所涉及的问题,但是您会发现这些问题与任何其他DI容器(例如Unity)相同