C# AutoMapper将域与实体及其他对象解耦

C# AutoMapper将域与实体及其他对象解耦,c#,domain-driven-design,automapper,decoupling,C#,Domain Driven Design,Automapper,Decoupling,我试图将我的域与实体分离,并选择使用AutoMapper来实现其中的一些功能。也许这是一个悬而未决的问题,但我想知道人们将如何将这些层彼此分离。例如,我有以下几点: public class A //Entity { public int Id { get; set; } public string Name { get; set; } } public class B //Domain { public string Name { get; set; } } 我想

我试图将我的域与实体分离,并选择使用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。

你知道,域名也有实体。。。您希望域与其他任何东西(persistenec、UI等)解耦

UI有自己的模型(主要是视图模型),通常是从域模型创建的。这里是进行脱杯的地方,您可以使用服务/映射器进行此操作。在您的例子中,视图模式似乎与域模型非常相似,因此您可以使用automapper从域模型创建视图模型

UI有ID的概念,能够操作和更改它,这是“正确”的吗


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

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

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

因此,“我想知道,真正将两者分离意味着不将属性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,映射器和持久化组件可以使用trackingId来代替持久化模型

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