c# - .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));
解决方案
这很可能是一个错字。您的配置代码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;
...
}
对于您想做的任何事情,此代码可能过度设计且过于复杂。命令-查询分离是一种简化复杂域的方法,而不是增加额外的复杂性。如果接口太复杂太长以至于你错过了这些错别字,你可能应该重新考虑设计,并且可能使用更少的抽象类型。
推荐阅读
- python - Scapy TCP 握手 - Windows
- ruby - 如何用`sed`替换不包含另一个字符串的字符串?
- jsf - primefaces 图表浏览器挂起
- excel - 如何将 Power Query 解决方案集成到我的代码中?
- reactjs - 用于 API 的 Electron + React 代理端口
- ios - Obj-C - 调用用户会话不会调用所有数据?
- c# - 提交表单时保留模型属性
- unit-testing - 我注意到一些工程师在他们的单元测试中引导容器,例如 Spring/Mironaut。单元测试还是集成测试?
- jquery - AutoClick 不适用于超时和每个
- android-management-api - Android Management API 在韩国不起作用