【问题标题】:Some services are not able to be constructed in ASP.NET Core某些服务无法在 ASP.NET Core 中构建
【发布时间】:2021-02-27 03:13:59
【问题描述】:

因为这个例外,很难使用 CQRS。我有一个 Movie 模型和 MovieDTO 模型

//编辑好的,我刚刚意识到在GetMoviesQuery 中我不使用IRepository< MovieDTO >,当我将MovieRepository 更改为IRepository<MovieDTO> 时,它就可以工作了

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

例外: System.AggregateException:'无法构造某些服务(验证服务描述符时出错'ServiceType:MediatR.IRequestHandler2[TicketReservationSystem.Server.CQRS.Queries.GetMoviesQuery+Query,System.Collections.Generic.IEnumerable1[TicketReservationSystem.Server.Models.DTO.MovieDTO]] 生命周期:瞬态实现类型:TicketReservationSystem.Server .CQRS.Queries.GetMoviesQuery+Handler':尝试激活时无法解析“TicketReservationSystem.Server.Data.Repository.MovieRepository”类型的服务

我不知道如何真正找出问题所在。

【问题讨论】:

    标签: c# asp.net-core repository-pattern mediatr


    【解决方案1】:

    public Handler(MovieRepository repository)

    应该改为

    public Handler(IRepository&lt;MovieDTO&gt; repository),因为您使用接口而非实现注册了容器。

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

    如果您想使用原始代码,请改为注册类本身

    services.AddTransient<MovieRepository>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 2020-11-19
      • 2021-12-12
      • 2021-07-07
      • 2021-03-14
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多