gpt4 book ai didi

repository-pattern - 用于检索标量值的没有域对象的存储库模式

转载 作者:行者123 更新时间:2023-12-01 02:35:54 24 4
gpt4 key购买 nike

最近,我努力想弄清楚我的架构中的某些方法、功能是否合适;在正确的层。我要关注 the repository pattern of Martin Fowler将我的服务层与数据库分离。

Martin Fowler 在他的网站上解释的定义说:

A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection.



问题是我有很多要求,例如我必须获得所有发票的总和。您可以理解,所有发票的总和是一个标量值。如果我遵循 Martin Fowler 的定义,我应该做的是创建一个函数,该函数从我的存储库层返回域对象列表,该列表由服务层接收,该服务层循环抛出对象以计算总数。也有可能我不明白这种模式的本质含义......

我知道在设计应用程序时不应该考虑性能,因为可维护性更好,但在我看来,在开发和性能方面完全浪费时间 不创建 存储库层中的一个函数,它返回与发票总数相对应的十进制值,并从服务层返回相同的值。即使您可以使用 ORM 添加一些延迟加载策略,实现对象列表然后只使用单个属性也是一种矫枉过正的做法。

从存储库层返回标量值是否正确,还是我应该抵制诱惑并始终从该层返回域对象并处理服务层中的所有业务逻辑?

我也有很多地方我的演示者直接调用我的存储库,而不是调用服务层,然后调用存储库层。它是正确的;可以在服务层之外调用此存储库模式吗?

请注意,我不想从我的存储库层返回 IQueryable 结果,因为这与 Law of Demeter 完全矛盾。 .

另外,我不想直接在我的服务层中设置查询,因为我希望能够对这一层进行完整的单元测试;不做集成测试。

最佳答案

使用 CQRS(作为一个概念)很容易解决这个问题。有一个专门的仅查询存储库,可以由 UI(或在使用 MVC 时由 Controller )使用。该 repo 可以直接查询数据库(ORM 实体并不重要)并返回您需要的内容。

仅在更新模型时保留“重”域对象和相应的存储库。

关于repository-pattern - 用于检索标量值的没有域对象的存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10290918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com