如何在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();