c# - ASP.NET MVC - 使用 Automapper 进行映射

标签 c# asp.net-mvc automapper

我目前正在尝试确定何时使用 ViewModel,何时不使用。我正在使用 Automapper 完成任务,目前有以下代码:

//账户 Controller .cs

[AuthWhereRole(Roles = AuthorizeRole.Developer)]
public ActionResult List()
{
    MembershipUserCollection users = _memberShipService.GetAllUsers();
    IEnumerable<ListUsersViewModel> viewModel =
            Mapper.Map<IEnumerable<MembershipUser>, IEnumerable<ListUsersViewModel>>(users.Cast<MembershipUser>().AsEnumerable());

    return View("List", viewModel);
}

//ListUsersViewModel.cs

public class ListUsersViewModel
{
    public Guid Id { get; set; }
    public virtual string UserName { get; set; }
    public string LastLogOn { get; set; }
}

// Bootstrap .cs

public static void ConfigureAutoMapper()
{
    Mapper.CreateMap<MembershipUser, ListUsersViewModel>()
            .ForMember(x => x.UserName, o => o.MapFrom(s => s.UserName))
            .ForMember(x => x.Id, o => o.MapFrom(s => s.ProviderUserKey))
            .ForMember(x => x.LastLogOn, o => o.MapFrom(s => s.LastLoginDate));
}

我想知道这样映射是否只是为了从域模型中排除某些属性是不好的做法? - 我是否应该始终使用 View Models,即使在不需要时也是如此?

提前致谢。

最佳答案

简而言之,是的,您应该始终使用 ViewModel。

我们在我们的项目中使用 AutoMapper,最初我们没有为每个 View 提供单独的 ViewModel。我们发现,如果对象相互引用(即用户有登录,有角色有用户),我们会遇到一些性能问题。 AutoMapper 不知道何时停止构建这些集合。

虽然这在简单页面(例如您的示例中的页面)上不是问题,但我们决定为每个 View 创建一个 ViewModel,它只提供该 ViewModel 所需的属性。这解决了权限问题,也使得查看 View 所需的信息变得非常容易。

Jimmy Bogard 在博客文章中谈到了遵循此方法:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx

关于c# - ASP.NET MVC - 使用 Automapper 进行映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4608274/

相关文章:

c# - ASP.NET Web API OData - 将 DTO 查询转换为实体查询

javascript - 服务器和浏览器日期差异

c# - 如果参数为空,则查询返回所有记录

asp.net-mvc - 用于 MVC 的 Ninject 101

c# - 使用 AutoMapper 将字符串数组映射到对象

c# - 在 linq 中使用内部连接

c# - 线程池为什么要这样管理线程呢?

jquery - JSON 数据到 MVC Controller 操作结果

c# - AutoMapper - 为什么要覆盖整个对象?

c# - 如何使用 Automapper 将父对象解包为子对象?