Autofac 2的强大参考

时间:2011-02-02 07:57:39

标签: autofac

新手在这里,对不起,如果这是一个显而易见的问题。

我已阅读此页: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。

是吗?

谢谢!

1 个答案:

答案 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将不会处置任何已解析的实例 - 您可以自行管理它。

请查看Nicholas Blumhardt's article on lifetimes了解详情。