web-dev-qa-db-fra.com

Erreur ASP.NET Core MediatR: enregistrez vos gestionnaires avec le conteneur

J'ai une application .Net Core où j'utilise l'extension .AddMediatR Pour enregistrer l'assembly pour mes commandes et gestionnaires suivant une approche CQRS.

Dans ConfigureServices dans Startup.cs, j'ai utilisé la méthode d'extension du package officiel MediatR.Extensions.Microsoft.DependencyInjection Avec le paramètre suivant:

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

Les classes de commande et de gestionnaire de commandes sont les suivantes:

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();
        }
    }

Lorsque j'exécute le point de terminaison REST qui exécute un code await _mediator.Send(command); simple, j'obtiens l'erreur suivante dans mon journal:

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.

J'ai essayé de parcourir les exemples officiels des documents sans aucune chance. Est-ce que quelqu'un sait comment configurer MediatR pour fonctionner correctement? Merci d'avance.

11
Mike Hawkins

J'ai rencontré le même problème.

Le problème est que ce code de ligne

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

gère tous les MediatR IRequest et IRequestHandlers.

mais vous avez créé une interface IRepository et sa classe d'implémentation qui ne peuvent pas être gérées par ce MediatR.Extensions.Microsoft.DependencyInjection

alors gardez toutes vos modifications mais ajoutez ceci - enregistrez-le manuellement comme

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

puis problème résolu.

13
ske

J'ai eu le même problème et dans mon cas, lorsque j'enregistrais les dépendances dont certains gestionnaires avaient besoin après que j'appelais services.AddMediatR(), c'était le problème réel, après avoir commencé à enregistrer mes dépendances avant d'enregistrer Mediator, tout fonctionne bien.

J'utilise dot net core 2.2 avec le conteneur DI par défaut et MediatR 6.0.0.

1
Frankely Diaz