新手在这里,对不起,如果这是一个显而易见的问题。
我已阅读此页:http://code.google.com/p/autofac/wiki/NewInV2
在Autofac 1中,容器保留弱引用。如果被引用的对象使用dispos来释放GC / finalizer资源,这是有道理的,但如果dispose方法包含应用程序逻辑,则GC时序可能会引入意外行为。
Autofac 2保存正常参考。要手动选择退出此行为并管理处理,请使用ExternallyOwned注册修改器。
这是否意味着当我需要将由Autofac解析的对象释放到GC时,我不能简单地说:
a = null;
因为Autofac拥有对该对象的强引用。相反,我应该使用Owned<>:
public class MyClass
{
public MyClass(Owned<A> a)
{
a.Value.Dosomething();
a.Dispose();
}
}
或使用ExternallyOwned注册修饰符:
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).ExternallyOwned();
稍后,我应该可以使用a = null将对象释放到GC。
是吗?
谢谢!
答案 0 :(得分:3)
默认情况下,您不需要处置任何内容 - Autofac将自动识别并处置在处置其包含的生命周期范围时创建的任何IDisposable
个实例。
如果您有理由手动管理对象的生命周期,则只需使用Owned<T>
或ExternallyOwned()
。如果您解析了Owned<T>
,那么您应该自己调用t.Dispose()
- 常见的使用模式是依赖工厂代理:
public class MyClass
{
private Func<Owned<User>> myDisposableFactory;
public MyClass(Func<Owned<User>> myDisposableFactory)
{
this.myDisposableFactory = myDisposableFactory;
}
public void DoSomething()
{
using (var disposable = this.myDisposableFactory())
{
// ...
disposable.Dispose();
}
}
}
如果您将类型注册为ExternallyOwned()
,则当包含的生命周期范围结束时,Autofac将不会处置任何已解析的实例 - 您可以自行管理它。