gpt4 book ai didi

c# - 根据参数使用 SingleInstance 委托(delegate)工厂

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:07 24 4
gpt4 key购买 nike

我有一个接口(interface)和一个类,我想为其创建实例:

public interface IFoo
{
void Frob();
}

public class Foo : IFoo
{
public Foo(string key)
{
}
}

Foo 类有一个 string key 参数,它在运行时是未知的。我为此创建了一个委托(delegate)工厂:

public delegate IFoo FooFactory(string key);

我想注册 Foo 以便它具有 SingleInstance 范围,但我希望它是基于 key 参数的 SingleInstance。

var foo1 = fooFactory("abc");  // new instance
var foo2 = fooFactory("abc"); // same instance as foo2
var foo3 = fooFactory("def"); // new instance
var foo4 = fooFactory("def"); // same instance as foo4

我可以用 Autofac 做到这一点吗?

最佳答案

您可以创建一个工厂类,它将根据参数创建实例。

public class FooFactory : IFooFactory
{
public delegate IFoo FooBuilder(String key);

public FooFactory(FooBuilder fooBuilder)
{
this._fooBuilder = fooBuilder;
this._foos = new ConcurrentDictionary<String, IFoo>();
}

private readonly FooBuilder _fooBuilder;
private readonly ConcurrentDictionary<String, IFoo> _foos;

public IFoo Get(String key)
{
IFoo foo = this._foos.GetOrAdd(key, k => this._fooBuilder(k));
return foo;
}
}

然后像这样注册:

builder.RegisterType<Foo>()
.As<IFoo>();
builder.RegisterType<FooFactory>()
.As<IFooFactory>()
.SingleInstance();
builder.Register<Func<String, IFoo>>(c => c.Resolve<IFooFactory>().Get)
.As<Func<String, IFoo>>();

然后解析得到一个IFoo你可以依靠 Func<String, IFoo>

c.Resolve<Func<String, IFoo>>()("a"); 

关于c# - 根据参数使用 SingleInstance 委托(delegate)工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37869295/

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