【问题标题】:Autofac - Using Multiple ImplementationAutofac - 使用多重实现
【发布时间】:2016-04-27 18:04:12
【问题描述】:

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

public class DataAccesss
{
    public IDatabaseHelper { get; set; }
}

Autofac

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

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

1st - need to access `IDatabaseHelper` with `OleDb`
2nd - need to access  `IDatabaseHelper` with `Sql`

但我的问题是IDatabaseHelper 要么是null,要么总是使用OleDb 而不是Sql

【问题讨论】:

  • 按需是什么意思?不同服务的不同实现?
  • 使用相同的服务我需要同时访问OleDbClientSqlClient
  • 如果你写成,总是取OleDb,1个接口只取SqlFactory OR OleDbFactory
  • 显然是的,但我有一个场景可以一个接一个地使用。 OleDbFactory 第 1 次和 SqlFactory 第 2 次。

标签: c# asp.net-mvc-4 dependency-injection autofac


【解决方案1】:

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

如果您需要在实现中访问这两个服务,您可以依赖IEnumerable&lt;IDatabaseHelper&gt;,它将解析所有IDatabaseHelper 注册服务。

另一种解决方案是依赖IIndex&lt;TKey, TValue&gt; 和命名注册

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"];
    }
}

您的注册将是这样的:

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

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

请参阅 Autofac 文档中的 Named and Keyed service 了解更多信息

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2012-06-16
    • 2011-10-15
    • 2016-10-02
    相关资源
    最近更新 更多