繁体   English   中英

Unity RegisterInstance的IDisposable对象

Unity RegisterInstance of IDisposable objects

提示:本站收集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处理它。 我这样做了吗?

2 个回复

注意ExternallyControlledLifetimeManager 您仍必须在容器外部的某个位置保留对实例的引用。 丢失引用后,您可能会丢失实例,因为ExternallyControlledLifetimeManager仅保留WeakReference 如果您没有正常参考垃圾收集器可以收集您的实例。 检查我博客上的示例

我觉得你很好。 所有每线程注释仅在您使用PerThreadLifetimeManager时才有意义,而您不使用它。 这只是MSDN文章部分的笨拙措辞。

这不是标准术语,但在本文中,它们指的是由特定的终身经理定义的内容。 对于PerThreadLifetimeManager,您的上下文就是您的线程。 对于HierarchicalLifetimeManager,您的上下文是容器层次结构中的特定容器。

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

作为旁注,请确保在您仍希望容器解决它们时不要丢弃实例。 如果这样做,您的解析请求将返回与您预期不同的实例,或者抛出异常,具体取决于容器是否可以构造您的类型。

1 在Unity中具有延迟实例化的RegisterInstance

我在.NET中有一个(相当标准的)单例对象(它具有受保护的构造函数和Instance属性)。 我需要在Unity容器中注册其实例,所以我打电话 但是,我想避免在容器注册方法中实例化它(建议仅在需要时才调用它),因为有可能不需要它并且其初始化过程很繁琐。 有没有办法可以做到这一 ...

2 Unity-RegisterFactory与RegisterInstance

我是Unity容器的新手,但是有一些IoC / DI的经验,并且在连接ServiceClientFactory我最终有2种方法为其注册一个单例: 我已经用单元测试测试了这两个版本,并且都按预期进行了验证和工作,我还没有评估速度,所以我怀疑RegisterFactory可能在后台工作。 ...

4 带RegisterInstance的从属对象

我正在使用Unity块进行Ioc实现。 我正在使用registerInstance,就是这样。 无法更改。 问题是,如果我们这样做,从属对象该怎么办? 如何处理。 可以说 可以与registerType一起使用,但是因为我们必须先创建实例 这怎么工作? 我们的顾问说, ...

6 找不到Unity Container RegisterInstance方法

我使用的是Unity 4.0.1版,我已更新为5.8.11版 在更新之前,我有这条线工作 RegisterInstance方法没有问题,因为我使用的是Microsoft.Practices.Unity命名空间。 但是,更新后,代码不再编译。 我确实进行了搜索,发现两个版本之间的兼 ...

8 与Linq to Sql DataContext的统一。 RegisterType或RegisterInstance

这是基本设置。 在ASP.Net网站上,有几个页面显示来自数据库的数据的报告。 所有数据都是通过存储过程来访问的,存储过程可以通过对SQL的Linq访问。 这些页面在不同时间可能会有很高的流量。 我们正在使用具有MVP模式的ASP.Net和Unity for IoC(尽管无论使用哪个容器 ...

9 Unity:使RegisterInstance工作实际上需要什么?

因此,我正在使用Prism和Prism.Unity来构建我的应用程序。 但是,我遇到了一个找不到文档的问题。 它可能很基本,但是错误消息却没有那么有用,堆栈跟踪也无济于事。 因此,基本上,根据我发现的文档,在注册现有对象的实例时,我应该简单地做到这一点: 我紧随其后的是,所讨论 ...

10 Unity RegisterInstance重新创建每个请求的单例

我正在尝试使用Unity将对象设置为单例,但是每次发出请求时都会创建该对象。 Unity配置 我也尝试了以下方法: 我在存储库的构造函数上放置了一个断点,每次在我的MVC应用程序中加载页面时都会调用该断点。 我发现的每个资源都说过,这些注册类型的方法应该将其创建为单例, ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM