C# Autofac键控工厂:不同枚举值的相同具体实现

C# Autofac键控工厂:不同枚举值的相同具体实现,c#,autofac,factory,C#,Autofac,Factory,我想使用autofac的内置IIndex创建一个字段验证器工厂,该工厂将接收一个枚举值并返回一个IFieldValidator。 我的验证工厂应该根据提供的令牌类型枚举值返回FieldValidator或ConditionalFieldValidator的具体实现 Service User Candidate Unknown 当令牌类型为服务时,我想返回ConditionalFieldValidator;当令牌类型为用户、候选或未知时,我想返回FieldValidator ContainerB

我想使用autofac的内置IIndex创建一个字段验证器工厂,该工厂将接收一个枚举值并返回一个IFieldValidator。 我的验证工厂应该根据提供的令牌类型枚举值返回FieldValidator或ConditionalFieldValidator的具体实现

Service
User
Candidate
Unknown
当令牌类型为
服务时,我想返回ConditionalFieldValidator;当令牌类型为
用户、候选或未知时,我想返回FieldValidator

ContainerBuilder的键控方法似乎只接受一个参数,这迫使我像这样注册组件:

builder.RegisterType<ConditionalFieldValidator>().Keyed<IFieldValidator>(TokenType.Service);
builder.RegisterType<FieldValidator>().Keyed<IFieldValidator>(TokenType.User);
builder.RegisterType<FieldValidator>().Keyed<IFieldValidator>(TokenType.Candidate);
builder.RegisterType<FieldValidator>().Keyed<IFieldValidator>(TokenType.Unknown);
builder.RegisterType().Keyed(TokenType.Service);
builder.RegisterType().Keyed(TokenType.User);
builder.RegisterType().Keyed(TokenType.Candidate);
builder.RegisterType().Keyed(TokenType.Unknown);
有没有更好的方法不重复FieldValidator注册?如果能够将多个令牌类型传递给键控方法就好了

编辑 我最终创建了一个扩展方法,其中包含了Alistair和Cyril的答案

public static ContainerBuilder RegisterTypeKeyed<TConcrete, TAbstract>(this ContainerBuilder containerBuilder, params object[] values)
{
    var registration = containerBuilder.RegisterType<TConcrete>();
        
    foreach(var value in values)
        registration.Keyed<TAbstract>(value);

    return containerBuilder;
}
publicstaticcontainerbuilder注册表类型为keyed(此ContainerBuilder ContainerBuilder,参数对象[]值)
{
var registration=containerBuilder.RegisterType();
foreach(值中的var值)
注册。键入(值);
返回集装箱船;
}
这允许您在容器工厂的一行中注册键控组件

builder.RegisterTypeKeyed<ConditionalFieldValidator, IFieldValidator>(AuthTokenType.Service);
builder.RegisterTypeKeyed<FieldValidator, IFieldValidator>(AuthTokenType.Candidate, AuthTokenType.Unknown, AuthTokenType.User);
builder.RegisterTypeKeyed(AuthTokenType.Service);
RegisterTypeKeyed(AuthTokenType.Candidate,AuthTokenType.Unknown,AuthTokenType.User);

您应该能够将多个
键控的
调用堆叠到注册上(就像您可以使用
As
),如下所示:

builder.RegisterType<FieldValidator>().Keyed<IFieldValidator>(TokenType.User)
                                      .Keyed<IFieldValidator>(TokenType.Candidate)
                                      .Keyed<IFieldValidator>(TokenType.Unknown);
builder.RegisterType().Keyed(TokenType.User)
.Keyed(令牌类型.Candidate)
.Keyed(令牌类型未知);

这保持了
字段验证程序组件的相同注册(包括任何实例共享行为),但注册了多个服务

您应该能够将多个
键控的
调用堆叠到注册上(就像您可以使用
As
那样):

builder.RegisterType<FieldValidator>().Keyed<IFieldValidator>(TokenType.User)
                                      .Keyed<IFieldValidator>(TokenType.Candidate)
                                      .Keyed<IFieldValidator>(TokenType.Unknown);
builder.RegisterType().Keyed(TokenType.User)
.Keyed(令牌类型.Candidate)
.Keyed(令牌类型未知);

这将保持对
FieldValidator
组件的相同注册(包括任何实例共享行为),但注册多个服务

您可以将一个组件注册到多个服务

builder.RegisterType<FieldValidator>()
       .Keyed<IFieldValidator>(TokenType.User)
       .Keyed<IFieldValidator>(TokenType.Candidate)
       .Keyed<IFieldValidator>(TokenType.Unknown);
builder.RegisterType()
.Keyed(令牌类型.User)
.Keyed(令牌类型.Candidate)
.Keyed(令牌类型未知);

它将导致一次向多个关联服务注册。

您可以向多个服务注册组件

builder.RegisterType<FieldValidator>()
       .Keyed<IFieldValidator>(TokenType.User)
       .Keyed<IFieldValidator>(TokenType.Candidate)
       .Keyed<IFieldValidator>(TokenType.Unknown);
builder.RegisterType()
.Keyed(令牌类型.User)
.Keyed(令牌类型.Candidate)
.Keyed(令牌类型未知);
它将导致一次注册多个关联服务