我有以下类暴露公共工厂方法而不是公共构造函数:
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());
注入此依赖项的所有组件也配置为瞬态。
当依赖于它的对象超出范围时,容器是否会处置此依赖关系,或者这种依赖关系是否会被丢弃并使一切都停留在一起?
答案 0 :(得分:2)
如果出现以下情况,将予以处理:
IDisposable
,它目前没有,和 Container.Release()
。您不能简单地依赖超出范围处理的组件来触发。
如果您指的是垃圾收集而不是处置,那么当当对象超出范围时,您的当前实现可能会正常运行。在大多数情况下,容器不会跟踪未实现IDisposable的瞬态组件,但它可能取决于您在容器中使用的其他设施。因此,最好确保调用Release
。
答案 1 :(得分:1)
关注静态方法吗?如果是这样,那不应该导致标记未使用的对象以进行处置的问题。我不确定我会使用这种模式,但是我没有看到你帖子中模式的全部动机,所以我无法判断。
如果这是一个Singleton(通过静态方法提供的静态变量),你就不会处理,但这就是模式的意图。
如果您看到内存使用量增加并担心内存泄漏,从而提出问题,您可以深入挖掘,但更有可能您只是看到.NET的运行方式。处理发生在需要内存时,因此看起来.NET似乎保留在内存上就好像是内存泄漏一样。在几乎所有情况下,我都调查了那些认为存在内存泄漏的客户,只是.NET在处理内存之前不会处理对象(默认行为)。
如果您发现潜在问题,可以通过各种方法探测.NET中的内存泄漏。我建议使用工具而不是挖掘dumpheap,但在某些情况下,某些工具的定价可能过高。如果你只是需要安心,你没有造成内存泄漏,你可以使用各种产品的试用。