我们的申请中有两个项目:
这两个部分将进一步调用相同的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使用的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对象。
答案 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等工具注入将值从客户端发送到服务器上的完整对象。