我有一个接口(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/