【问题标题】:Converting Domain Model types to ViewModels将领域模型类型转换为 ViewModel
【发布时间】:2012-06-21 19:27:03
【问题描述】:

我有兴趣发现开发人员用来将他们的视图从他们的领域模型中抽象出来的不同方式。

目前,我为要在视图中使用的每个模型创建一个 ViewModel,并且我有一个转换器 IConverter<TIn,TOut> 来执行此操作。

我注意到的是,对于包含其他类型集合的类型,我为层次结构中的每种类型都有一个 ViewModel,而转换器使用其他转换器来构建最终的 ViewModel。

举个例子:

假设我有这个使用 FluentNHibernate 构建的域模型结构:

public class User
{
 [...]
   public virtual IEnumerable<QuestionSubscription> QuestionSubscriptions{get;set;}
}

public class QuestionSubscription
{
   public virtual bool VerifiedSubscription{get;set;} 
   public virtual Question Question{get;set;}
}

鉴于我的工作方式,我将拥有 3 个 ViewModel 来支持这一点,并且由于我使用我的自定义转换器,因此将有一个从用户到问题的转换链: (为简洁起见缩短了一些名称)

_userToUserViewModelConverter.Convert(userModel)
              |
              V 
              _qSubscriptionToViewModelConverter.Convert(userModel.QSubscriptions)
                   |
                   V
                  _questionToViewModelConverter.Convert(QSubscription.Question)

这很好用,我只是想知道其他管理方法。

我的第一个问题是,你认为我不让我的领域模型触及我的观点是正确的做法吗?

其次,假设问题 1 为“是”,您会使用相同的方法让转换器执行其他转换器还是在 Controller 中一次执行一个?

【问题讨论】:

  • 这可能是一个更适合 Programmers.StackExchange 的问题:programmers.stackexchange.com
  • 看看 automapper。这是最快且推荐的方式。

标签: c# asp.net-mvc architecture type-conversion viewmodel


【解决方案1】:

查看 automapper 中的嵌套映射:Nested mappings

这将为您节省大量时间,如果您在项目中使用 ORM,映射将很快成为小菜一碟 :)

【讨论】:

  • +1。当我想获取数据库级对象并将它们转换为视图模型时,我使用 AutoMapper。有时,如果我不需要自定义任何东西,我只是在视图中使用数据库级别的对象;但是,有时我可能希望在我的视图模型中使用一个额外的属性,在这种情况下我使用 AutoMapper 来获取基础数据。
  • 另外,我建议您密切关注 auto-mapper wiki 页面。它们带有新的更强大的功能。 :)
【解决方案2】:

我的第一个问题是,你认为我采取了正确的方法吗? 不让我的领域模型触及我的视图?

答案是:是的,这是解决软件问题的正确方法,正如 MVVM、MVC、MVP、MVPVM 等许多范例所展示的那样,它们都试图解决一些问题 直接连接视图中的模型对象。

其次,假设问题 1 是“是”,你会使用相同的 让转换器执行其他转换器的方法或将 你在 Controller 中一次做一个?

通常,ViewModel 是 View 和 Model 之间的适配器。

因此,>通常

这可以是整个公式、列表,尤其是列表中的一个项目, 它通常由模型的 1..n 个对象组成。但是:最有趣的一点 ViewModel 的特点是,它可以轻松地将所有这些数据获取到一个形状中 被视图绑定(绑定?)。这种方式视图有一些简单的可咀嚼方式 访问它需要的数据。如果设计得当,它只需要做得很小 如果模型发生变化,则更新。

关于模型是什么以及如何构建模型,有一些非常好的资源 知道变化的应用程序,即可维护和可测试的,即 很容易断言您的软件符合预期。

我建议阅读:WPF Application Framework (WAF) / MVVM in layered architecture

【讨论】:

    【解决方案3】:

    我经常有暴露领域对象的视图,我认为在大多数情况下这没有什么问题。

    我发现扁平化域对象通常使我的观点更直接和易于理解,因为我删除了对象层次结构或至少简化了它。看来您的方法是一种扁平化对象的方法?

    如果您还不熟悉AutoMapper,我会看看它。这是我通常用来将我的域对象扁平化为视图的方法。

    【讨论】:

      【解决方案4】:

      您还应该看看ValueInjecter(是的,它是这样拼写的)。我同时使用了 Automapper 和 ValueInjecter,发现在大多数情况下,使用 ValueInjecter 更容易,因为它不像 Automapper 那样涉及设置。 Automapper 更适合更复杂的对象和具有嵌套集合的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多