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

标签 c# autofac

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

相关文章:

c# - RESTful/基于 token 的 Web API 身份验证而不是 Web Security.Login

c# - 在 C#/WPF 中加速 L-System 渲染器

c# - 将 LINQ 用于 CSV 数据

ioc-container - 使用 AutoFac 2 避免服务定位器

asp.net-mvc-3 - 带有 Autofac 简单网格绑定(bind)的 DevExpress

C# 字典内部数组大小

c# - 使用递归和泛型创建快速排序

Autofac 范围生命周期问题

c# - 为什么在使用 Prism EventAggregator 时没有调用我的订阅方法?

c# - 使用 Autofac 2 和命名注册的构造函数注入(inject)