根据参数使用SingleInstance委托工厂

解雇

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

public interface IFoo
{
    void Frob();
}

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

Foo类具有一个string key在运行时未知参数。我为此创建了一个委托工厂:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章