这个问题可能已经有人问过了,但我在官网上找不到为什么我应该使用MediatR以及它解决了哪些问题?
是因为我可以通过构造函数传递单个对象而不是众多接口吗?
它是ServicesBus的替代品或竞争对手吗?
基本上,它有什么好处和解决了什么问题?
我想采用它,但我不清楚我为什么要使用它。
非常感谢
这个问题可能已经有人问过了,但我在官网上找不到为什么我应该使用MediatR以及它解决了哪些问题?
是因为我可以通过构造函数传递单个对象而不是众多接口吗?
它是ServicesBus的替代品或竞争对手吗?
基本上,它有什么好处和解决了什么问题?
我想采用它,但我不清楚我为什么要使用它。
非常感谢
是因为我可以在构造函数中传递单个对象而不是多种接口吗?
不是。
它是ServicesBus的替代品或竞争对手吗...
不是。
基本上有哪些好处,以及它解决了什么问题
除其他问题外,MediatR试图解决的一个问题是在您的MVC控制器中的DI构造函数爆炸
public DashboardController(
ICustomerRepository customerRepository,
IOrderService orderService,
ICustomerHistoryRepository historyRepository,
IOrderRepository orderRepository,
IProductRespoitory productRespoitory,
IRelatedProductsRepository relatedProductsRepository,
ISupportService supportService,
ILog logger
)
这是一个备受争议的话题,没有一种通用解决方案,看一下这个问题:
如果你想在更多的抽象层面上隐藏依赖关系,那么此时你需要查看所有选项,比如重构,更进一步地分离关注点或其他技术。
说实话,MediatR 网站上给出的示例问题和解决方案有点可疑,但它确实有其用处。简而言之,你需要选择适合你和你的环境的内容。
中介者模式概述
中介者是一个对象,它决定对象如何以及何时相互交互。它封装了“如何”并基于状态、调用方式或提供给它的负载协调执行。
至于你问题的本质,你应该真正看一下这个网站:
MediatR是中介者模式的开源实现,它不试图做太多事情也不会施展魔法。它允许您使用同步或异步模式组合消息、创建和侦听事件。它有助于减少耦合并隔离请求工作和创建调度工作处理程序之间的关注点。它只是一种在业务逻辑组件之间实现通信的方式。
想象一下你有:
FirstRequest // which handled by FirstRequestHandler(FirstRequest)
SecondRequest // which handled by SecondRequestHandler(SecondRequest)
ThirdRequest // which handled by ThirdRequestHandler(ThirdRequest)
......有数百个……
接下来是ComplexRequest,当需要将FirstResponse和ThirdResponse组合成ComplexResponse时。
我们该如何解决这个问题?
嗯,ComplexRequestHandler将不得不注入FirstHandler和ThirdHandler,获取它们的结果,并将它们组合起来。
但为什么ComplexRequestHandler应该访问FirstRequestHandler接口呢? 为什么我们要麻烦地注入First、Third...OneHundredAndTwentythHandler到我们的ComplexHandler中呢?
在这种情况下,MediatR为我们提供了一个第三方,告诉我们:"给我一个请求,我会给你正确的响应,相信我!"
因此,ComplexHandler并不知道任何关于First和Third Handlers的信息。 它只知道所需的请求和响应(通常只是包装DTOs)。
注:您不一定要使用MediatR库。您可以阅读有关Mediator模式并自己实现它。