我有一个业务层,其中包含在表示层中使用的DTO。该应用程序使用实体框架。
以下是名为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不是一个好主意,因为连接需要打开。以下是使用不同方法的两种不同方法:
第一种方法
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;
}
}
如果有更好的方法,请告诉我。
答案 0 :(得分:1)
最好不要将模型对象直接发送到表示层,您可以使用中间层将这些DTO对象映射到表示层所需的自定义对象。
这接近你的第二种方法,但不完全相同。