简体   繁体   English

.NET Core API 中的 CQS -- DI 配置不起作用

[英]CQS in .NET Core API -- DI Configuration is not working

I have implemented CQS pattern in my project.我在我的项目中实现了 CQS 模式。 But i have created individual interfaces for each command handlers which is working.但是我为每个正在工作的命令处理程序创建了单独的接口。 I'm trying to get it generated from one common interface (ICommandHandler) and when i try to configure it through DI in startup.cs the code is failing.我试图从一个通用接口 (ICommandHandler) 生成它,当我尝试通过 DI 在 startup.cs 中配置它时,代码失败了。 The handlers are not initialized.处理程序未初始化。 Any help is appreciated.任何帮助表示赞赏。

The below is code下面是代码

        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
        }

    }

In Controller在控制器中

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

Adding the below in startup.cs :在 startup.cs 中添加以下内容:

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

This is most likely a typo.这很可能是一个错字。 Your configuration code registers ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand> while the container expects a ICreateAnnouncementDeliveryCommandHandler .您的配置代码注册ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand>而容器需要ICreateAnnouncementDeliveryCommandHandler None of the classes you posted implement ICreateAnnouncementDeliveryCommandHandler so I suspect the controller should expect a ICommandHandler<CreateAnnouncementDeliveryCommand, CreateAnnouncementDeliveryCommand> instead :你发布的类都没有实现ICreateAnnouncementDeliveryCommandHandler所以我怀疑控制器应该期待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;
       ...
   }

This code is probably overengineered and too complex for whatever you want to do.这段代码可能是过度设计的,而且对于你想做的任何事情来说都太复杂了。 Command-Query separation is a way to simplify complex domains, not add extra complexity.命令-查询分离是一种简化复杂域的方法,而不是增加额外的复杂性。 If the interfaces are so complex and so long that you miss such typos, you should probably rethink the design, and probably use less abstract types.如果接口如此复杂和冗长,以至于您错过了这样的拼写错误,您可能应该重新考虑设计,并且可能使用较少的抽象类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM