在ASP.NET 5中注入相同接口的不同实现

时间:2016-01-26 22:24:17

标签: dependency-injection asp.net-core

在ASP.NET 5中,我有一个IRepository接口用于访问某些数据库,如下所示:

public interface IRepository {
    IQueryable<T> QueryItems(string sql);
}

public class Repository : IRepository {

    private readonly string ConnectionString;

    public Repository(string connStr) {
        // Save the injected connection string
        this.ConnectionString = connStr;
    }

    public IQueryable<T> QueryItems(string sql) {
        // Implementation ignored here
    }
}

在我的Startup.cs课程中,我正在注册IoC / DI:

services.AddTransient<IRepository>(s => new Repository("DUMMY_CONNSTR"));

如果我只有一个连接字符串,那一切都正常。但是,如果我使用存储库连接到具有不同连接字符串的2个以上不同数据库,如何注册并随后注入正确的IRepository

services.AddTransient<IRepository>(s => new Repository("DUMMY_CONNSTR"));
services.AddTransient<IRepository>(s => new Repository("DIFFERENT_CONNSTR"));

在较旧的IoC / DI系统中,我会使用“命名”实现,可以使用构造函数参数上的[Dependency("DUMMY")]属性来解析。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以采取的一种方法是注入工厂并根据您可以生成存储库的特定条件,另一种方法是使用Dispatcher,它也根据条件生成存储库,下面是我问同样问题的问题。下面的问题有两种方法,但他们正在编写.net核心的beta版本

See this question for reference and code

答案 1 :(得分:0)

您可以将StructureMap或Autofac替换为默认DI容器(有关详细说明,请参阅我的blog post)。两者都支持&#34;命名&#34;界面注册(StructureMap named instances和Autofac named and keyed services)。

此外,如果您定位dnx451,则可以使用Autofac的WithKey属性。使用博客文章中的Visual Studio示例项目,在project.json中添加以下依赖项:

"frameworks": {
  "dnx451": {
    "dependencies": {
      "Autofac.Extras.AttributeMetadata": "4.0.0"
    }
  }
},

给定一个带有以下构造函数的测试类:

public MyClass([WithKey("logging")] IRepository repository)
{
    Repository = repository;
}

您可以在ConfigureServices中注册所有内容(请注意使用WithAttributeFilter()

containerBuilder.Register(c => new Repository("DEFAULT_CONNSTR")).Keyed<IRepository>("default");
containerBuilder.Register(c => new Repository("LOGGING_CONNSTR")).Keyed<IRepository>("logging");

containerBuilder.RegisterType<MyClass>().WithAttributeFilter();