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

ebb*_*ebb 13 c# asp.net-mvc automapper

我目前正在试图找出何时使用ViewModels以及何时不使用.我正在使用Automapper执行任务,目前有以下代码:

// AccountController.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);
}
Run Code Online (Sandbox Code Playgroud)

// ListUsersViewModel.cs

public class ListUsersViewModel
{
    public Guid Id { get; set; }
    public virtual string UserName { get; set; }
    public string LastLogOn { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

// Bootstrapper.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));
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

sgr*_*usa 14

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

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

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

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


Cha*_*ell 9

这是关于AutoMapper和ViewModels的一篇很棒的文章
http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx

一些关键点.

你的问题 should I always use View Models, even when not needed?

博客文章评论说

域对象是为了满足域模型的需求而设计的,它代表了我们应用程序的域.另一方面,View Model对象是为我们的视图需求而设计的.

以下是他使用自动播放器的描述.我认为AutoMapper的想法是它将根据属性的名称映射它可以.

[HttpPost]
public ActionResult Create(ContactViewModel contactToCreate) {

if (ModelState.IsValid) {
    Contact newContact = new Contact();
    AutoMapper.Mapper.Map(contactToCreate, newContact);
    contactRepository.CreateContact(contactToCreate.GroupId, newContact);   
 }
}
Run Code Online (Sandbox Code Playgroud)