我很困惑在将数据从表示层中的用户界面传递到应用层然后将域层传递给验证时,应该使用什么形式的数据。我正在通过一个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 am
好的,根据我忽略的最新信息,似乎应用层应该从UI接收DTO,然后将其转换为片段以传递到域。因此,在上面的示例中,Application Layer应该将要创建的新产品传递给域层:
CreateNewProduct(ProductName,ProductCode,Description);
CreateNewProduct的定义:
public int CreateNewProduct(string ProductName, string ProductCode, string Description)
{
....
}
基本上,我应该将各个值传递给域。
答案 0 :(得分:1)
使用DTO跨过程边界传输数据是一件好事。
反腐败组件负责确保域中的邮件格式正确,它本身就存在于应用程序组件中。
也就是说,应用程序组件采用DTO并从中创建将由域识别的值类型是正常的。所有数据验证(值类型的范围检查,字符串解码,空检查等)都发生在应用程序层中。
所以这很接近:
public int CreateNewProduct(string ProductName, string ProductCode, string Description)
{
....
}
但更好的是
public int CreateNewProduct(ProductName productName, ProductCode productCode, Description description)
{
....
}
通过应用程序层完成所有数据验证,域将留下协调命令与业务规则 - 给定域的当前状态,是否正在创建允许这些参数的新产品?
域模型使用它理解的类型描述对应用程序的任何更改,然后应用程序负责规范化结果(即,构建DTO以发送回客户端,将更改传递给持久性组件,等等)。