4

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

目前,我为要在视图中使用的每个模型创建一个 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 为“是”,您会使用相同的方法让转换器执行其他转换器还是在控制器中一次执行每个转换器?

4

4 回答 4

4

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

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

于 2012-06-19T18:47:47.327 回答
0

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

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

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

于 2012-06-19T18:24:19.120 回答
0

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

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

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

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

因此,>通常<不是模型中的每个类都有一个 ViewModel,而是一个代表将在视图中显示的抽象部分的 ViewModel。

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

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

我建议阅读:分层架构中的 WPF 应用程序框架 (WAF) / MVVM

于 2012-06-19T18:52:14.720 回答
0

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

于 2012-08-14T10:24:51.770 回答