C# WCF层中的DTO与业务对象

C# WCF层中的DTO与业务对象,c#,asp.net,wcf,rest,C#,Asp.net,Wcf,Rest,我们的应用程序中有两个项目: Web UI项目(aspx页面) WCF项目 这两个部分将进一步调用相同的BL和DAL层。以下是体系结构: 网络项目: WCF项目(将使用REST): 上述业务对象和DTO的示例: public class User { public int UserID { get; set; } public string UserName { get; set; } public string FirstName { get; set; }

我们的应用程序中有两个项目:

  • Web UI项目(aspx页面)
  • WCF项目
  • 这两个部分将进一步调用相同的BL和DAL层。以下是体系结构:

    网络项目

    WCF项目(将使用REST):

    上述业务对象和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正在使用它。此外,在我们的WCF REST层中,我们仅将DTO用于输入PRAM:

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


    使用两个单独的数据传输对象有什么实际优势吗?我问这个问题是因为在我看来,这是多余的,我们应该使用一个数据传输对象,即Web项目和WCF项目的业务对象。

    对我来说,是的,这样做总是值得的,但是只有在使用对象进行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 });
    
    更轻的是,您可以使用用户对象将数据从客户端发送到服务器端,并使用工具,例如将从客户端发送的值注入服务器上的完整对象