2017-02-21 17 views
1

私の最初のIMediatR、Autofac MVCプロジェクトの問題が発生しています。ヘルプは非常に高く評価されています..事前に感謝!MediatR Autofacハンドラのコンテナへの登録

タイプ SliceProject.Services.Query.GetUserListQueryの要求でハンドラが見つかりませんでした。コンテナまたはサービス ロケータが正しく設定されていないか、ハンドラが コンテナに登録されていません。

Autofacコンテナコード:

builder 
    .RegisterAssemblyTypes(typeof(IRequest<>).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequest<>))) 
    .AsImplementedInterfaces();  

builder 
    .RegisterAssemblyTypes(typeof(IRequestHandler<,>).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>))) 
    .AsImplementedInterfaces(); 

答えて

2

あなたがIRequestHandler<TRequest, TResponse>タイプが含まれるアセンブリで見てAutofacを言っているので、です。そのタイプはMediatRアセンブリ内に存在するので、ハンドラがそのアセンブリに存在する可能性はありません。

ハンドラが定義されているアセンブリを表示するように登録する必要があります。それらがすべて1つのアセンブリで定義されている場合は、ハンドラを1つ選択してマーカータイプとして使用します。

builder 
    .RegisterAssemblyTypes(typeof(GetUserListQueryHandler).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<,>))) 
    .AsImplementedInterfaces(); 

も登録がAutofac、AsClosedTypesOfによって提供さfuncitonと簡単になることができることに注意してください:私はここにあなたのハンドラの1つの名前を推測しようとしました。それはまったく同じことをします。

builder 
    .RegisterAssemblyTypes(typeof(GetUserListQueryHandler).Assembly) 
    .AsClosedTypesOf(typeof(IRequestHandler<,>))); 

最後に、これは少し関係がありませんが、なぜあなたのリクエストをコンテナに登録しようとしていますか?要求は通常カスタムコードによって作成され、コンテナからは解決されません。あなたのケースでは、ハンドラの場合と同じ間違いをしたため、MediatRアセンブリのリクエストを探しています。実装にはIRequest<TResponse>の実装が含まれていません。

関連する問題