只读数据库视图如何适合存储库模式?

时间:2011-09-09 18:28:11

标签: domain-driven-design repository-pattern aggregateroot sql-view

示例:您的数据库有一个名为“CustomerOrdersOnHold”的SQL视图。此视图返回特定客户和订单数据字段的过滤组合。您需要在应用程序中从此视图中获取数据。如何访问这样的视图适合存储库模式?你会创建一个“CustomerOrdersOnHoldRepository”吗?这样的只读视图是否被视为聚合根?

3 个答案:

答案 0 :(得分:26)

我更喜欢将读取存储库分开,最好甚至将其名称更改为Finder或Reader,存储库用于域使用而不是用于查询只读数据,您可以参考this article和{{3}这解释了Finder分离表单存储库的用法。

我还建议将读取模型与写入模型架构thisCQRS

分开

这种架构允许您将读取模型与写入模型分开,即使在数据存储和事件源的使用方面也是如此。

对于中间解决方案,您可以利用一些CQRS概念,而不必通过仅将存储库与查找器分开来分离数据库,请阅读此there

对于此类解决方案的示例(使用相同的数据库,但将查找器分隔为存储库),请检查post

答案 1 :(得分:0)

我认为拥有一个像“CustomerOrdersOnHoldRepository”这样的独立存储库是完好的。存储库的接口将反映对象是只读的事实(通过不定义Save / Add / MakePersistent方法)。

来自How to write a repository

  

...但我还有另一种策略:多重   库。在我们的订购示例中,没有理由我们可以拥有   两个存储库:AllOrders和SurchargedOrders。 AllOrders代表   包含系统中每个订单的列表,SurchargedOrders   代表它的一个子集。

我不会将返回的对象称为Aggrgate Root。聚合用于一致性,数据交换和生命周期。您的对象没有任何这些。它们似乎也不能被归类为价值对象('特征或属性')。它们只是独立的类。

答案 2 :(得分:0)

您的只读数据将被视为DDD世界中的值对象。

我通常将值对象的访问方法放在现有存储库中,直到创建单独的存储库为止。它类似于可能返回要在地址表单上使用的静态状态列表的方法:

IAddressRepository
{
  Address GetAddress(string addressID);

  List<string> GetStates(string country);
}