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; }
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 });
更轻的是,您可以使用用户对象将数据从客户端发送到服务器端,并使用工具,例如将从客户端发送的值注入服务器上的完整对象