我一直面临的问题是如何处理由域逻辑驱动的计算值,同时仍然有效地处理数据存储。
例:
我正在通过服务从存储库返回产品列表。此列表受客户端发送的来自请求DTO的分页信息限制。另外,DTO指定一个排序参数(一个客户端友好的枚举)。
在一个简单的场景中,一切工作都很好:该服务将分页和排序表达式发送到存储库,而存储库向数据库发出有效的查询。
但是,当我需要对通过域模型在内存中生成的值进行排序时,一切都将崩溃。例如,Product类具有一个IsExpired()方法,该方法根据业务逻辑返回布尔值。现在我无法在存储库级别进行排序和分页-所有这些操作都必须在内存中完成(效率低下),并且我的服务必须知道何时向存储库发出这些参数以及何时执行排序/分页的复杂性本身。
在我看来,唯一有意义的模式是将实体的状态存储在db中(将IsExpired()设置为只读字段,并在保存之前通过域逻辑对其进行更新)。如果我将此逻辑分为一个单独的“读取模型/ dto”和“报告”存储库,那么我将使模型变得比我想要的更贫乏。
顺便说一句,我看到的每个这样的计算示例实际上都依赖于内存中的处理和掩盖性,因为它从长远来看效率很低。也许我过早地进行了优化,但这并不适合我。
我很想听听其他人如何处理此问题,因为我敢肯定这在涉及DDD的几乎项目中是很常见的。