gpt4 book ai didi

c# - AutoFac 委托(delegate)工厂和生命周期范围

转载 作者:行者123 更新时间:2023-12-03 20:19:40 26 4
gpt4 key购买 nike

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

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

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

http://nblumhardt.com/2011/01/an-autofac-lifetime-primer/说明委托(delegate)工厂创建的组件与委托(delegate)工厂放在相同的生命周期范围内。

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

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);
}
}
}
}

最佳答案

编辑:
如果您不想使用自动生成的工厂,您可以关注 Delegate Factories

namespace FactoryTest
{
class Component : IDisposable
{
public delegate Component Factory(int i);
public Component(int i) { Console.WriteLine(i); }

public void Dispose()
{
Console.WriteLine("Component disposed");
}
}

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

builder.RegisterType<Component>().AsSelf();

IContainer root = builder.Build();

using (ILifetimeScope lf = root.BeginLifetimeScope())
{
var compDelegatefac = lf.Resolve<Component.Factory>();
Component cmp = compDelegatefac(2);
}
GC.Collect();

Console.Read();
}
}
}

关于c# - AutoFac 委托(delegate)工厂和生命周期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36768840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com