是否可以注册具有可根据设置更改的依赖项的单个服务?
例如
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"
答案 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。