【问题标题】:how to optimize code for automatic Mapping?如何优化自动映射的代码?
【发布时间】:2011-10-03 08:21:27
【问题描述】:

我想在下面的代码中使用 AutoMapper 之类的东西,而不是手动映射。

我有两个表 User 和 Role 并且都映射了 RoleID。 现在的问题是如果我从用户那里获取记录,那么它只会给我 RoleID 而不是 角色名称。所以我尝试使用自定义类获取结果并使用 for 循环(手动)映射每个实体。

任何人都可以帮助将此手动代码优化为自动。因为我有超过 15 个关系表。

// M O D E L
public class RoleModel : IRoleModel
{
    public Guid RoleID { get; set; }
    public string RoleName { get; set; }
    public string Description { get; set; }
}
public class UserModel : IUserModel
{
    public Guid UserID { get; set; }
    public Guid RoleID { get; set; }
    public string UserName { get; set; }
}
public class UserRoleModel
{
    public Guid UserID { get; set; }
    public string UserName { get; set; }
    public string Description { get; set; }
    public Guid RoleID { get; set; }
    public string RoleName { get; set; }
}
// C O N T R O L L E R
public class UsersController : Controller
{
    private IUserService _UserService;
    public UsersController()
        : this(new UserService())
    {
    }
    public UsersController(IUserService UserService)
    {
        _UserService = UserService;
    }
    public ActionResult Index()
    {
        IList<UserRoleModel> users = _UserService.GetUsersWithRole();
        return View(users);
    }
    public ActionResult Create()
    {
        return View();
    }
}
// S E R V I C E
public class UserService : ServiceBase<IUserService, User>, IUserService
{
    private IUserRepository _UserRepository;
    public UserService()
        : this(new UserRepository())
    {
    }
    public UserService(IUserRepository UserRepository)
    {
        _UserRepository = UserRepository ?? new UserRepository();
    }
    public IList<UserRoleModel> GetUsersWithRole()
    {
        IList<User> users = _UserRepository.GetAll();
        IList<UserRoleModel> userswithrol = new List<UserRoleModel>();
        /* I would like to use AUTO MAPPER instead of MANUAL MAPPING*/
        foreach (User u in users)
        {
            UserRoleModel ur = new UserRoleModel();
            ur.UserID = u.UserID;
            ur.UserName = u.UserName;
            ur.Description = u.Description;
            ur.RoleID = u.RoleID.Value;
            ur.RoleName = u.Role.RoleName;
            userswithrol.Add(ur);
        }
        /**/
        return userswithrol;
    }
    private IList<UserModel> GetAll()
    {
        IEnumerable<User> alliance;
        if (whereCondition != null)
            alliance = _UserRepository.GetAll(whereCondition);
        else
            alliance = _UserRepository.GetAll();
        UserListModel model = new UserListModel();
        model.UserList = new List<UserModel>();
        AutoMapper.Mapper.CreateMap<User, UserModel>().ForMember(dest => dest.UserID, opt => opt.MapFrom(src => src.UserID));
        model.UserList = AutoMapper.Mapper.Map(alliance, model.UserList);
        return model.UserList;
    }
}

任何答案将不胜感激!
谢谢,
伊姆达杜森

【问题讨论】:

  • 我试过UserRoleModel model = new UserRoleModel(); AutoMapper.Mapper.CreateMap&lt;User, UserRoleModel&gt;().ForMember(dest =&gt; dest.UserID, opt =&gt; opt.MapFrom(src =&gt; src.UserID)); model= AutoMapper.Mapper.Map(alliance, UserRoleModel); 但它会给我一个错误

标签: asp.net-mvc-3 entity-framework-4 repository-pattern


【解决方案1】:

我已经使用以下解决方案解决了这个问题:

public IList<UserRoleModel> GetUsersWithRole()
        {
            IList<User> users = _UserRepository.GetAll();
            IList<UserRoleModel> userswithrol = new List<UserRoleModel>();
            AutoMapper.Mapper.CreateMap<User, UserRoleModel>()
                .ForMember(d => d.UserID, o => o.MapFrom(s => s.UserID))
                .ForMember(d => d.RoleName, o => o.MapFrom(s => s.Role.RoleName));
            userswithrol = AutoMapper.Mapper.Map(users, userswithrol);
            return userswithrol;
        }

注意:我刚刚添加了一行代码来实现所需的输出

 .ForMember(d => d.RoleName, o => o.MapFrom(s => s.Role.RoleName))

谢谢,
伊姆达杜森

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2017-02-18
    • 2023-04-05
    • 1970-01-01
    • 2012-09-27
    • 2014-08-31
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多