如何解决Autofac Keyed Factory:不同枚举值的相同具体实现 编辑
我想使用 autofac 的内置 IIndex
Service
User
Candidate
Unknown
当令牌类型为 Service
时我想返回一个 ConditionalFieldValidator,当令牌类型为 User,Candidate or Unknown
时我想返回一个 FieldValidator
看起来 ContainerBuilder 的 Keyed 方法只接受一个参数,这迫使我像这样注册组件:
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);
有没有更好的方法来做到这一点,而不是重复 FieldValidator 注册?能够将多种令牌类型传递给 Keyed 方法会很好。
编辑
我最终创建了一个包含 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;
}
这允许您在容器工厂的一行中注册您的键控组件。
builder.RegisterTypeKeyed<ConditionalFieldValidator,IFieldValidator>(AuthTokenType.Service);
builder.RegisterTypeKeyed<FieldValidator,IFieldValidator>(AuthTokenType.Candidate,AuthTokenType.Unknown,AuthTokenType.User);
解决方法
您应该能够将多个 Keyed
调用堆叠到注册上(就像使用 As<T>
一样),如下所示:
builder.RegisterType<FieldValidator>().Keyed<IFieldValidator>(TokenType.User)
.Keyed<IFieldValidator>(TokenType.Candidate)
.Keyed<IFieldValidator>(TokenType.Unknown);
这会保持 FieldValidator
组件 的相同注册(包括任何实例共享行为),但注册多个服务。
您可以将一个组件注册到多个服务
builder.RegisterType<FieldValidator>()
.Keyed<IFieldValidator>(TokenType.User)
.Keyed<IFieldValidator>(TokenType.Candidate)
.Keyed<IFieldValidator>(TokenType.Unknown);
这将导致一个注册多个相关服务。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。