繁体   English   中英

使用存储库模式对查找表进行DDD和CRUD

[英]DDD and CRUD on lookup tables using repository pattern

因此,我尝试遵循“域驱动设计”方法,并且不确定如何处理需要CRUD操作的查找表。 这是一个人为的例子来说明我的问题。

假设我有一个Person类

public class Person
{
    public string Address { get; private set; }
}

我的数据库有一个人表和一个地址表。 人员表的Address_Id列是地址表的外键。 一个明显的想法是,由于存在外键关系,因此您不能将地址表中不存在的地址值添加到人员表中。

在我的应用程序中,Person是一个聚合根,因此具有关联的存储库。 使用存储库,我加载了人员,同时也加载了相关的地址。

我的问题是如何在“地址”表上执行CRUD操作? 遵循DDD原则,我认为不应该为Addresses表创建一个存储库。

我的应用程序的要求是,在创建新的Person对象时,将显示一个地址下拉列表,用户可以从中选择一个地址。 不允许他们输入地址,必须从已经存在的地址中选择。 因此,对地址表的CRUD操作。 系统管理员将需要管理“地址”查找表,以便向创建“个人”对象的用户提供正确的选择。

同样,这是一个非常人为的示例,我知道没有人会设计这样的系统。 只是为了帮助说明问题。

您是否曾经自己编辑或检索地址? 该存储库本质上是一个业务对象到关系数据库的映射器,它应该封装对象的持久化方式,因此您不必担心它。

如果对象保留在多个表中,则业务逻辑不必知道这一点,因此,除非您需要自己编辑Address对象,否则我不会为Address添加存储库。

看一看: 仓库模式逐步说明

好吧,但是我猜属性string Address应该是Address Address

在那种情况下,当您在PersonRepository上存储Person时,如果基础商店中不存在某些给定的Address ,则使用其特定于技术的实现的整个存储库将为您在Addresses关系表中创建整个地址注册表。

另外,我猜您将在现有的数据映射器(OR / M)上使用存储库,这应该可以轻松管理这种情况:这只是将整个属性映射为多对一关联。

实际上,我相信存储库应该存储根聚合,就像您在自己的问题中提到的那样。

这取决于您自己的域。 如果一个地址可以与0个或多个人相关联而可以单独居住,则应考虑使用特定的AddressRepository添加地址,使用该地址注册地址,以后AddressRepository其与某个Person关联。

IMO,您有两种用例:1)保存Person对象,但在2)之前列出所有可用地址,以便能够选择正确的地址。

因此,我将创建一个AddressRepository,也许不是CRUD,而是仅用于获取实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM