问题描述
那里有一个存储库模式来抽象出实际的数据源,我确实看到了很多好处,但是存储库不应使用IQueryable来防止泄漏数据库信息,它应该始终返回域对象,而不是DTO或POCO的域对象。 ,这是我无法解决的最后一件事。
如果存储库模式总是必须返回域对象,这是否意味着大多数时间它会获取太多数据?可以说它返回一个具有40个属性的雇员域对象,并且在使用该对象的服务和视图层中仅实际使用了其中五个属性。
这意味着数据库已从网络中抽取了大量不必要的数据。用一个对象执行此操作几乎不会引起注意,但是如果以这种方式推送数百万条记录,并且每次都丢弃大量数据,那么这是否被认为是不良行为?
是的,在添加,编辑或删除对象时,您将使用整个对象,但读取整个对象并将其推到仅使用其中一部分的另一层时,最多不会利用下划线数据库和网络最佳方式。我在这里想念什么?
解决方法
没有什么可以阻止您拥有单独的读取模型(可以单独存储域的投影或查询时的投影)并分离出命令和查询问题-CQRS。
如果您随后将GraphQL之类的东西放在读取端的前面,则消费者可以准确地确定从完整模型到各个字段/属性级别所需的数据。
您的命令仍然像以前一样与整个域模型交互(除非使用基于集合的操作对性能没有影响)。