AutoFac 委托工厂和生命周期范围

Mar*_*lta 5 c# autofac

我在我的应用程序中使用委托工厂。那是因为我使用 AutoFac 创建的组件使用需要一些参数的服务类。

我想做的下一件事是使用 AutoFacs 生命周期范围机制正确清理这些服务并释放资源。然而问题是,当我使用委托工厂创建组件时,它们似乎没有被放入生命周期范围,并且在处置生命周期范围后不会调用 Dispose。

我想避免使用通用的 Owned<>,因为我不想将我的应用程序绑定到特定的 IOC。

http://nblumhardt.com/2011/01/an-autofac-lifetime-primer/中解释了委托工厂创建的组件被放入与委托工厂相同的生命周期范围中。

我写了一个小程序来演示这一点。在此程序中,我希望调用 Dispose 函数。不幸的是这并没有发生。我想念这里吗?下面的代码有什么问题吗?如何确保委托工厂生产的组件被放入委托工厂的生命周期范围内?

using Autofac;
using Autofac.Core;
using System;

namespace FactoryTest
{
class Component : IDisposable
{
    public Component(int i) { }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();

        builder.Register<Func<int, Component>>(c => (x) =>
        {
            // code that is important and that should run
            // inside the delegate factory.
            return new Component(x);
            });

        IContainer root = builder.Build();

        using (ILifetimeScope lf = root.BeginLifetimeScope())
        {
            Func<int, Component> compDelegatefac = lf.Resolve<Func<int, Component>>();
            Component cmp = compDelegatefac(2);
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

MaK*_*MKo 0

在您的示例中,Lifetime Scope 效果很好。

在您的代码中,您为委托注册了一个工厂。这意味着它将处置 的对象Func<int, Component>,但不会为您处置Component(因为它是由Func,而不是由Autofac)创建的。

这是一个示例(调用 Dispose):

void Main()
{
    var builder = new ContainerBuilder();

    builder.Register<Component>(c=>new Component(123));

    IContainer root = builder.Build();

    using (ILifetimeScope lf = root.BeginLifetimeScope())
    {
        var comp = lf.Resolve<Component>();     
    }
}

class Component : IDisposable
{
    public Component(int i) { }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,它创建一个实例,Component然后(一旦LifetimeScope结束)调用Dispose它。

编辑:

void Main()
{
    var builder = new ContainerBuilder();

    builder.Register<Component>(c => new Component(123));
    builder.RegisterType<ComponentUser>().AsSelf();

    IContainer root = builder.Build();

    using (ILifetimeScope lf = root.BeginLifetimeScope())
    {
        var comp = lf.Resolve<ComponentUser>();
    }
}

class ComponentUser
{
    Component Component { get; set;}

    public ComponentUser(Func<Component> func) 
    {
        Component = func();
    }
}

class Component : IDisposable
{
    public Component(int i) { }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是它的工作原理。