你认为用 MediatR 替换我的服务层或服务类可能是合理的吗?例如,我的服务类看起来像这样:
public interface IEntityService<TEntityDto> where TEntityDto : class, IDto
{
Task<TEntityDto> CreateAsync(TEntityDto entityDto);
Task<bool> DeleteAsync(int id);
Task<IEnumerable<TEntityDto>> GetAllAsync(SieveModel sieveModel);
Task<TEntityDto> GetByIdAsync(int id);
Task<TEntityDto> UpdateAsync(int id, TEntityDto entityDto);
}
我希望实现一种模块化设计,以便其他动态加载的模块或插件可以为我的主核心应用程序编写自己的通知或命令处理程序。
目前,我的应用程序没有任何事件驱动,并且没有简单的方法让我的动态加载插件进行通信。
我可以在控制器中加入MediatR完全移除服务层,或者只在服务层中使用它发布通知,以便我的插件可以处理它们。
目前,我的逻辑大多是增删改查,但在创建、更新和删除之前有很多自定义逻辑。
可能替换我的服务看起来像:
public class CommandHandler : IRequestHandler<CreateCommand, Response>, IRequestHandler<UpdateCommand, Response>, IRequestHandler<DeleteCommand, bool>
{
private readonly DbContext _dbContext;
public CommandHandler(DbContext dbContext)
{
_dbContext = dbContext;
}
public Task<Response> Handle(CreateCommand request, CancellationToken cancellationToken)
{
//...
}
public Task<Response> Handle(UpdateCommand request, CancellationToken cancellationToken)
{
//...
}
public Task<bool> Handle(DeleteCommand request, CancellationToken cancellationToken)
{
///...
}
}
是否做这件事情有问题?
基本上,我正在为我的逻辑流程苦苦挣扎:
- 控制器->服务->MediatR->通知处理程序->存储库
- 控制器->MediatR->命令处理程序->存储库
使用MediatR似乎无法为创建、更新和删除使用单个模型,因此重用它的一种方法是派生请求,如:
public CreateRequest : MyDto, IRequest<MyDto> {}
public UpdateRequest : MyDto, IRequest<MyDto> {}
或者将它嵌入到我的命令中,例如:
public CreateRequest : IRequest<MyDto>
{
MyDto MyDto { get; set; }
}
MediatR的一个优点是可以轻松地插入和拔出逻辑,这似乎非常适合模块化架构,但我仍然有点困惑如何使用它来构建架构。