通过.UsingFactoryMethod解析但未使用内核显式解析的瞬态依赖项的生存期是多少
本文关键字:依赖 多少 生存期 UsingFactoryMethod 未使用 内核 核显 通过 | 更新日期: 2023-09-27 18:20:11
我有以下类,它公开了一个公共工厂方法而不是公共构造函数:
public class SomeDependency
{
private readonly string _someValue;
private SomeDependency(string someValue)
{
_someValue = someValue;
}
public static SomeDependency CreateSomeDependency(string someValue)
{
return new SomeDependency(someValue);
}
}
我在容器中配置它,使其具有短暂的生活方式,并通过静态方法创建:
Container.Register(Component.For<SomeDependency>()
.UsingFactoryMethod(k => SomeDependency.CreateSomeDependency("a value"))
.LifestyleTransient());
将此依赖项注入的所有组件也配置为瞬态组件。
当依赖它的对象超出范围时,容器会处理这个依赖项吗?还是这个依赖项无法处理并使所有内容都保留下来?
如果:
- 它实现了
IDisposable
,而它目前没有,和 - 组合根调用导致SomeDependency实例化的组件的
Container.Release()
不能简单地依赖超出范围的组件来触发处置。
如果您指的是垃圾收集而不是处理,那么您当前的实现可能可以正常工作,当对象超出范围时,它将可用于GC。在大多数情况下,容器不会跟踪不实现IDisposable的瞬态组件,但这可能取决于您在容器中使用的其他设施。因此,最好始终确保调用Release
。
关注的是静态方法吗?如果是这样的话,那么标记未使用的对象以进行处理就不会产生问题。我不确定我是否会使用这种模式,但我看不出你帖子中这种模式的全部动机,所以我无法判断。
如果这是一个Singleton(通过静态方法提供的静态变量),则不会进行处置,但这将是模式的意图。
如果您看到内存使用量增长,并担心内存泄漏,因此提出了这个问题,您可以更深入地了解,但更可能的是,您只是看到了.NET是如何运行的。在需要内存时会进行处理,所以看到.NET像内存泄漏一样抓住内存是很正常的。在我调查过的几乎每一个认为存在内存泄漏的客户端的案例中,都只是.NET在需要内存之前不处理对象(默认行为)。
如果你看到了一个潜在的问题,有一些方法可以探测.NET中的内存泄漏。我建议使用一个工具,而不是通过dumpmap进行挖掘,但在某些情况下,某些工具的定价可能会过高。如果你只是需要安心,没有造成内存泄漏,你可以使用各种产品的试用版。