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

其中JobTypeType类,取决于这是否可能,最终版本看起来像

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

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

autofacc按名称解析依赖服务

您将无法操纵它来解析命名的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创建委托工厂,该工厂接受作业类型并自动选择正确的命名服务。这有点复杂,所以请查看文档中的示例