【发布时间】:2023-01-04 02:12:06
【问题描述】:
我一直在这篇文章中学习模块化单体项目结构:https://codewithmukesh.com/blog/modular-architecture-in-aspnet-core
其中大部分对我来说很有意义,但我不太明白的是:
跨模块通信只能通过接口/事件/内存总线进行。跨模块数据库写入应保持最少或完全避免。
跨模块通信究竟是什么样子的?
假设我有 3 个模块:
- 产品
- 用户
- 安全
我的安全模块为
DisableUser注册了一个端点。此端点的工作是更新User以及与具有禁用状态的用户关联的每个Product。
Security模块如何在一个工作单元中调用User&Product更新状态方法?我的理解是,这种模式旨在让以后更容易将模块提取到微服务,所以我想将它作为某种任务可以更容易地更改为消息代理,但我只是不确定如何这应该看起来。
我的例子显然是做作的,我的主要观点是当涉及读/写时模块如何相互通信?
【问题讨论】:
-
意思(我的解释)是通信不会通过像 Kafka 这样的消息代理进行。相反,您可以在共享项目中定义要订阅的消息,以便各个模块注册。这可以通过传统事件或多播委托来完成,或者如果您按照项目建议使用 MediatR,您将在共享项目中定义一些接口
IMyEventNofitication : INotificationHandler<MyEvent>,并在每个想要订阅的模块中使用您的逻辑实现它事件。然后您通过 MediatR 发布所述事件。 -
补充一下:虽然 MediatR 鼓励命令查询分离,但它并不直接强制执行。在这种情况下,INotificationHandler 可能应该被认为是一个命令,因此应该只由假设意图是改变状态的将派发给它的命令注册。如果使用此基础架构,您在某个时候决定过渡到微服务,您将重新定义通知处理程序,而不是推送到您的消息代理,以供其他服务接收,并让其他相关服务使用这些消息。
标签: c# asp.net-core design-patterns architecture modular-monolith