Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 与DDD、存储库模式和关联的域模型抗争_Linq To Sql_Design Patterns_Activerecord_Domain Driven Design - Fatal编程技术网

Linq to sql 与DDD、存储库模式和关联的域模型抗争

Linq to sql 与DDD、存储库模式和关联的域模型抗争,linq-to-sql,design-patterns,activerecord,domain-driven-design,Linq To Sql,Design Patterns,Activerecord,Domain Driven Design,我真的很难把我的头放在这些东西上。让我举一个我正在努力的例子 我使用Linq-2-Sql作为我的应用程序的DAL,以及Rob Connery的MVC店面示例应用程序中使用的IRepository模式 在我的领域中,我有一个客户模型,其中包含一组地址模型。在我的UI中有一个按钮,允许用户向客户添加新地址。这将打开一个地址编辑器,让他们填写所有信息 接下来会发生什么?地址是否保存到数据库中,然后添加到我的客户对象的列表中?它是否只是添加到列表中,但在保存客户对象之前不会更新?如果用户想要删除地址怎么

我真的很难把我的头放在这些东西上。让我举一个我正在努力的例子

我使用Linq-2-Sql作为我的应用程序的DAL,以及Rob Connery的MVC店面示例应用程序中使用的IRepository模式

在我的领域中,我有一个客户模型,其中包含一组地址模型。在我的UI中有一个按钮,允许用户向客户添加新地址。这将打开一个地址编辑器,让他们填写所有信息

接下来会发生什么?地址是否保存到数据库中,然后添加到我的客户对象的列表中?它是否只是添加到列表中,但在保存客户对象之前不会更新?如果用户想要删除地址怎么办?我是否删除数据库中的地址,然后将其从列表中删除?或者他们只是进行所有他们想要的删除/添加,而我每次都从数据库中转储所有内容,并使用Customer.Addresses集合中的任何内容进行更新?这里的正确流程是什么

地址集合是否应该仅通过调用以下内容通过存储库进行更新:

public void AddAddressToCustomer(Customer c, Address a)
{
    //validate and save address to db
    //add the newly saved address to the Customer Object
}

帮助…

DDD是我感兴趣但经验很少的领域,因此请谨慎对待我的建议。我之所以提供这些答案,是因为没有其他更权威的答案

Eric Evans在“”中给出了一个地址示例,该地址通常应被视为值对象,而不是实体。因此,我相信添加方法将属于客户:

客户。添加(地址)

将有一个客户存储库(但没有地址存储库)。可以这样使用:

public void AddAddressToCustomer(Customer c, Address a)
{
    //validate and save address to db
    //add the newly saved address to the Customer Object
}
customerRepository.Update(客户)


这样做的有意影响是,您提出的关于如何在DB层实现这一点的所有难题都不是域对象(即客户对象)所关心的。恐怕我也帮不上什么忙。

听起来你对自己领域的背景知识还不太了解。提出更多问题,获得更好的用户体验。根据具体情况,您提出的任何方案都可能满足业务需求。当你理解了这个需要,我相信这个问题会解决的。

这取决于你对答案有一个很好的开始。将地址添加到客户并使用以下方法保存客户后:

customer.Add(address);
customerRepository.Update(customer);
然后,您的存储库会将您的客户和域层实体寻址到LINQ到SQL。这可能涉及创建一个新的DataContext对象,获取相关的LINQ到SQL实体(或创建新实体),然后将域层实体映射到LINQ到SQL实体

var context = new MyDataContext();
var linqCustomer = MapCustomerToLinqCustomer(context, customer);
var linqAddress = MapAddressToLinqAddress(context, customer.Addresses.First());
context.SubmitChanges();
您也可以使用DataMapper类进行映射,但是MapXYZ方法更接近于Rob Conry的示例。如果您需要MapXYZ方法的更多帮助,请告诉我。

您知道,DDD(域模型)和Active Record是相互竞争的设计模式。Active Record直接映射到数据库并提供CRUD方法,而域模型与数据库无关,并使用数据映射器映射到数据库表。“域模型可能与数据库无关”-为了简单起见,Evans甚至建议保持域模型尽可能接近数据库模型[p160]。