我在.NET中有一个(相当标准的)单例对象(它具有受保护的构造函数和Instance属性)。 我需要在Unity容器中注册其实例,所以我打电话 但是,我想避免在容器注册方法中实例化它(建议仅在需要时才调用它),因为有可能不需要它并且其初始化过程很繁琐。 有没有办法可以做到这一 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
Unity 2.0:
默认情况下,RegisterInstance使用ContainerControlledLifetimeManager。 当处置Unity容器时,它会调用实例上的Dispose(如果是IDisposable)。
在我的情况下,这不是我想要的。 该实例由另一个类拥有并处置; Unity应该只注入引用。 所以我用过:
container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());
Unity文档(在了解终身经理下)指出:
使用RegisterInstance方法注册现有对象会产生与刚刚使用RegisterType注册生命周期容器相同的行为。 因此,建议您在使用非默认生存期管理器时不使用RegisterInstance方法注册现有对象,但调用RegisterInstance的线程除外。
这是什么意思?
同一部分还指出:
如果使用RegisterInstance方法注册了对象的现有实例,则容器将为Resolve或ResolveAll的所有调用返回相同的实例,或者当依赖性机制将实例注入其他类时,前提是满足下列条件之一:
- 您已指定容器控制的生命周期管理器
- 您已使用默认生命周期管理器
- 您正在使用不同的生命周期管理器在您注册实例的相同上下文中进行解析。
在使用RegisterInstance和ExternallyControlledLifetimeManager之后,我尝试在另一个线程中解析,并且它工作了 - 我得到了单例实例。
我的代码与“创建实例注册”部分中的示例相匹配。 不过,我想确保理解背景警告。
为了清楚起见,我总是希望Unity容器注入我注册的实例而不管线程等,我不希望Unity处理它。 我这样做了吗?
注意ExternallyControlledLifetimeManager
。 您仍必须在容器外部的某个位置保留对实例的引用。 丢失引用后,您可能会丢失实例,因为ExternallyControlledLifetimeManager
仅保留WeakReference
。 如果您没有正常参考垃圾收集器可以收集您的实例。 检查我博客上的示例 。
我觉得你很好。 所有每线程注释仅在您使用PerThreadLifetimeManager时才有意义,而您不使用它。 这只是MSDN文章部分的笨拙措辞。
这不是标准术语,但在本文中,它们指的是由特定的终身经理定义的内容。 对于PerThreadLifetimeManager,您的上下文就是您的线程。 对于HierarchicalLifetimeManager,您的上下文是容器层次结构中的特定容器。
对于ExternallyControlledLifetimeManager,没有特定的上下文,因此您可以完全忽略相关注释。
作为旁注,请确保在您仍希望容器解决它们时不要丢弃实例。 如果这样做,您的解析请求将返回与您预期不同的实例,或者抛出异常,具体取决于容器是否可以构造您的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.