苦苦挣扎DDD,存储库模式和关联域模型

时间:2009-01-29 16:30:50

标签: linq-to-sql design-patterns activerecord domain-driven-design

我真的很想绕过这些东西。让我举一个例子,说明我在哪里挣扎。

我正在使用Linq-2-Sql作为我的应用程序的DAL以及Rob Conery的MVC Storefront示例应用程序中使用的IRepository模式。

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

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

地址集合是否只能通过调用以下内容来更新:

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

...帮助

3 个答案:

答案 0 :(得分:3)

DDD是一个我很感兴趣但很少有经验的领域,所以请谨慎对待我的建议。我只提供他们,因为缺乏其他更权威的答案。

Eric Evans在'the book'中提供的地址作为一个例子,通常应被视为价值对象而不是实体。所以我相信Add方法属于Customer:

customer.Add(地址);

会有一个Customer Repository(但不是一个地址)。这可以像这样使用:

customerRepository.Update(客户);

这样做的有意影响是,您询问的有关如何在DB层实现此问题的所有难题都不是域对象(即客户对象)的关注点。我恐怕无法超越这一点。

答案 1 :(得分:1)

听起来您不了解域名的上下文以及您需要的内容。提出更多问题并获得更好的用户故事。可能您提出的任何方案都可能满足业务需求,具体取决于它是什么。当你明白需要的时候,我相信这个问题会自行解决。

答案 2 :(得分:1)

这取决于答案的良好开端。将地址添加到客户并使用以下方式保存客户后

customer.Add(address);
customerRepository.Update(customer);

然后,您的存储库将map您的客户并将域层实体解析为LINQ to SQL。这可能涉及创建一个新的DataContext对象,获取相关的LINQ to SQL实体(或创建新的实体),然后将域层实体映射到LINQ to SQL实体。

var context = new MyDataContext();
var linqCustomer = MapCustomerToLinqCustomer(context, customer);
var linqAddress = MapAddressToLinqAddress(context, customer.Addresses.First());
context.SubmitChanges();

您也可以使用DataMapper类进行映射,但MapXYZ方法更接近Rob Conery的示例。如果您需要有关MapXYZ方法的更多帮助,请与我们联系。