Unity 2.0:
默认情况下,RegisterInstance使用ContainerControlledLifetimeManager。当Unity容器被处理时,它会调用实例的Dispose方法(如果实现了IDisposable接口)。
在我的情况下,这不是我想要的。该实例由另一个类拥有并进行处理;Unity只需注入引用即可。因此,我使用了:
container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());
Unity文档(在了解生命周期管理器下)指出:
使用RegisterInstance方法注册现有对象的结果与使用RegisterType直接注册生命周期容器具有相同的行为。因此,建议您在使用非默认生命周期管理器时不要使用RegisterInstance方法注册现有对象,除非是在调用RegisterInstance的线程中。
这是什么意思?
同一部分还指出:
如果您使用RegisterInstance方法注册了现有对象的实例,则只要满足以下条件之一,容器就会为所有调用Resolve或ResolveAll或将实例注入到其他类中返回相同的实例:
您已经指定了容器控制的生命周期管理器。
您已经使用了默认的生命周期管理器。
当使用不同的生命周期管理器在相同的上下文中解析时,您正在解决注册实例的上下文。
我在使用ExternallyControlledLifetimeManager进行RegisterInstance之后在不同的线程中尝试解析,并且它可以工作 - 我得到了单例实例。
我的代码与创建实例注册部分的示例匹配。但我想确保我理解上下文警告。
明确地说,我始终希望Unity容器注入我注册的实例,而不管线程等情况,并且我不想Unity处理它。我做得对吗?