在Unity中导致相同实例的两种不同类型

时间:2018-08-23 07:57:02

标签: c# dependency-injection unity-container

说,我上了一堂课

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);

1 个答案:

答案 0 :(得分:2)

Unity将在后台自动对注册重复数据删除。这意味着以下将产生预期的结果:

container.RegisterType<A>(new ContainerControlledLifetimeManager());
container.RegisterType<IInt, A>(new ContainerControlledLifetimeManager());

这将防止这种类型的生活方式被撕裂。

同时解析AIInt将产生相同的实例。

您不应采用建议的解决方案,因为这是危险的做法。 从容器中解决之后,切勿进行任何新的注册。这是一种不好的做法,因为它可能导致各种不良的副作用和错误,并且由于以下原因而被大多数DI容器阻止:那个。

例如,this article描述了使用Simple Injector进行的Register-Resolve-Register反模式所涉及的问题,但是您会发现这些问题与任何其他DI容器(例如Unity)相同