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