【问题标题】:ASP. NET MVC: Mapping Entities to View ModelASP。 NET MVC:将实体映射到视图模型
【发布时间】:2010-02-16 07:16:53
【问题描述】:

我正在尝试通过使用视图模型来清理 ASP.NET MVC 项目中的操作方法。目前,我的视图模型包含可能与其他实体有关系的实体。例如,ContactViewModel 类可能有一个联系人,它可能有一个地址,两者都是独立的实体。要查询联系人对象列表,我可能会执行以下操作。

IList<Contact> contacts;

using (IContactRepository repository = new ContactRepository())
{
    contacts = repository.Fetch().ToList();
}

EditContactViewModel vm = new EditContactViewModel(contacts);

return View(vm);

这种方法会带来一些问题。例如,在 using 语句中查询存储库。在视图呈现时,上下文已经超出范围,使得视图无法查询与联系人关联的地址。我可以启用急切加载,但我不想这样做。此外,我不喜欢实体模型渗透到我的视图中(我觉得让我的视图了解联系人和地址之间的关系是个坏主意,但请随意不同意我的观点)。

我考虑过创建一个包含来自 Contact 和 Address 实体的属性的增肥类。然后我可以将 Contact 和 Address 实体投影到我的新扁平对象中。我对这种方法的一个担忧是我的操作方法可能会有点忙,我不认为 AutoMapper 能够将两个或多个对象映射到单一类型。

什么技术是/是首选的克服我的顾虑?

【问题讨论】:

    标签: asp.net-mvc design-patterns methodology automapper


    【解决方案1】:

    Automapper 将适用于您的情况。你有的是一个对象图,一个东西有更多的东西,Automapper 处理得很好。

    【讨论】:

    • 非常酷。我还是 AutoMapper 的新手,所以我什至不知道它可以像那样映射。非常感谢。
    【解决方案2】:

    按顺序处理这些问题...

    首先,如果你担心 using 语句和存储库(我不知道是 LINQ-to-SQL 还是 LINQ-to-Entities,但没关系),我会推荐你​​什么要做的是在您的控制器上实现 IDisposable,然后将存储库存储在模型或控制器上的字段中或您可以在视图中访问它的某个位置(如果您需要它,如果模型知道它,而对象是“活着的”,那么你只需要在控制器的生命周期内保留它)。

    然后,当请求完成时,将调用控制器上的 Dispose 方法,您可以在那里释放存储库。

    就我个人而言,我的基本控制器类有一个方法,如下所示:

    protected T AddDisposable<T>(T disposable) where T : class, IDisposable
    {
        // Error checking.
        if (disposable == null) throw new ArgumentNullException("disposable");
    
        // Add to list
        ...
    }
    

    基本上,它允许您存储 IDisposable 实现,然后在控制器的 IDisposable 实现中,它遍历列表,处理所有内容。

    关于实体模型上地址的暴露,我个人认为这不是一个出血问题。该地址是联系人 (IMO) 组合的一部分,因此将它放在那里是错误的。

    但是,如果您不希望它在那里,我不反对,因为您想一次专注于一个控制器中的一种类型,等等。

    为此,您需要创建数据传输对象,这些对象基本上在您在视图模型中公开的类型和您的实体模型之间进行映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2016-04-29
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      相关资源
      最近更新 更多