【发布时间】:2017-10-11 17:29:45
【问题描述】:
我在处理 DI 容器中不必要的对象时遇到问题。我将 Prism 用于带有 Unity 容器的 Xamarin.Forms。
应用程序从某个数据库获取配置,使用此配置创建一些服务,并使用 ContainerControlledLifetimeManager 在容器中注册这些服务。在解析视图和视图模型时使用此服务。 当配置更改应用程序再次检索更改的配置时,现在问题来了:如何删除以前的注册并注册新服务?如果我只是重新注册服务,那么在处置容器之前,之前的服务不会被 GC 处理。
我无法处置容器,因为它是由 Prism 创建和管理的(我可以吗?)。
我不能使用子容器,因为 Prism 不会使用子容器解析视图和视图模型(可以吗?)
我应该使用不同的 DI 吗? Autofac 或其他 DI 是否支持这种方法?
编辑:
我刚刚测试了在 Unity 中处理重新注册的对象。结果是重新注册使用:
Container.RegisterType<IFoo, Foo>(new ContainerControlledLifetimeManager())
真正释放以前注册的对象。但我也有注册,只需输入:
Container.RegisterType<Foo>(new ContainerControlledLifetimeManager())
或使用实例:
Container.RegisterInstance(new Foo())
并且这些对象在重新注册时不会被释放。
所以现在唯一的解决办法是重建 Unity 容器?或者试试其他ioc容器?
【问题讨论】:
-
使用 Unity,重新注册会覆盖之前的注册。 Unity 没有取消注册的概念,因此这是一个选项。 Could be interesting to you; Other SO ref
-
@R.Richards 重新注册是否会导致处置以前注册的对象?会被 GC 编辑吗?
-
只要您的任何代码不维护对先前注册对象的引用,就应该进行 GC-ed。您是否对当前的注册使用任何生命周期管理?
-
正如我所写,我使用 ContainerControlledLifetimeManager - 我知道这个管理器会保留对象直到容器被处置。
-
如果需要的话,即使是那个也可以被覆盖。我认为重新注册是安全的。虽然,我想不出一个好的方法来验证/测试它是 100% 确定的。
标签: c# unity-container prism autofac