[英]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.