Comment enregistrer plusieurs génériques ouverts dans Autofac

Je suis nouveau sur Autofac (pas sur DI ). Voici la situation:

J’ai ces interfaces:

public interface IQuery : IQuery { } public interface IQueryHandler where TQuery : IQuery { TResult Handle(TQuery query); } 

et il y a beaucoup d’implémentation d’eux dans ma solution:

 class GetPersonQuery : IQuery { } class GetPersonQueryHandler : IQueryHandler { } class GetArticleQuery : IQuery { } class GetArticleQueryHandler : IQueryHandler { } class GetSomethingQuery : IQuery<IEnumerable> { } class GetSomethingQueryHandler : IQueryHandler<GetSomethingQuery, IEnumerable> { } 

etc. Je les enregistre actuellement comme ceci:

 builder.RegisterType() .As<IQueryHandler>(); builder.RegisterType() .As<IQueryHandler>(); builder.RegisterType() .As<IQueryHandler>(); // blah blah blah 

Comme vous pouvez le constater, j’ai plusieurs inscriptions identiques. Dans SimpleInjector (que j’utilisais auparavant), je pouvais les enregistrer tous par une seule ligne:

 container.RegisterManyForOpenGeneric( typeof(IQueryHandler), AppDomain.CurrentDomain.GetAssemblies()); 

Est-il possible de faire ce genre de choses dans Autofac ?

Vous pouvez le faire avec Autofac. Il vous suffit d’utiliser la fonctionnalité d’parsing et d’utiliser la méthode AsClosedTypesOf :

AsClosedTypesOf(open) – types de registres pouvant être assignés à une instance fermée du type générique ouvert.

Donc, votre inscription ressemblera à ceci:

 builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) .AsClosedTypesOf(typeof (IQueryHandler<,>)).AsImplementedInterfaces();