我已经开发了很多年,我面临的一个普遍问题是如何最好地分离服务层。我主要使用的是存储库模式,但在这种常见情况下我仍然很挣扎。
返回单个客户的客户服务。 发票服务,可按客户返回发票清单。
服务的消费者有时只需要一个客户,而有时他们又希望该客户和发票可以作为两个电话留下。
但是一个新的要求可能是他们想要客户,但也想要相应客户拥有的发票总数。
我不想破坏GetCustomer方法,也不想返回发票清单并让它们计数(这可以工作)。是否有最佳实践,而又没有创造出其中一种方法,同时又要牢记性能和往返行程?我看到很多设计都可以获取GetCustomer,GetCustomerDeepLoad等。
谢谢。
答案 0 :(得分:0)
很简单。不要想太多。
服务需要满足客户的需求。如果客户想要客户详细信息,则服务将发送客户详细信息的表示形式,仅此而已;如果客户想要客户及其所有订单,则服务义务;等等。这样做,您可能不仅需要Customer
对象,还需要更多对象。例如,您可能需要由CustomerOrderList
等组成的CustomerOrderItem
对象。
您绝对不能将订单管理和客户管理这两个问题混在一起,这意味着您返回的CustomerOrderItem
将是适合客户管理的版本,而不是成熟的OrderItem
将为订单管理建模。
答案 1 :(得分:0)
这就是我改用CQRS的原因。操作(编写/命令)通常针对单个实体类型,而读取(查询)则通常希望由实体组成。
您不想将这些查询放入存储库,因为这样做时,存储库往往会泄漏抽象。
在您的情况下,您可以有两种服务:负责更改的实体服务和负责向客户端提供信息的查询服务(不同实体的组成)。
我通常只在写端使用存储库,而让查询服务直接查询数据库。当您将业务逻辑包含在实体服务中时,此方法就起作用了。