【问题标题】:3-tier architecture with 3rd integration具有第 3 次集成的 3 层架构
【发布时间】:2019-05-09 23:19:11
【问题描述】:

我有一个 N 层架构,现在我需要添加与仓库系统的集成。 我创建了集成,现在我可以像这样使用它:

var provider = IntegrationFactory.GetDataProvider("integration name");
var integrationOrders = await provider.Orders.GetAllAsync();

什么问题 - 我有一个服务层,它通常与我的 DAL 一起使用,例如 CRUD 操作和填充 DTO 模型。 我必须创建将我的订单与集成订单同步的方法 - 让我们将此方法称为“SyncIntegrationOrders”,我将从集成端获取所有订单并将它们与我的数据库中的订单同步,所以我真的不了解是否可以将此方法保留在我用于处理 DAL 的 OrderService 中? 否则会破坏 SRP 原则... 但无论如何,当我想要 SyncIntegrationOrders 时,我也需要 DAL 层...... 提前致谢。

【问题讨论】:

  • 我了解到您想添加将数据发布到数据库的方法,您可以在服务层中再添加一项功能。因此,在您的服务中,有 2 种方法:GET 和 POST。这应该没问题。如果您认为我误解了您的情况,请添加评论。
  • 您可以在 orderservice 类中同步订单,这是您业务逻辑的一部分。您的 orderservice 类不仅仅存在于它可以接触 DAL 的位置,它还用于与所有外部资源交互并应用与订单有关的业务规则。如果你的 DAL 中有同步顺序方法,那就错了。
  • @JohanP 谢谢。另一个问题 - 如果我需要向集成发送特定订单?例如,我可以通过 id 从我的数据库中获取订单,我需要将其发送给我的集成提供商,如 provider.Orders.Create(orderFromMyDatabase)。我还能像“SendOrderToIntegration”一样将它放在我的 OrderService 中吗?我担心,因为其他方法通常适用于我的 DAL,但是这个应该将数据发送到集成......这就像其他职责一样
  • @AlexKvitchastiy 绝对是的。 Orderservice 是与所有不同数据源交互的中心点。因此它将与您的数据库数据源以及外部数据源(即仓库)进行交互。

标签: c# asp.net .net .net-core


【解决方案1】:

我不会混合同步服务和订单服务,因为:

1) sync-service 添加了一些与 order-service 无关的依赖,例如 IntegrationFactory、外部数据源等

2) sync-service 可以具有与 order-service 无关的特定功能:如故障恢复、远程数据一致性、合并订单、解决合并冲突等

3) 它简化了单元测试

4) 简化应用程序的分解,例如分解成微服务

一些备注:

  • sync-service 需要更快地与 order-service 而不是 DAL 进行通信/依赖,否则它可能会复制 order-service 中定义的某些业务逻辑

  • order-service 需要尽快不接受/返回 DTO,它会操纵业务实体(DTO 被引入更高 - 在 Facade 或“Presentation”中(例如 Controller、ApiController ..))

  • 解耦:订单服务应该只通知系统一些事件,例如“订单创建”等,而不是自己调用同步服务。 Sync-service 订阅所需的事件并根据其逻辑进行处理(例如,进行批处理)。

【讨论】:

  • 同步不是一种服务,它是一种方法。 Orderservice 是一个编排层,它可以从多个来源获取订单并应用业务规则。您不需要每个数据源的订单服务
  • 非常感谢您的时间和精力,但我没有收到您的消息,因为我谈到了 OrderService 中的同步方法 :) 正如@JohanP 所说,拥有特定服务真的很奇怪,因为我在订单/产品/等之间进行同步...所以我必须为每个实体添加额外的同步服务
  • @Alex Kvitchastiy - 恕我直言,*-service 没有责任关心同步,因此出现了新的同步服务。我在答案中提供了我的论点。抱歉,我认为为每个业务实体添加新的同步服务或引入一个管理多个 commands 的同步服务并没有什么奇怪的。
  • 如果我正确理解了问题范围,只是一些担忧:1)数据一致性 - 怀疑您的服务“被覆盖”事务,但如何在远程数据库上确保它? 2) 故障解决 - 表明发生的错误和订单未同步,订单服务是否有责任跟踪这种情况并按计划/在下一次通话时恢复?
  • 我肯定会创建一个负责的同步服务。这看起来也是使用消息队列的好场景。
猜你喜欢
  • 2011-07-30
  • 2011-09-30
  • 2012-06-04
  • 1970-01-01
  • 2010-12-09
  • 2011-02-06
  • 2012-12-31
  • 2016-02-28
  • 2012-07-21
相关资源
最近更新 更多