C# autofac-正在解决密钥错误的服务

C# autofac-正在解决密钥错误的服务,c#,.net,autofac,C#,.net,Autofac,我正在使用并尝试。基本思想是有两个存储库——一个连接到数据库Db1,另一个连接到数据库Db2。我正在尝试使用键控服务来指示需要哪个数据库连接 代码如下: public class Db1Repository(IDbConnection dbConnection) { // ... } public class Db2Repository(IDbConnection dbConnection) { // ... } public class ClassThatDoesSom

我正在使用并尝试。基本思想是有两个存储库——一个连接到数据库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>();
公共类Db1Repository(IDbConnection dbConnection)
{
// ...
}
公共类Db2Repository(IDbConnection dbConnection)
{
// ...
}
不满足特定要求的公共类(DB1存储库)
{
// ...
}
var builder=new ContainerBuilder();
builder.RegisterType()
.WithParameter(“connectionString”,ConfigurationManager.connectionString[“Db1”].connectionString)
.As()
.Keyed(“Db1”);
builder.RegisterType()
.As()
.WithParameter(“connectionString”,ConfigurationManager.connectionString[“Db2”].connectionString)
.Keyed(“Db2”);
builder.RegisterType()
.带参数(
新解析参数(
(pi,ctx)=>pi.ParameterType==typeof(IDbConnection),
(pi,ctx)=>ctx.resolvedkeyed(“Db1”)
)
);
RegisterType();
var container=builder.Build();
var myclass=container.Resolve();
应该发生什么: 注入不满足特殊要求的类的构造函数中的
Db1Repository
应该有一个
IDbConnection
,该连接被解析为
SqlConnection
Db1

相反,
IDbConnection
被解析为
SqlConnection
Db2

我做错了什么?

试试这个:

builder
    .RegisterType<Db1Repository>()
    .WithParameter(ResolvedParameter.ForNamed<IDbConnection>("Db1"));
builder
.RegisterType()
.WithParameter(ResolvedParameter.ForNamed(“Db1”));
试试这个:

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

如果您对每个连接注册使用
命名(“Db1”)
会发生什么?@Amy-同样的问题。我尝试了您的代码,一切正常:@CyrilDurand-谢谢您的帮助。我确实看到了它在那里的预期效果。在我的原始代码中,它仍然不起作用,但至少现在我知道它应该起作用。如果您对每个连接注册使用
命名(“Db1”)
会发生什么情况?@Amy-同样的问题。我尝试了您的代码,一切正常:@CyrilDurand-谢谢您的帮助。我确实看到了它在那里的预期效果。它在我的原始代码中仍然不起作用,但至少现在我知道它应该起作用。哇,好的。我会把答案留给别人,这样别人就不会这么建议了:(哇,好吧。我会把答案留给别人,这样别人就不会这么建议了:(