c# - 使用 Automapper 将域对象转换为 ViewModel,反之亦然

标签 c# asp.net-mvc-4 automapper

我正在为我的公司开发一个新的 MVC 站点,并且对如何创建从 Domain/POCO 对象到 ViewModel 类 [包含验证] 的映射感到困惑,反之亦然。这是一个示例。

我的域类[只是为了简单起见,我省略了其他属性]:

public partial class Glossary
{
    public int Id { get; set; }
    public string GlossaryItem { get; set; }
    public string Definition { get; set; }
}

我的 MVC 应用程序模型文件夹中的 ViewModel 类 [具有相应的验证]:

public class GlossaryModel
{
    [HiddenInput(DisplayValue = false)]
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a GlossaryItem")]
    public string GlossaryItem { get; set; }

    [Required(ErrorMessage = "Please enter a Definition")]
    public string Definition { get; set; }
}

我的 DTO 到域模型的自动映射器配置:

protected override void Configure()
{
     CreateMap<GlossaryModel, Glossary>();
     //....... etc
}

我的 Controller 编辑项目的操作方法:

public class GlossaryController : Controller
{
    IGlossaryRepository _glossaryRepository;
    IMappingService _mappingService;

    public GlossaryController(IGlossaryRepository glossaryRepository, IMappingService autoMapperMappingService)
    {
        _glossaryRepository = glossaryRepository;
        _mappingService = autoMapperMappingService;
    }

    // .... etc

    [HttpPost, ValidateAntiForgeryToken]
    public virtual ActionResult Edit(GlossaryModel glossaryModel)
    {
        if (ModelState.IsValid)
        {
            var glossary = _mappingService.Map<GlossaryModel, Glossary>(glossaryModel);
            if (glossaryModel.Id <= 0)
                _glossaryRepository.Add(glossary);
            else
                _glossaryRepository.Edit(glossary);
            _glossaryRepository.Save();
            TempData["message"] = string.Format("{0} has been saved", glossaryModel.Definition);
            return RedirectToAction("All");
        }
        return View(glossaryModel);
    }

    //....etc
 }

它工作正常,但我的问题是......现在假设我需要一个操作来列出所有术语表项目,例如..

public ActionResult All()
{
    var allItems = _glossaryRepository.Glossary;
    if (allItems.Count() == 0) return View(new List<GlossaryModel>());
    // **The below line is the reverse mapping one**
    var allItemsModel = _mappingService.Map<IEnumerable<Glossary>, IEnumerable<GlossaryModel>>(allItems);
    return View(allItemsModel);
}

但现在我需要自动映射器从 Domain 对象转换为 DTO [从 List(Glossary) 到 List(GlossaryModel)],与 Edit 方法相反,将数据推送到 View 。那么我是否需要再次在自动映射器配置中映射相反的绑定(bind)......!!就像

protected override void Configure()
{
     CreateMap<GlossaryModel, Glossary>(); // Added before for DTO to Domain object 
     CreateMap<Glossary, GlossaryModel>();// Added for Domain object to DTO
     //....... etc
}

双向绑定(bind)是一个好的设计吗?或者我缺少更好的解决方案,请帮忙

谢谢, 桑杰

最佳答案

Jimmy Bogard 还询问了 same question 。但有足够的需求来直接支持has been added对于像您列出的简单情况。事实上,在 this answer吉米还建议,如果它对你有用的话就没有什么问题。一个简单的例子是:

protected override void Configure()
{
    CreateMap<GlossaryModel, Glossary>()
        .ReverseMap();
    //....... etc
}

请注意,ReverseMap 不适用于更复杂的映射。请参阅this answer了解更多详情。

关于c# - 使用 Automapper 将域对象转换为 ViewModel,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229166/

相关文章:

c# - Automapper MapsTo 属性不适用于引用的类

C# : size in properties is diffrent from code

c# - 将 USSD 代码发送到 C# 中的调制解调器,并始终返回 ERROR

c# - 具有非 bool 值的 MVC CheckBoxList 模型绑定(bind)

javascript - 触发不显眼的验证,但阻止在 mvc4 表单上提交

asp.net - Automapper ninject 依赖项

automapper - 从 Automapper 映射 IQueryable 类

c# - 当目标设置为异步时,NLog 不会刷新缓冲日志

c# - 声音频率检测?

c# - MVC中如何使用多个路由