[英]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.