首页 > 解决方案 > .NET Core API 中的 CQS - DI 配置不起作用

问题描述

我在我的项目中实现了 CQS 模式。但是我为每个正在工作的命令处理程序创建了单独的接口。我试图从一个通用接口(ICommandHandler)生成它,当我尝试通过 startup.cs 中的 DI 配置它时,代码失败了。处理程序未初始化。任何帮助表示赞赏。

下面是代码

        public interface ICommand
    {
        Guid Id { get; }
    } 
 public abstract class Command : ICommand
    {
        public Guid Id { get; set; }
    
        protected Command()
        {
            Id = Guid.NewGuid();
    
        }

    }
  public class CreateAnnouncementDeliveryCommand : Command
    {
        public string DepliveryType { get; set; }
        public string Description { get; set; }
    }
  public interface ICommandHandler<in TCommand, TCommandResult> where TCommand : class, ICommand
    {
        Task<TCommandResult> Execute(TCommand command);
    }
 
 public partial class CreateAnnouncementDeliveryCommandHandler : ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand>
    {
        private readonly IAnnouncementDeliveryManager _manager;
        private readonly IMapper _mapper;

        public CreateAnnouncementDeliveryCommandHandler(IAnnouncementDeliveryManager manager, IMapper mapper)
        {
            _manager = manager;
            _mapper = mapper;
        }

        public Task<CreateAnnouncementDeliveryCommand> Execute(CreateAnnouncementDeliveryCommand command)
        {
          
           return not implemented
        }

    }

在控制器中

public class AnnouncementDeliveryController : BaseController
    {
        private readonly ICreateAnnouncementDeliveryCommandHandler _createCommandHandler;
             private readonly IMapper _mapper;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public AnnouncementDeliveryController(ICreateAnnouncementDeliveryCommandHandler createCommandhHndler,
                                       IMapper mapper,
                                       ILoggingService loggingService,
                                       IHttpContextAccessor httpContextAccessor,
                                       IUsersQueryHandler userQueryCommandHandler) : base(loggingService, userQueryCommandHandler, httpContextAccessor)
        {
            _createCommandHandler = createCommandhHndler;
           _httpContextAccessor = httpContextAccessor;
            _mapper = mapper;
        }
[HttpPost]
        [ActionName("AddAnnouncementDelivery")]
        public async Task<IActionResult> AddAnnouncementDelivery([FromBody] CreateAnnouncementDeliveryCommand _command)
        {
            try
            {
                var cmd = await _createCommandHandler.Execute(_command);
                return Ok(cmd);
            }
            catch (Exception e)
            {
                return BadRequest(e.Message);
            }
        }}

在 startup.cs 添加以下内容:

services.AddTransient(typeof(ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand>), 
                      typeof(CreateAnnouncementDeliveryCommandHandler));

 

标签: c#

解决方案


这很可能是一个错字。您的配置代码ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand>在容器需要ICreateAnnouncementDeliveryCommandHandler. 您发布的所有类都没有实现ICreateAnnouncementDeliveryCommandHandler,所以我怀疑控制器应该期待 a ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand>

public class AnnouncementDeliveryController : BaseController
{
    private readonly ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand>
                    _createCommandHandler;

    public AnnouncementDeliveryController(
               ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand> createCommandhHndler,
               ....
   ) : base(loggingService, userQueryCommandHandler, httpContextAccessor)
   {
       _createCommandHandler = createCommandhHndler;
       ...
   }

对于您想做的任何事情,此代码可能过度设计且过于复杂。命令-查询分离是一种简化复杂域的方法,而不是增加额外的复杂性。如果接口太复杂太长以至于你错过了这些错别字,你可能应该重新考虑设计,并且可能使用更少的抽象类型。


推荐阅读