关于封装和单一职责设计的最佳实践

时间:2019-05-01 13:20:35

标签: oop design-patterns

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

返回单个客户的客户服务。 发票服务,可按客户返回发票清单。

服务的消费者有时只需要一个客户,而有时他们又希望该客户和发票可以作为两个电话留下。

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

我不想破坏GetCustomer方法,也不想返回发票清单并让它们计数(这可以工作)。是否有最佳实践,而又没有创造出其中一种方法,同时又要牢记性能和往返行程?我看到很多设计都可以获取GetCustomer,GetCustomerDeepLo​​ad等。

谢谢。

2 个答案:

答案 0 :(得分:0)

很简单。不要想太多。

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

您绝对不能将订单管理和客户管理这两个问题混在一起,这意味着您返回的CustomerOrderItem将是适合客户管理的版本,而不是成熟的OrderItem将为订单管理建模。

答案 1 :(得分:0)

这就是我改用CQRS的原因。操作(编写/命令)通常针对单个实体类型,而读取(查询)则通常希望由实体组成。

您不想将这些查询放入存储库,因为这样做时,存储库往往会泄漏抽象。

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

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