我正在考虑在我的 .NET 7 Web 应用程序中使用 MediatR,因为我喜欢它有助于保持控制器的瘦身。这样,假设我想从具有剃刀视图的“经典”Web 应用程序切换到具有另一个前端的 .NET 7 Web API,我可以重用更多的后端代码。
在我发现的许多示例中,我看到 MediatR 与 CQRS 一起使用。命令和查询之间的分离对于我相当小的 Web 应用程序来说是一种矫枉过正。是否也可以在没有 CQRS 的情况下使用 MediatR,只是为了获得瘦控制器?
如何消费 Mediator 给你的合约由你决定。您不必符合所有接口
在最简单的示例中,如果满足您的需要,您可以只触发一个命令并将所有逻辑放入其中
public async IActionResult Get(SomeCommand command)
{
await _mediator.Send(command);
return Ok();
}
然后你的命令可以做所有的查询
public class SomeCommandHandler : IRequestHandler<SomeCommand , bool>
{
public SomeCommand Handler(/* Inject anything you need here, such as databases */) {}
public Task<bool> Handle(SomeCommand command)
{
// Do anything you need in here
}
}
我正在考虑在我的 .NET 7 Web 应用程序中使用 MediatR,因为我喜欢它有助于保持控制器的精简。
MediatR 做的一件事是将依赖项注入处理程序的构造函数中——这可以节省大量代码。这实际上也可以使用 IGet 来完成,这是一个更薄的库,您可以使用它创建您需要的所有内容 - 无需 MediatR。
public void OnGet([FromServices] IGet i, int id)
{
var result = i.Get<MyQueryHandler>().Handle(id);
// do something with the result.
}
命令和查询之间的分离对于我相当小的 Web 应用程序来说是一种矫枉过正。是否也可以在没有 CQRS 的情况下使用 MediatR,只是为了获得瘦控制器?
是的,您可以在没有 CQRS 的情况下使用 MediatR。 MediatR 与 CQRS 没有硬性关系——尽管有些人似乎在积极交流这两者的结合。