WTO层中的DTO与Business对象

时间:2013-04-15 09:35:11

标签: c# asp.net wcf rest

我们的申请中有两个项目:

  1. Web UI项目(aspx页面)。
  2. WCF项目。
  3. 这两个部分将进一步调用相同的BL和DAL层。这是架构:

    网络项目

    enter image description here

    WCF项目(将使用REST):

    enter image description here

    上面提到的业务对象和DTO的示例:

    public class User
    {
        public int UserID { get; set; }
        public string UserName { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
    public class UserDTO
    {
        public int UserID { get; set; }
        public string UserName { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    为WCF REST层设置单独的数据传输对象UserDTO.cs是否值得?我们已经将User.cs作为Web项目,BL和DAL使用的Business对象。此外,在我们的WCF REST层中,我们仅将DTO用于输入prams:

      public MyResponse CreateUser(User user)
            {
    

    从这个方法我们通过一些映射器将DTO转换为Business对象(即UserDTO到User.cs对象)并将其传递给BL层,BL层只接受Business对象而不接受DTO。即从WCF将Business对象传递给BL和DAL的角度来看,它的行为与UI将Business对象传递给BL和DAL层的方式完全相同。

    使用2个独立的数据传输对象是否有任何实际优势?我问过这个问题,因为IMO这将是多余的,我们应该使用一个数据trasnfer对象,即Web项目和WCF项目的Business对象。

1 个答案:

答案 0 :(得分:3)

对我来说,是的,总是值得这样做,但只有如果您正在使用AJAX调用的对象。

在这种情况下,它自成一体:

public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class UserDTO
{ 
    // Hide the UserID
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

您真的希望用户能够看到AJAX响应并获取用户ID吗?可能不是。这就是我们使用单独的DTO的原因。它还确保您只使用轻量级对象,而不是完整的,可能很重的对象,以便在客户端和服务器之间进行数据传输。

当然,您也可以这样做:

var query = GetYourUsers();

return query.Select(a => new { a.UserName, a.FirstName, a.LastName });

哪个更轻量级,然后您可以使用User对象从客户端向服务器端发送数据,并使用Value Injector等工具注入将值从客户端发送到服务器上的完整对象。