C# 防止Autofac保存一次性实例

C# 防止Autofac保存一次性实例,c#,memory-leaks,autofac,C#,Memory Leaks,Autofac,我在Autofac创建内存泄漏时遇到问题。 经过一些调查,我得出结论,内存泄漏是Autofac持有一次性实例的结果。 因此,有两种方法可以解决这种情况: 1.处置范围 2.解析/注册时使用Owned/ExternalyOwned()语法 第一个问题是我们根本不使用(除了非常具体的小的子案例)范围,所有的注册和解析都是在一个“全局”范围内完成的,而这个“全局”范围从未处理过。我们不想使用定位器反模式,所以基本上我们有一个顶级的“解析”,就是这样,所以作用域不是一个选项 second(我现在选择它作

我在Autofac创建内存泄漏时遇到问题。 经过一些调查,我得出结论,内存泄漏是Autofac持有一次性实例的结果。 因此,有两种方法可以解决这种情况: 1.处置范围 2.解析/注册时使用Owned/ExternalyOwned()语法

第一个问题是我们根本不使用(除了非常具体的小的子案例)范围,所有的注册和解析都是在一个“全局”范围内完成的,而这个“全局”范围从未处理过。我们不想使用定位器反模式,所以基本上我们有一个顶级的“解析”,就是这样,所以作用域不是一个选项

second(我现在选择它作为临时解决方案)的问题是,我们希望我们的代码尽可能是通用的IOC,而不是与Autofac绑定,因此拥有内部构造函数不是一个选项(毕竟,我们使用Autofac的主要原因之一不只是IOC,而是通过Fakeitesy或Mock在没有Autofac的情况下单元测试类的能力),这将强制将.ExternallyOwned()放在可创建为瞬态(.InstancePerDependency()或default)的一次性类的每个注册上。由于这变得很难跟踪,而且类和它们的用法可能会改变,这基本上意味着我在每个注册中都添加了.externalyOwned(),这是可以的,但相当不方便

所以我的问题是-有没有办法全局禁用此功能(基本上每个类都注册,默认情况下注册为.ExternallyOwned())? 或者也许我没有考虑过这个问题的另一个解决方案


谢谢。

从技术上讲,造成内存泄漏的不是Autofac。这是Autofac的错误用法。创建作用域并处理它们是唯一真正的解决方案(尽管这可能需要大量工作)

如果你想使用外部拥有,你可以考虑通过创建一个扩展方法来简化它。通过在所有文件中进行简单的查找+替换,您可以使用新方法

public static IRegistrationBuilder<TImplementer, ConcreteReflectionActivatorData, SingleRegistrationStyle> 
    RegisterTypeAsExternallyOwned<TImplementer>(this ContainerBuilder builder)
{
    return builder.RegisterType<TImplementer>().ExternallyOwned();
}
公共静态IRegistrationBuilder
RegisterTypeAseExternallyowned(此ContainerBuilder生成器)
{
返回builder.RegisterType().ExternallyOwned();
}
我是在浏览器中编写的,所以我不完全确定它将如何编译。但这是我能想到的唯一选择


当心外表上的失态。它将阻止Autofac保留对这些对象的引用,但这确实意味着您必须自己处理这些实例。

使用ExternallyOwned()我有一个改进之处-它仅适用于瞬态实例,例如.SingleInstance(),这并不重要,而如果使用.InstancePerScope())或者命名范围,您将真正使用范围并知道自己在做什么
当然,您必须自己处理ExternalyOwned()实例,但无论如何,您都应该这样做,甚至在将Autofac引入代码之前,