【问题标题】:Best practice regarding encapsulation and single responsibility design关于封装和单一职责设计的最佳实践
【发布时间】:2019-05-01 13:20:35
【问题描述】:

我已经开发了很多年,我面临的一个常见问题是如何最好地分离出服务层。我一直主要使用存储库模式,但我仍然在这个常见的场景中挣扎。

返回单个客户的客户服务。 按客户返回发票列表的发票服务。

服务的消费者有时只想要一个客户,有时他们想要客户和发票,这可以作为两个电话留下。

但一个新的要求可能是他们想要客户,但也想要各个客户拥有的发票总数。

我不想破坏 GetCustomer 方法,也不想返回发票列表并让他们进行计数(这可行)。是否有最佳实践,无需创建大量方法,同时仍牢记性能和往返行程?我看到很多设计都会有 GetCustomer、GetCustomerDeepLo​​ad 等。

谢谢。

【问题讨论】:

    标签: oop design-patterns


    【解决方案1】:

    这很简单。不要想太多。

    服务需要满足客户的需求。如果客户想要客户详细信息,服务会发送客户详细信息的表示,仅此而已;如果客户想要客户及其所有订单,则服务有义务;等等。在这样做时,您可能需要的不仅仅是Customer 对象;例如,您可能需要一个由CustomerOrderItem 等组成的CustomerOrderList 对象。

    您不得将订单管理和客户管理的问题混为一谈,这意味着您返回的 CustomerOrderItem 将是适合客户管理的版本,而不是完全成熟的 OrderItem订单管理。

    【讨论】:

      【解决方案2】:

      这就是我改用 CQRS 的原因。操作(写入/命令)通常针对单个实体类型,而读取(查询)通常需要实体的组合。

      您不希望将这些查询放入存储库,因为当您这样做时,存储库往往会获得泄漏的抽象。

      在您的情况下,您可以拥有两种类型的服务:负责处理更改的实体服务和负责向客户端提供信息的查询服务(不同实体的组合)。

      我通常只在写入端使用存储库,并让查询服务直接查询数据库。当您将业务逻辑包含在实体服务中时,它就会起作用。

      【讨论】:

      • 我喜欢这样。您是否有您认为行之有效的命名约定?
      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多