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。
当您解析单个组件时,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文档的详细信息
| 归档时间: |
|
| 查看次数: |
4010 次 |
| 最近记录: |