自动FAC - 正在解决错误的键控服务

本文关键字:服务 错误 解决 FAC 自动 | 更新日期: 2023-09-27 17:55:46

我正在使用autofac并尝试按上下文选择服务实现。 基本思想是有两个存储库 - 一个连接到数据库 Db1,另一个连接到数据库 Db2。 我正在尝试使用键控服务来指示需要哪个数据库连接。

代码如下:

public class Db1Repository(IDbConnection dbConnection) 
{
    // ...
}
public class Db2Repository(IDbConnection dbConnection) 
{
    // ...
}
public class ClassThatDoesSomethingSpecial(Db1Repository repository) 
{
    // ...
}
var builder = new ContainerBuilder();
builder.RegisterType<SqlConnection>()
       .WithParameter("connectionString",ConfigurationManager.ConnectionStrings["Db1"].ConnectionString)
       .As<IDbConnection>()
       .Keyed<IDbConnection>("Db1");
builder.RegisterType<SqlConnection>()
       .As<IDbConnection>()
       .WithParameter("connectionString", ConfigurationManager.ConnectionStrings["Db2"].ConnectionString)
       .Keyed<IDbConnection>("Db2");
builder.RegisterType<Db1Repository>()
       .WithParameter(
            new ResolvedParameter(
                (pi, ctx) => pi.ParameterType == typeof(IDbConnection),
                (pi, ctx) => ctx.ResolveKeyed<IDbConnection>("Db1")
            )
       );
builder.RegisterType<ClassThatDoesSomethingSpecial>();
var container = builder.Build();
var myclass = container.Resolve<ClassThatDoesSomethingSpecial>();

应该发生什么:注入到 ClassThatDoesSomethingSpecial 构造函数中的Db1Repository应具有解析为 Db1 SqlConnectionIDbConnection

相反,IDbConnection解析为 Db2SqlConnection

我做错了什么?

自动FAC - 正在解决错误的键控服务

试试这个:

builder
    .RegisterType<Db1Repository>()
    .WithParameter(ResolvedParameter.ForNamed<IDbConnection>("Db1"));

https://autofac.org/apidoc/html/CF9E2168.htm