9

Unity 2.0:IDisposable对象的Unity RegisterInstance

默认情况下,RegisterInstance使用ContainerControlledLifetimeManager。处理Unity容器时,它会调用实例上的Dispose(如果IDisposable)。

在我而言,这不是我想要的。该实例由另一个班级拥有并处理;统一应该注入参考。所以我用:

container.RegisterInstance(instance, new ExternallyControlledLifetimeManager()); 

的统一文件(下理解终身经理)指出:

使用RegisterInstance方法 在 注册现有对象的结果相同的行为,如果你只是 注册与 RegisterType寿命容器。因此, 建议使用除 对于其中 RegisterInstance被调用线程 非默认一生的经理,当你不使用 RegisterInstance方法来注册 现有对象。

这是什么意思?

同一节还规定:

如果您注册使用 RegisterInstance方法的对象的现有实例 , 返回相同的情况下为所有 呼叫的容器解决或ResolveAll或当 依赖机制将 实例注入其他类,提供 表示以下情况之一为真:

  • 您指定您使用了默认的生命周期管理器
  • 您解决在您使用不同的 一生经理注册时的 实例相同的上下文的容器控制的一生经理

我尝试使用RegisterInstance与ExternallyControlledLifetimeManager后解决在不同的线程,和它的工作 - 我得到了单一实例。

我的代码与创建实例注册部分中的示例相匹配。不过,我想确保我理解上下文警告。

为了清楚起见,我总是希望Unity容器注入我注册的实例,而不管线程等,我做而不是想让Unity处置掉它。我是否正确地做这件事?

+1

相关:http://stackoverflow.com/questions/5129789/unity-2-0-and-handling-idisposable-types-especially-with-perthreadlifetimemanage – 2011-03-16 19:36:56

回答

2

我觉得你是好人。当您使用PerThreadLifetimeManager,你不使用的所有每个线程评论仅供事项。这只是MSDN文章部分中的笨拙措辞。

这不是一个标准的术语,但在本文中,它们是指特定生命时间管理器定义的内容。对于PerThreadLifetimeManager,你的上下文就是你的线程。对于HierarchicalLifetimeManager,您的上下文是容器层次结构中的特定容器。

对于ExternallyControlledLifetimeManager,没有特定的上下文,因此您可以完全忽略有问题的注释。

作为一个方面说明,请确保在您仍然期望容器解决它们时不要处理您的实例。如果这样做,您的解析请求将返回一个不同于您预期的实例,或者抛出一个异常,具体取决于容器是否可以构造您的类型。

+0

这对我来说很有意义。 – TrueWill 2011-03-17 01:58:09

5

请注意ExternallyControlledLifetimeManager。您仍然需要在容器外的某个位置持有对该实例的引用。一旦你失去了参考,你可能会失去实例,因为ExternallyControlledLifetimeManager只保留WeakReference。如果你没有正常的引用垃圾收集器可以收集你的实例。在我的博客上检查example

+0

+1 - 很好的建议! – TrueWill 2011-03-17 01:57:19

+0

是的,这也是我的意思,但你说的更好。 – 2011-03-17 02:21:11

+0

我希望我能接受这两个答案。 @zespri专门解决了我的问题,但是您的博客条目非常好。 – TrueWill 2011-03-17 14:26:54