【问题标题】:Repository Pattern with multiple tables具有多个表的存储库模式
【发布时间】:2013-07-29 14:15:26
【问题描述】:

最近我一直在阅读有关使用存储库模式和 DI 来帮助创建易于测试的代码的内容,我想我大部分都了解它。但是我在一个问题上遇到了困难。我需要为我的应用程序业务层创建一个规则对象。要创建规则,我需要能够读取和写入两个表。您将如何实现一个对一个对象使用两个表的存储库?

例如:

ICollection<type> GetAllRules();

类型需要两个表,我应该输入什么?

谢谢

史蒂夫

【问题讨论】:

  • 听起来规则是两个底层实体加上一些逻辑的聚合。因此,您可以将两个存储库分开,并使用“域服务”创建一个规则,该规则将与存储库交互。然后应用层与规则域服务交互。
  • 最近我遇到了同样的问题。我使用具有所有通用属性的基类,然后使用动态对象来获取数据。但后来我们将规则表更改为包含数据版本的单个规则集表。这样数据更具相关性,我们不必使用动态对象。将来如果有一组新规则,只需将它们添加到表中并分配一个版本号。不确定这是否会对您有所帮助,但认为值得分享我的经验。
  • 有点难以回答,但我可能会尝试 ICollection GetAllRules();其中 Rule 具有您希望规则具有的所有字段。存储库的意义在于隐藏底层表结构。因此,例如,如果规则 ID 由其名称 + 内部 ID 号组成,但表将这些存储在单独的列中,则 GetAllRules 会从数据库中的内容进行映射,并将其作为 ID 公开给所有想要的人。
  • 谢谢KingDave,我会试试你的方法

标签: c# dependency-injection repository-pattern


【解决方案1】:

我不会坚持为此拥有一个存储库。

正如福勒所说

从概念上讲,存储库封装了持久化在数据存储中的一组对象以及对它们执行的操作,从而提供了持久层的更面向对象的视图。

这可能是大多数实现倾向于公开纯域对象而不是派生对象(您的 Rule 对象似乎是)的原因。

你提到的两个表我会有两个存储库,然后我会有一个工作单元来公开所有存储库,然后我会有一个业务层服务负责复合处理。

这种方法的一个优点是存储库层保持干净,这里不涉及业务处理,没有向持久层引入不明确的规则。

【讨论】:

  • 我一直在研究您的方法并有一个问题。在我的服务类中,如何使用我的 Save 或 getRule 方法将两个表作为一个对象返回?
  • 看看工作单元是如何工作的。您有两个可用的存储库,允许您在两者上编写查询。根据您是否要公开通用 IQueryable 或特定方法,检索数据的方式可能会略有不同。有一个可用的教程asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/…
猜你喜欢
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多