我试图将我的域与我的实体分离,并选择使用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。
答案 0 :(得分:1)
你知道,这个域也有实体......你希望他的域与其他东西分离(persistenec,UI等)。
UI有自己的模型(主要是视图模型),通常是从Domain模型创建的。这是deocupling发生的地方,你可以使用服务/映射器。在您的情况下,视图模式似乎与域模型非常相似,因此您可以使用automapper从域模型创建视图模型。
UI是否“正确”,因为它具有ID的概念,能够操作和更改它?
UI具有完成工作所需的任何信息是正确的。但是,UI不应直接更改域模型。域根据用例(通常在服务/命令处理程序中实现)而更改,在99.99%的情况下,我不知道您为什么要更改域实体的ID。
答案 1 :(得分:1)
ID也是DDD概念,称为实体标识符。如果域实体没有标识符,则您的ui和应用程序无法操作它们。
例如,我想使用trackingId [123]修改订单的预订联系人姓名。 ui需要标识符来获取订单。然后通过映射顺序持久实体(映射除id之外的所有字段)来重构Order域对象。最后一件事是存储订单(将域映射到实体,但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。
对我来说,两者的真正脱钩意味着开发域模型,因为它可以轻松地处理域逻辑,并可以开发持久模型,因为它可以轻松实现持久性。映射器用于修复它们之间的差异。