.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が正しく動作するように設定する方法を知っている人はいますか?前もって感謝します。
私は同じ問題に出会いました。
問題は、この行コード
services.AddMediatR(typeof(AddEducationCommand).GetTypeInfo().Assembly);
すべてのMediatR IRequestおよびIRequestHandlersを処理します。
しかし、その_MediatR.Extensions.Microsoft.DependencyInjection
_で処理できないIRepositoryインターフェイスとその実装クラスを作成した
すべての変更を保持しますが、これを追加します-これを手動で登録します
services.AddScoped(typeof(IUniversityRepository), typeof(UniversitySqlServerRepository));
その後、問題は解決しました。
私は同じ問題を抱えており、私の場合、services.AddMediatR()
を呼び出した後に特定のハンドラーが必要とする依存関係を登録していたとき、Mediatorを登録する前に依存関係を登録し始めた後、すべてが正常に機能します。
デフォルトのDIコンテナとMediatR 6.0.0でドットネットコア2.2を使用しています。