22

Jestem nowy w Autofac (nie na DI). Oto sytuacja:Jak zarejestrować wiele otwartych generycznych w Autofac

mam te interfejsy:

public interface IQuery<out TResult> : IQuery { } 

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

i istnieje wiele realizacji z nich w moim rozwiązanie:

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

i tak dalej. Obecnie rejestruję je w następujący sposób:

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

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

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

// blah blah blah 

Jak widać, mam wiele takich samych rejestracji. W SimpleInjector (którego używałem wcześniej), mogę zarejestrować je wszystkie w jednym wierszu:

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

Czy można zrobić te rzeczy w Autofac?

+3

Nie prostsze Injector? To mnie denerwuje: "( – Steven

+1

Przepraszam): Pracuję z zespołem @ Javad_Amiry (Kavand). Jest tak z powodu problemu Javad_Amiry wcześniej (tutaj i na codeplex). Niestety w tym projekcie nie możemy użyć prostego wtryskiwacza. Ale naszą główną DI lib wciąż jest SimpleInjector. Wykorzystaliśmy go w wielu projektach i będziemy go nadal używać. :) –

Odpowiedz

32

Można to zrobić z Autofac wystarczy użyć scanning feature i użyć metody AsClosedTypesOf:

AsClosedTypesOf(open) - register rodzajów, które są przypisane do zamkniętej instancji otwartego typu rodzajowego.

Więc rejestracja będzie wyglądać następująco:

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

Działa idealnie. Wielkie dzięki –

+0

Czy potrzebujesz wywołania AsImplementedInterfaces lub czy AsClosedTypes rejestruje typ zamknięty typ u? – Sam

+3

@Sam jeśli chcesz rozwiązać z typem iterface np. Z 'IQueryHandler ' to potrzebujesz 'AsImplementedInterfaces' ponieważ domyślną metodą rejestracji jest' AsSelf'. – nemesv

Powiązane problemy