多表的仓储模式

5

最近我一直在研究使用仓储模式和依赖注入来帮助创建易于测试的代码,我认为我大部分都理解了。然而,我有一个问题很难解决。我需要为应用程序的业务层创建一个规则对象。为了创建规则,我需要能够读写两个表。你会如何实现一个使用两个表的仓储来创建一个对象呢?

例如:

ICollection<type> GetAllRules();

我应该在类型中放什么,因为它需要两个表格?
谢谢
史蒂夫

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

11

我不会坚持要有一个仓库来管理它。

正如Fowler所说:

就概念而言,Repository封装了存储在数据存储中的对象集和对它们执行的操作,提供了更加面向对象的持久化层视图。

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

我将为您提到的两个表格分别拥有两个仓库,然后我将创建一个工作单元以公开所有仓库,然后我将创建一个业务层服务来负责合成处理。

这种方法的优点是,仓储层保持干净,这里没有涉及业务处理,也没有向持久化层引入任何不清晰的规则。


我一直在研究你的方法,有一个问题。在我的服务类中,如何使用我的Save或getRule方法将两个表作为一个对象返回? - Steve2056726
2
看一下工作单元是如何工作的。您可以使用两个可用的存储库编写查询。根据您是否想公开通用IQueryable或特定方法,检索数据的方式可能会略有不同。有一个教程可供参考:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application - Wiktor Zychla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接