26

私はAutofacが初めてです(DIではありません)。状況は次のとおりです。

私はこれらのインターフェースを持っています:

public interface IQuery<out TResult> : IQuery { }

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

そして、私のソリューションにはそれらの多くの実装があります:

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

等々。現在、次のように登録しています。

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

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

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

// blah blah blah

ご覧のとおり、同じ登録がたくさんあります。(SimpleInjector以前使用していた) では、それらすべてを 1 行で登録できました。

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

Autofacでこのようなことを行うことは可能ですか?

4

2 に答える 2

44

Autofac でこれを行うことができます。スキャン機能を使用し、次のAsClosedTypesOf方法を使用するだけです。

AsClosedTypesOf(open)- オープン ジェネリック型のクローズド インスタンスに割り当て可能な型を登録します。

したがって、登録は次のようになります。

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .AsClosedTypesOf(typeof (IQueryHandler<,>)).AsImplementedInterfaces();
于 2013-05-26T11:09:18.327 に答える