22

Sono nuovo su Autofac (non su DI). Ecco la situazione:Come registrare molti per open generici in Autofac

ho queste interfacce:

public interface IQuery<out TResult> : IQuery { } 

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

e c'è un sacco di implementazione di loro nella mia soluzione:

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>> { } 

e così via. Attualmente sto registrandoli in questo modo:

builder.RegisterType<GetPersonQueryHandler>() 
    .As<IQueryHandler<GetPersonQuery, PersonModel>>(); 

builder.RegisterType<GetArticleQueryHandler>() 
    .As<IQueryHandler<GetArticleQuery, ArticleModel>>(); 

builder.RegisterType<GetSomethingQueryHandler>() 
    .As<IQueryHandler<GetSomethingQuery, SomeModel>>(); 

// blah blah blah 

Come si può vedere, ho molte stesse registrazioni. In SimpleInjector (che usavo prima), ho potuto registrare tutti loro da una singola linea:

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

E 'possibile fare questa roba in Autofac?

+3

iniettore Non più semplice? Questo mi rende triste: '( – Steven

+1

Scusa): Sto lavorando con la squadra di @ Javad_Amiry (Kavand). Questo a causa del problema che Javad_Amiry ha posto prima (qui e su codeplex). Sfortunatamente in questo progetto non possiamo usare un semplice iniettore. Ma il nostro DI lib principale è ancora SimpleInjector. L'abbiamo usato in molti progetti e continueremo a usarlo. :) –

risposta

32

Si può fare questo con Autofac voi solo bisogno di utilizzare il scanning feature e utilizzare il metodo AsClosedTypesOf:

AsClosedTypesOf(open) - registrare i tipi che sono assegnabili a un'istanza chiusa del tipo generico aperta.

Quindi la tua registrazione sarà simile a questa:

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

Funziona perfettamente. Grazie mille –

+0

Hai bisogno della chiamata AsImplementedInterfaces o AsClosedTypes registra il tipo è il tipo chiuso che hai passato? – Sam

+3

@Sam se vuoi risolvere con il tipo iterface e.g con 'IQueryHandler ' allora hai bisogno di 'AsImplementedInterfaces' perché il metodo di registrazione predefinito è' AsSelf'. – nemesv

Problemi correlati