Autofac按名称

时间:2015-07-30 05:04:07

标签: c# inversion-of-control autofac

是否可以注册具有可根据设置更改的依赖项的单个服务?

例如

DBExecutor需要一个不同的DBconnection对象,具体取决于它所运行的地理区域。

我尝试过像

这样的事情
builder.RegisterType<DbConnection>().Named<IDbConnection>("US")
builder.RegisterType<DbConnection>().Named<IDbConnection>("AU")
builder.RegisterType<SqlExecutor>().As<IDbExecutor>();

我想用

之类的东西解决服务问题
var au = container.ResolveNamed<IDbExecutor>("AU");
var us = container.ResolveNamed<IDbExecutor>("US");

但是这不起作用,因为IDbExecutor本身没有用密钥注册,如果我尝试正常的Resolve,它就无法工作,因为它无法创建依赖服务。

基本上我只想要一个基于某个参数的IDbExecutor DBConnection的实例。

我试图在更广泛的意义上做这件事,所以我试图避免使用任何具体的代码。

我没有使用键控服务的当前通用代码如

var job = (IJob) lifetimeScope.Resolve(bundle.JobDetail.JobType);

其中JobType是一个类Type并且取决于是否可能,最终版本看起来像

 var job = (IJob) lifetimeScope.Resolve(bundle.JobDetail.JobType, bundle.JobDetail.JobDataMap["Region"]);

其中bundle.JobDetail.JobDataMap["Region"]会返回"AU""US"

1 个答案:

答案 0 :(得分:1)

您无法通过它来解决命名IDbExecutor,因为您没有将其注册为已命名的IDbExecutor。它也可能不是最好的主意,因为它意味着SqlExecutor以某种方式&#34;知道&#34;关于它的依赖性,它不应该 - 实现知道,但接口/服务不是 - 并且不应该。

通过更新IDbConnection以使用the IIndex<X,B> relationship in Autofac,您可以获得与您想要的内容接近的内容。不要只在构造函数中使用IIndex<string,IDbConnection>,而是选择public class SqlExecutor { private IIndex<string, IDbConnection> _connections; public SqlExecutor(IIndex<string, IDbConnection> connections) { this._connections = connections; } public void DoWork(string jobType) { var connection = this._connections[jobType]; // do something with the connection } }

当您需要获取连接时,请使用作业类型从索引字典中查找:

SqlExecutor

另一种方法是create a delegate factory获取作业类型的<div>并自动选择正确的命名服务。这更加复杂,check out the documentation for an example