2

我真的很努力地把我的头围绕在这些东西上。让我举个例子说明我在哪里挣扎。与DDD,存储库模式和相关领域模型苦苦挣扎

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

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

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

应该地址只能获得经过更新的存储库的收集调用是这样的:

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

帮助...

+2

就这么你知道,DDD(Domain Model)和Active Record是竞争的设计模式。 Active Record直接映射到数据库并提供CRUD方法,而Domain Model与数据库无关并使用数据映射器映射到数据库表。 – 2009-02-04 14:32:07

回答

3

DDD是在那里我有很大的兴趣,但是却非常的区域所以请小心谨慎对待我的建议。我只提供他们,因为缺乏其他更权威的答案。

在Eric Evans地址的'the book'中给出了一个典型的应该被视为值对象而不是实体的例子。所以我相信Add方法属于客户:

customer.Add(address);

会有一个客户信息库(但不是地址)。这可能是这样使用的:

customerRepository.Update(customer);

这样做的故意影响是,您所问的关于在数据库层如何实现的所有疑难问题都不是域对象(即客户对象)的问题。恐怕我也无法超越这一点。

1

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

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方法更加紧跟罗布科纳的例子。如果您需要MapXYZ方法的更多帮助,请告诉我。