统一 2.0:
默认情况下,RegisterInstance 使用 ContainerControlledLifetimeManager。当 Unity 容器被释放时,它会在实例上调用 Dispose(如果是 IDisposable)。
就我而言,这不是我想要的。该实例由另一个类拥有和处置;Unity 应该只注入引用。所以我用:
container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());
Unity 文档(在Understanding Lifetime Managers 下)指出:
使用 RegisterInstance 方法注册现有对象会产生与刚刚使用 RegisterType 注册生命周期容器相同的行为。因此,在使用非默认生命周期管理器时,建议不要使用 RegisterInstance 方法注册现有对象,调用 RegisterInstance 的线程除外。
这是什么意思?
同一部分还指出:
如果您使用 RegisterInstance 方法注册了对象的现有实例,则容器会为对 Resolve 或 ResolveAll 的所有调用或当依赖机制将实例注入其他类时返回相同的实例,前提是满足以下条件之一:
- 您已指定容器控制的生命周期管理器
- 您已使用默认生命周期管理器
- 您在使用不同的生命周期管理器时在注册实例的同一上下文中解析。
在将 RegisterInstance 与 ExternallyControlledLifetimeManager 一起使用后,我尝试在不同的线程中解决,并且它起作用了 - 我得到了单例实例。
我的代码与创建实例注册部分中的示例匹配。不过,我想确保我理解上下文警告。
需要明确的是,我总是希望 Unity 容器注入我注册的实例,而不考虑线程等,并且我不希望 Unity 处理它。我这样做正确吗?