2010-04-10 44 views
0

我有一個具有在表示層中使用的DTO的業務層。此應用程序使用實體框架。使用LINQ-to-Entities將業務層結果返回到表示層的最佳方法

這裏是一個叫RoleDTO類的例子:

public class RoleDTO 
{ 
    public Guid RoleId { get; set; } 
    public string RoleName { get; set; } 
    public string RoleDescription { get; set; } 
    public int? OrganizationId { get; set; } 
} 

在BLL我想有一個返回DTO的列表的方法。我想知道哪種方法更好:返回IQueryable或DTO列表。雖然我覺得返回IQueryable不是一個好主意,因爲連接需要打開。這裏有不同的方法的2種不同的方法使用:

第一種方法

public class RoleBLL 
{ 
    private servicedeskEntities sde; 

    public RoleBLL() 
    { 
     sde = new servicedeskEntities(); 
    } 

    public IQueryable<RoleDTO> GetAllRoles() 
    { 
     IQueryable<RoleDTO> role = from r in sde.Roles 
         select new RoleDTO() 
         { 
          RoleId = r.RoleID, 
          RoleName = r.RoleName, 
          RoleDescription = r.RoleDescription, 
          OrganizationId = r.OrganizationId 
         }; 
     return role; 
    } 

注:上述方法DataContext的是私有屬性,並在構造函數中設置,使連接保持打開。

第二條本辦法

public static List<RoleDTO> GetAllRoles() 
{ 
    List<RoleDTO> roleDTO = new List<RoleDTO>(); 
    using (servicedeskEntities sde = new servicedeskEntities()) 
    { 
     var roles = from pri in sde.Roles 
         select new { pri.RoleID, pri.RoleName, pri.RoleDescription }; 

     //Add the role entites to the DTO list and return. This is necessary as anonymous types can be returned acrosss methods 
     foreach (var item in roles) 
     { 
      RoleDTO roleItem = new RoleDTO(); 
      roleItem.RoleId = item.RoleID; 
      roleItem.RoleDescription = item.RoleDescription; 
      roleItem.RoleName = item.RoleName; 
      roleDTO.Add(roleItem); 

     } 
     return roleDTO; 
    } 
} 

請讓我知道,如果有更好的辦法。

回答

1

最好不要將模型對象直接發送到表示層,您可以有一箇中間層,將這些DTO對象映射到表示層需要的自定義對象。

接近你的第二種方法,但不完全一樣。

+0

您能否更清楚地知道第一種方法的問題。問題是否分離? 我更喜歡第二種方法,但你能解釋什麼是確切的方法來做到這一點? – samsur 2010-04-10 16:22:06

+0

我提到的方法有三個優點,第一個是關注點分離,第二個是幾乎所有的時間表示層可能不會消耗整個DTO,所以通過量身定製表示層的對象允許您發送足夠的信息,第三是你可以在你身上完成驗證等等你發送到表示層而不是直接發送到DTO對象的自定義對象 – 2010-04-10 16:27:23

+0

舉個例子,我一般使用ASP.NET MVC,我總是創建ViewModel對象我將需要從DTO發送的數據複製到表示層,並將ViewModel對象發送到表示層。我對ViewModel對象進行驗證 – 2010-04-10 16:32:44