Autofac - 使用多种实现

3 c# dependency-injection autofac asp.net-mvc-4

使用Autofac,我正在使用一个类型注册 2 个实现。并且需要按需交换实现。但它总是采用一种实现方式。

public class DataAccesss
{
    public IDatabaseHelper { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

汽车制造商

builder.RegisterType<DatabaseHelper>()
       .Named<IDatabaseHelper>("Sql")
       .WithParameter(new TypedParameter(IDatabaseHelper), new DatabaseHelper(new SqlFactory))
       .PropertiesAutowired();

builder.RegisterType<DatabaseHelper>()
       .Named<IDatabaseHelper>("Oledb")
       .WithParameter(new TypedParameter(IDatabaseHelper), new DatabaseHelper(new OleDbFactory))
       .PropertiesAutowired();
Run Code Online (Sandbox Code Playgroud)

而在控制器中,需要有这样的东西

1st - need to access `IDatabaseHelper` with `OleDb`
2nd - need to access  `IDatabaseHelper` with `Sql`
Run Code Online (Sandbox Code Playgroud)

但我的问题是IDatabaseHelper要么要么null总是采取OleDb而不是Sql

Cyr*_*and 5

当您解析单个组件时,Autofac将返回与操作匹配的最新注册组件。

如果您需要在您的实现中访问这两个服务,您可以依赖IEnumerable<IDatabaseHelper>哪个将解析所有IDatabaseHelper注册的服务。

另一种解决方案是依赖IIndex<TKey, TValue>和命名注册

public class XController 
{
    public XController(IIndex<String, IDatabaseHelper> databaseHelpers) 
    {
        this._databaseHelpers = databaseHelpers; 
    }

    private readonly IIndex<String, IDatabaseHelper> _databaseHelpers;

    public void Do()
    {
        IDatabaseHelper oledb = this._databaseHelpers["Oledb"];
    }
}
Run Code Online (Sandbox Code Playgroud)

您的注册将类似于:

builder.Register(c => new DatabaseHelper(new SqlFactory()))
       .Named<IDatabaseHelper>("Sql")
       .PropertiesAutowired();

builder.Register(c => new DatabaseHelper(new OleDbFactory()))
       .Named<IDatabaseHelper>("Oledb")
       .PropertiesAutowired();
Run Code Online (Sandbox Code Playgroud)

命名和键控服务Autofac文档的详细信息