コンテキスト
の内部クラスとしてすべてMediatRのハンドラを登録し、我々はGETALL、GetSingle、など。機能のための一般的な要求/応答/ハンドラの組み合わせを作成しました。以下は、私たちがかつてAutofacを使用してのすべての私たちRequestHandlersを登録することができないようAutofacは:私たちのMediatRコードを簡素化しようとしますが、一般的なタイプの
public class GetAll<T> where T : class
{
public class Request : IRequest<Response>
{
}
public class Response
{
public IQueryable<T> All { get; set; }
}
public class Handler : IRequestHandler<Request, Response>
{
private readonly IRepository<T> repository;
public Handler(IRepository<T> repository)
{
this.repository = repository;
}
public Response Handle(Request message)
{
return new Response
{
All = repository.GetAll()
};
}
}
}
問題
GETALLの実装を見つけることができます。
私たちが使用して私たちのAutofacモジュールにおけるハンドラの単一の特定のタイプを登録することができます:
builder.RegisterGeneric(typeof(GetAll<>.Handler)).AsImplementedInterfaces();
をしかし、我々はすべてIRequestHandler<,>
の実装(だけでなくGETALL 1)のためにこれをやりたいです。
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>));
または
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>))
.AsImplementedInterfaces();
しかし、この利回り次の例外:
Autofac.Core.Registration.ComponentNotRegisteredException文書で提案されているように私たちは
AsClosedTypesOf
機能を使って、これを試してみました: '要求されたサービス'MediatR.IRequestHandler<GetAll<T>.Request,GetAll<T>.Response>'
は登録されていません。この例外を回避するには、サービスを提供するコンポーネントを登録するか、IsRegistered()を使用してサービス登録を確認するか、ResolveOptional()メソッドを使用してオプションの依存関係を解決してください。
ここで間違っている(または忘れている)のは何ですか?
おそらく私の構造マップ実装を使用することができます。私は型(command <>、commandHandler <>、query <>、...)を指定しなければならないので、完璧ではありませんでしたが、おそらくそこから始めることができます:https://gist.github。co.jp/hudo/0e9fb466c3fac5a04aa1b77cc95490e5 –