autofacc按名称解析依赖服务
本文关键字:依赖 服务 autofacc | 更新日期: 2023-09-27 18:05:23
是否有可能注册单个服务,该服务具有可以根据设置更改的依赖项?
例如一个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
本身没有注册密钥,如果我尝试正常的解析,它不会工作,因为它不能创建依赖的服务。
基本上我只是想要一个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"
您将无法操纵它来解析命名的IDbExecutor
,因为您没有将其注册为命名。这也可能不是最好的主意,因为它意味着IDbExecutor
不知何故"知道"它的依赖关系,这是它不应该知道的——实现知道,但接口/服务不知道——也不应该知道。
您可以通过更新SqlExecutor
来使用Autofac中的IIndex<X,B>
关系来获得接近您想要的东西。在构造函数中,不要只接受一个IDbConnection
,而是接受一个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
创建委托工厂,该工厂接受作业类型并自动选择正确的命名服务。这有点复杂,所以请查看文档中的示例