1

我正在为我的公司开发一个新的 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 到域模型的 Automapper 配置:

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

我的控制器用于编辑项目的操作方法:

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);
}

但现在我需要自动映射器从域对象转换为 DTO [从 List(Glossary) 到 List(GlossaryModel)],与 Edit 方法相反,将数据推送到视图。所以我是否再次需要在自动映射器配置中映射相反的绑定......!喜欢

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

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

谢谢,桑杰

4

2 回答 2

2

Jimmy Bogard 也问了同样的问题。但是对它有足够的需求,因此已经为您列出的简单案例添加了直接支持。事实上,在这个答案中, Jimmy 也建议如果它对你有用,它没有任何问题。一个简单的例子是:

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

请注意,这ReverseMap不适用于更复杂的映射。有关更多详细信息,请参阅此答案

于 2013-01-09T19:56:53.077 回答
1

Automapper 是构建到域到 ViewModel(域到 DTO 以您描述的方式)的映射

@Marius 在这里的回答很好地总结了双向映射有什么问题?

在一些中型项目中,我使用了两种方式映射,对于大型项目,我使用域到视图模型映射,然后使用CQRS系统将 ViewModel 值发送到底层持久性存储。

归根结底,这取决于您如何选择使用 Automapper 以及哪些架构决策对您有意义。

如果您进行 2 路映射,世界将不会停止旋转。

于 2013-01-09T06:28:03.613 回答