registerassemblymodules net injection dependency containerbuilder c# dependency-injection inversion-of-control autofac open-generics

c# - net - Cómo registrarse para abrir muchos genéricos en Autofac



autofac resolve (1)

Puede hacer esto con Autofac, solo necesita usar la función de escaneo y usar el método AsClosedTypesOf :

AsClosedTypesOf(open) : registra los tipos que se pueden asignar a una instancia cerrada del tipo genérico abierto.

Entonces su registro se verá así:

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

Soy nuevo en Autofac (no en DI ). Aquí está la situación:

Tengo estas interfaces:

public interface IQuery<out TResult> : IQuery { } public interface IQueryHandler<in TQuery, out TResult> where TQuery : IQuery<TResult> { TResult Handle(TQuery query); }

y hay una gran cantidad de implementación de ellos en mi solución:

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

y así. Actualmente los estoy registrando así:

builder.RegisterType<GetPersonQueryHandler>() .As<IQueryHandler<GetPersonQuery, PersonModel>>(); builder.RegisterType<GetArticleQueryHandler>() .As<IQueryHandler<GetArticleQuery, ArticleModel>>(); builder.RegisterType<GetSomethingQueryHandler>() .As<IQueryHandler<GetSomethingQuery, SomeModel>>(); // blah blah blah

Como puede ver, tengo muchos registros iguales. En SimpleInjector (que estaba usando antes), podría registrarlos todos en una sola línea:

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

¿Es posible hacer esto en Autofac ?