1

我正在尝试将我的域与我的实体分离,并选择使用 AutoMapper 来完成其中的一些工作。也许这是一个悬而未决的问题,但我想知道人们将如何将这些层彼此分离。例如,我有以下内容:

public class A //Entity
{
    public int Id { get; set; }

    public string Name { get; set; }
}

public class B //Domain
{
    public string Name { get; set; }
}

我想知道,真正将两者解耦是否意味着不将属性 ID 呈现回域?本质上,我的域对象将被 UI(MVC 层)使用,并且 UI 具有 ID 的概念是否“正确”,能够操作和更改它?

在此先感谢,DS。

4

2 回答 2

1

你知道,域也有实体......你希望他的域与其他任何东西(persistenec、UI 等)分离。

UI 有自己的模型(主要是视图模型),通常是从域模型创建的。这是解耦发生的地方,您可以为此使用服务/映射器。在您的情况下,视图模式似乎与域模型非常相似,因此您可以使用自动映射器从域模型创建视图模型。

UI具有ID的概念是否“正确”,能够操纵和更改它?

UI 拥有完成其工作所需的任何信息是正确的。但是,UI 不应直接更改域模型。域会根据用例(通常在服务/命令处理程序中实现)而变化,在 99.99% 的情况下,我不知道您为什么要更改域实体的 ID。

于 2013-10-22T21:40:42.510 回答
1

ID 也是一个 DDD 概念,称为实体标识符。如果域实体没有标识符,您的 ui 和应用程序将无法操作它们。

例如,我想用 trackingId[123] 修改订单的预订联系人姓名。用户界面需要标识符来获取订单。然后通过映射订单持久实体(映射除 id 之外的所有字段)来重新构建订单域对象。最后一件事是存储订单(将域映射到实体,但 id 丢失),如果订单域对象中没有标识符,我如何决定要更新哪个订单持久实体?

因此,“我想知道,真正将两者分离是否意味着不将属性 Id 呈现回域?”的答案。没有。

但是持久实体中的某些 id 在域对象中并不相同,这些 id 可以跳过。同样的订单示例,如果应用程序是基于旧数据库构建的,并且预订联系人是订单表中的单个表,例如:

create table t_order {
    tracking_id varchar2(255) pk,
    //other fields
};

create table t_order_booking_contact {
     tracking_id varchar2(255) pk,
     name varchar2(255),
     //other fields
}

但是由于某些原因,域模型中的 BookingContact 是一个值对象(不需要 id)。在这种情况下,可以跳过 BookingContact 持久模型中的 trackingId,映射器和持久组件可以使用 Order 持久模型中的 trackingId。

对我来说,真正将两者解耦意味着开发领域模型使处理领域逻辑变得容易,开发持久性模型使持久性变得容易。映射器用于修复它们之间的差异。

于 2013-10-23T04:39:32.967 回答