0

在将数据从表示层中的用户界面传递到应用层然后传递到域层进行验证时,我对应该使用什么表单数据感到困惑。我正在通过 DTO,但我听说我不应该。相反,我应该只将原语和标量传递给域层。如果不使用 DTO 类结构,我不确定这是如何完成的。下面是我在 UI 中使用 DTO 的方式:

我的用户界面在屏幕上可能具有如下值:

产品名称: 产品ABC

产品编号:1234

描述:描述

当用户单击提交按钮将此记录添加到数据库时,我构建了一个 DTO,如下所示:

public class NewProductDto
{
 public string ProductName  {get;set;}
 public string ProductCode  {get;set;}
 public string Description  {get;set;}
}

我将此 DTO 传递给应用程序层,然后传递给域层,在那里它读取值以验证并创建实体的新实例。

如果我不应该这样做,那么应该如何打包来自 UI 的值以供应用层接收并发送到域层以执行验证和创建新实体?

也许只是一个简单的数据结构?

struct NewProduct
{
 public string ProductName;
 public string ProductCode;
 public string Description;
}

struct NewProduct aNewProductStructure;

(即 CreateNewProduct(aNewProductStructure) 而不是 CreateNewProduct(aNewProductDto) ?

提前致谢。

---------- 更新 2/24/2016 上午 9:58

好的,根据我忽略的最近信息,应用程序层似乎应该从 UI 接收 DTO,然后将其转换为片段以传递给域。因此,在我上面的示例中,应用层应该将要创建的新产品按如下方式传递给域层:

CreateNewProduct(ProductName, ProductCode, Description);

CreateNewProduct 的定义:

public int CreateNewProduct(string ProductName, string ProductCode, string Description)
{
....
}

基本上,我应该将各个值传递给域。

4

1 回答 1

1

使用 DTO 跨流程边界传输数据是一件好事。

负责确保发送到域的消息格式正确的反腐败组件本身存在于应用程序组件中。

也就是说,应用程序组件获取 DTO 并从中创建将被域识别的值类型是正常的。所有数据验证(值类型的范围检查、字符串解码、空值检查等)都发生在应用层。

所以这很接近:

public int CreateNewProduct(string ProductName, string ProductCode, string Description)
{
    ....
}

但更好的是

public int CreateNewProduct(ProductName productName, ProductCode productCode, Description description)
{
    ....
}

在应用层完成所有数据验证后,域就可以让命令与业务规则相协调——给定域的当前状态,是否允许使用这些参数创建新产品?

域模型使用它理解的类型描述对应用程序的任何更改,然后应用程序负责对结果进行规范化(即,构建一个 DTO 以发送回客户端,将更改传递给持久性组件等)。

于 2016-02-24T22:56:56.370 回答