Некоторые сервисы не могут быть созданы в ASP.NET Ядро

#c# #asp.net-core #repository-pattern #mediatr

#c# #asp.net-core #репозиторий-шаблон #mediatr

Вопрос:

из-за этого исключения возникли трудности с CQRS. У меня есть модель Movie, а также модель MovieDTO

// РЕДАКТИРОВАТЬ Хорошо, я только что понял, что GetMoviesQuery я не использую IRepository< MovieDTO > , и когда я меняю MovieRepository на IRepository<MovieDTO> then, это работает

IRepository.cs

 public interface IRepository<TEntity>
{
    IEnumerable<TEntity> GetAll();

    TEntity Get(int id);

    TEntity Save(TEntity entity);

    void Delete(int entityId);
}
  

MovieRepository.cs

 public class MovieRepository : IRepository<MovieDTO>
{
    private MyContext _context;
    private IMapper _mapper;
    public MovieRepository(MyContext context)
    {
        _context = context;
        var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<Movie, MovieDTO>();
        });
        _mapper = config.CreateMapper();
    }

    public IEnumerable<MovieDTO> GetAll()
    {
        return _context.Movies.ToList().Select(movie => _mapper.Map<Movie, MovieDTO>(movie));
    }
}
  

GetMoviesQuery.cs

 public class GetMoviesQuery
{
    public class Query : IRequest<IEnumerable<MovieDTO>> { }

    public class Handler : RequestHandler<Query, IEnumerable<MovieDTO>>
    {
        private MovieRepository _repository;

        public Handler(MovieRepository repository)
        {
            _repository = repository ?? throw new ArgumentNullException(nameof(_repository)); 
        }

        protected override IEnumerable<MovieDTO> Handle(Query request)
        {
            return _repository.GetAll();
        }
    }
}
  

Startup.cs

     public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
        services.AddTransient<IRepository<MovieDTO>, MovieRepository>();
        services.AddHttpClient();
        services.AddDbContext<MyContext>(options => options.UseSqlite("Data Source = blogging.db"));
        services.AddMediatR(typeof(Startup));
    }
  

Исключение:
Система.Исключение AggregateException: «Некоторые службы не могут быть созданы (ошибка при проверке дескриптора службы «ServiceType: MediatR.IRequestHandler 2[TicketReservationSystem.Server.CQRS.Queries.GetMoviesQuery Query,System.Collections.Generic.IEnumerable 1[TicketReservationSystem.Сервер.Models.DTO.MovieDTO]] Время жизни: переходный тип реализации: TicketReservationSystem.Server.CQRS.Queries.GetMoviesQuery обработчик’: не удалось разрешить службу для типа ‘TicketReservationSystem.Server.Data.Repository.MovieRepository’ при попытке активировать

Я понятия не имею, как на самом деле выяснить, в чем проблема.

Ответ №1:

public Handler(MovieRepository repository)

следует изменить на

public Handler(IRepository<MovieDTO> repository) , поскольку вы зарегистрировали свой контейнер с интерфейсом, а не с реализацией.

 services.AddTransient<IRepository<MovieDTO>, MovieRepository>();
  

Если вы хотите использовать свой исходный код, зарегистрируйте вместо него сам класс

 services.AddTransient<MovieRepository>();
  

Ответ №2:

Если у вас есть интерфейсы реализации, добавьте это в Startup.cs

 public void ConfigureServices(IServiceCollection services)
    { 
      services.AddScoped<IDepartments, Departments>()
    }