示例:您的数据库有一个名为“CustomerOrdersOnHold”的SQL视图。此视图返回特定客户和订单数据字段的过滤组合。您需要在应用程序中从此视图中获取数据。如何访问这样的视图适合存储库模式?你会创建一个“CustomerOrdersOnHoldRepository”吗?这样的只读视图是否被视为聚合根?
答案 0 :(得分:26)
我更喜欢将读取存储库分开,最好甚至将其名称更改为Finder或Reader,存储库用于域使用而不是用于查询只读数据,您可以参考this article和{{3}这解释了Finder分离表单存储库的用法。
分开这种架构允许您将读取模型与写入模型分开,即使在数据存储和事件源的使用方面也是如此。
对于中间解决方案,您可以利用一些CQRS概念,而不必通过仅将存储库与查找器分开来分离数据库,请阅读此there
对于此类解决方案的示例(使用相同的数据库,但将查找器分隔为存储库),请检查post
答案 1 :(得分:0)
我认为拥有一个像“CustomerOrdersOnHoldRepository”这样的独立存储库是完好的。存储库的接口将反映对象是只读的事实(通过不定义Save / Add / MakePersistent方法)。
...但我还有另一种策略:多重 库。在我们的订购示例中,没有理由我们可以拥有 两个存储库:AllOrders和SurchargedOrders。 AllOrders代表 包含系统中每个订单的列表,SurchargedOrders 代表它的一个子集。
我不会将返回的对象称为Aggrgate Root。聚合用于一致性,数据交换和生命周期。您的对象没有任何这些。它们似乎也不能被归类为价值对象('特征或属性')。它们只是独立的类。
答案 2 :(得分:0)
您的只读数据将被视为DDD世界中的值对象。
我通常将值对象的访问方法放在现有存储库中,直到创建单独的存储库为止。它类似于可能返回要在地址表单上使用的静态状态列表的方法:
IAddressRepository
{
Address GetAddress(string addressID);
List<string> GetStates(string country);
}