如何在Autofac中注册许多开放式通用
我是Autofac的新手 (不是DI )。 情况如下:
我有这些接口:
public interface IQuery : IQuery { } public interface IQueryHandler where TQuery : IQuery { TResult Handle(TQuery query); }
在我的解决方案中有很多实现:
class GetPersonQuery : IQuery { } class GetPersonQueryHandler : IQueryHandler { } class GetArticleQuery : IQuery { } class GetArticleQueryHandler : IQueryHandler { } class GetSomethingQuery : IQuery<IEnumerable> { } class GetSomethingQueryHandler : IQueryHandler<GetSomethingQuery, IEnumerable> { }
等等。 我正在注册这样的:
builder.RegisterType() .As<IQueryHandler>(); builder.RegisterType() .As<IQueryHandler>(); builder.RegisterType() .As<IQueryHandler>(); // blah blah blah
如您所见,我有很多相同的注册。 在SimpleInjector
(我之前使用过)中,我可以通过一行注册所有这些:
container.RegisterManyForOpenGeneric( typeof(IQueryHandler), AppDomain.CurrentDomain.GetAssemblies());
是否可以在Autofac中执行此操作 ?
您可以使用Autofac执行此操作,只需使用扫描function并使用AsClosedTypesOf
方法:
AsClosedTypesOf(open)
– 可分配给开放generics类型的封闭实例的寄存器类型。
所以你的注册将如下所示:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) .AsClosedTypesOf(typeof (IQueryHandler<,>)).AsImplementedInterfaces();