【问题标题】:How should AutoMapper access my DAL?AutoMapper 应该如何访问我的 DAL?
【发布时间】:2011-04-12 14:34:40
【问题描述】:

我有一个带有ProjectId 属性的InvoiceInputModel,它是对Project 实体的引用。理想情况下,我希望 AutoMapper 能够从 InvoiceInputModel 映射整个 Invoice 实体,如下所示:

public class InvoiceInputModel
{
    public Guid Id { get; set; }
    public DateTime Date { get; set; }
    public string Reference { get; set; }
    public Guid ProjectId { get; set; }
}

显然以下是不好的:

Mapper.CreateMap<InvoiceInputModel, Invoice>()
    .ForMember(src => src.Project, opt => opt.MapFrom(
        dest => _unitOfWork.CurrentSession.Get<Project>(dest.ProjectId)
    )
);

我如何告诉 AutoMapper invoice.Project 应该根据 InvoiceInputModel 中的 ProjectId 属性映射到 Project 实体,同时保持松散耦合?

发票/编辑在我的InvoiceController:

[HttpPost]
[Authorize]
public ActionResult Edit(InvoiceInputModel invoiceInputModel)
{
    var invoice = _unitOfWork.CurrentSession.Get<Invoice>(invoiceInputModel.Id);

    Mapper.Map<InvoiceInputModel, Invoice>(invoiceInputModel, invoice);

    invoice.Project = _unitOfWork.CurrentSession.Get<Project>(invoiceInputModel.ProjectId);
    // I want AutoMapper to do the above.

    _unitOfWork.CurrentSession.SaveOrUpdate(invoice);
    _unitOfWork.Commit();

    return View(invoice);
}

我发现了一些关于“解析器”和 ResolveUsing 的内容,但我没有使用它的经验。

如何告诉 AutoMapper 执行此操作,同时保持实体模型、输入模型和视图模型之间的松散耦合?还是有更好的办法?

【问题讨论】:

    标签: asp.net-mvc fluent-nhibernate automapper loose-coupling


    【解决方案1】:

    如何告诉 AutoMapper invoice.Project 应该根据 InvoiceInputModel 中的 ProjectId 属性映射到 Project 实体,同时保持松散耦合?

    你不能。如果 AutoMapper 要去其他地方获取数据,那么它就不是松耦合的。

    无论如何,您都没有在此特定视图中修改Project - 为什么需要将关系设置为Project,nHibernate 不够聪明,无法看到该属性没有改变,也没有做任何事情?

    【讨论】:

      【解决方案2】:

      我个人在视图模型中有实体而不是 ID,因此绑定会自动发生。

      http://sprokhorenko.blogspot.com/2011/03/bind-to-entity-id.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-27
        • 2011-02-19
        • 1970-01-01
        • 2010-10-24
        • 2011-09-15
        • 2021-05-29
        • 2012-10-27
        • 2012-06-09
        相关资源
        最近更新 更多