ASP.NET MVC N-Tier应用程序与WCF和实体框架高效加载

时间:2013-06-24 08:38:02

标签: asp.net-mvc wcf entity-framework

我正在寻求一些有关使用实体框架的建议,以及从MVC应用程序调用的WCF服务。

我有一个ASP.NET MVC Web应用程序作为表示层,它调用WCF服务,该服务执行所有数据操作。 WCF应用程序使用实体框架在DB上执行操作。

问题在于,根据正在呈现的页面,数据库所需的信息将发生变化,例如,如果我想显示所有用户的列表,我可能只想要他们的用户名,但WCF服务将返回整个模型,当处理大量记录时,这显然变得非常低效。

有没有办法提高效率,需要以某种方式在Linq语句中指定Include和Select的值

1 个答案:

答案 0 :(得分:1)

如果我说得对,你实际上是在说ModelsViews的需求不符。

这是(原因之一)为什么人们使用Data Transfer Objects (DTO)作为从数据服务返回的对象,而不是实体本身。

通常,您需要project / map您的实体加入DTO对象。

  

例如,如果我想显示我可能只是的所有用户的列表   想要他们的用户名,但WCF服务将返回整个模型

对于这种特殊情况,你可以尝试这样的事情:

// Your 'User' Entity
public class User : BaseEntity
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Phone> Phones { get; set; }
}

// Base class for all 'Mappable' DTOs
public abstract class Mappable<ENTITY, DTO> where ENTITY : BaseEntity
{
    public abstract DTO ToDTO(ENTITY entity);
}

// Your DTO (specific to your grid needs)
public class UsersGridDTO : Mappable<User, UsersGridDTO>
{
    public int Id { get; set; }
    public string Username { get; set; }

    public override UsersGridDTO ToDTO(User entity)
    {
        return new UsersGridDTO
        {
            Id = entity.Id,
            Username = entity.Username
        };
    }
}

// In your WCF data service
public IEnumerable<DTO> GetData<DTO>() where DTO : Mappable<Entity, DTO>, new()
{
    return efContext.Users.Select(new DTO().ToDTO);
}

此外,使用Asp.Net MVC时,DTO 也可用作ViewModels(请参阅here)。

你也可以使用像AutoMapper这样可以为你处理实体到DTO映射的框架。