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

Two different types leading to the same instance in Unity

说,我有一个 class:

class A : IInt {}

我正在 Unity 中注册 class:

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

Unity会在后台自动去重注册。这意味着以下将产生预期的结果:

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

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

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

您应该采用您提出的解决方案,因为这是一种危险的做法。 从容器中解析后,您永远不应该进行任何新注册。这是一种不好的做法,因为它会导致各种不需要的副作用和错误,并且会被大多数 DI 阻止容器因此。

例如,this article 描述了使用简单注入器注册-解析-注册反模式所涉及的问题,但您会发现这些问题与任何其他 DI 容器相同,例如作为 Unity。