web-dev-qa-db-ja.com

ASP.NET Core MediatRエラー:コンテナーにハンドラーを登録します

.Net Coreアプリがあり、そこで_.AddMediatR_拡張機能を使用して、CQRSアプローチに従ってコマンドとハンドラーのアセンブリを登録します。

Startup.csのConfigureServicesで、公式パッケージ_MediatR.Extensions.Microsoft.DependencyInjection_の拡張メソッドを次のパラメーターとともに使用しました。

_services.AddMediatR(typeof(AddEducationCommand).GetTypeInfo().Assembly);  
_

コマンドクラスとコマンドハンドラクラスは次のとおりです。

AddEducationCommand.cs

_public class AddEducationCommand : IRequest<bool>
{
    [DataMember]
    public int UniversityId { get; set; }

    [DataMember]
    public int FacultyId { get; set; }

    [DataMember]
    public string Name { get; set; }
}
_

AddEducationCommandHandler.cs

_public class AddEducationCommandHandler : IRequestHandler<AddEducationCommand, bool>
    {
        private readonly IUniversityRepository _repository;
        public AddEducationCommandHandler(IUniversityRepository repository)
        {
            _repository = repository;
        }

        public async Task<bool> Handle(AddEducationCommand command, CancellationToken cancellationToken)
        {
            var university = await _repository.GetAsync(command.UniversityId);

            university.Faculties
                .FirstOrDefault(f => f.Id == command.FacultyId)
                .CreateEducation(command.Name);

            return await _repository.UnitOfWork.SaveEntitiesAsync();
        }
    }
_

REST単純なawait _mediator.Send(command);コードを実行するエンドポイントを実行すると、ログから次のエラーが表示されます。

_Error constructing handler for request of type MediatR.IRequestHandler`2[UniversityService.Application.Commands.AddEducationCommand,System.Boolean]. Register your handlers withthe container. See the samples in GitHub for examples.
_

私は幸運なしにドキュメントから公式の例を見てみました。 MediatRが正しく動作するように設定する方法を知っている人はいますか?前もって感謝します。

11
Mike Hawkins

私は同じ問題に出会いました。

問題は、この行コード

services.AddMediatR(typeof(AddEducationCommand).GetTypeInfo().Assembly);

すべてのMediatR IRequestおよびIRequestHandlersを処理します。

しかし、その_MediatR.Extensions.Microsoft.DependencyInjection_で処理できないIRepositoryインターフェイスとその実装クラスを作成した

すべての変更を保持しますが、これを追加します-これを手動で登録します

services.AddScoped(typeof(IUniversityRepository), typeof(UniversitySqlServerRepository));

その後、問題は解決しました。

13
ske

私は同じ問題を抱えており、私の場合、services.AddMediatR()を呼び出した後に特定のハンドラーが必要とする依存関係を登録していたとき、Mediatorを登録する前に依存関係を登録し始めた後、すべてが正常に機能します。

デフォルトのDIコンテナとMediatR 6.0.0でドットネットコア2.2を使用しています。

1
Frankely Diaz