2

我真的很难理解这些东西。让我举一个我在哪里挣扎的例子。

我使用 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
}

帮助...

4

3 回答 3

3

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

在 Eric Evans 的“”中,地址作为示例给出了通常应该被视为值对象而不是实体的东西。所以我相信 Add 方法将属于客户:

客户。添加(地址);

将有一个客户存储库(但没有一个用于地址的)。这可能会像这样使用:

customerRepository.Update(客户);

这样做的有意影响是,您提出的关于如何在 DB 层实现这一点的所有困难问题​​都不是领域对象(即客户对象)的关注点。恐怕我也无能为力。

于 2009-01-29T17:31:46.090 回答
1

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

于 2009-01-29T21:56:01.330 回答
1

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

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

然后,您的存储库会将您的客户和地址域层实体映射到 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 方法的帮助,请告诉我。

于 2009-02-04T14:30:15.797 回答