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();