2012-06-19 50 views
4

我有兴趣了解开发人员使用不同的方式将其视图从领域模型中抽象出来。将域模型类型转换为ViewModels

目前我为每个模型创建一个ViewModel,我想在视图中使用,并且我有一个转换器IConverter<TIn,TOut>来这样做。

我注意到的是,对于包含其他类型集合的类型,我有一个ViewModel用于每个类型的heirarchy和转换器,它们使用其他转换器来构建最终的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周的ViewModels支持这一因为我用我的自定义转换将有来自用户转化率的环比回落质疑: (缩短一些名字为简洁起见)

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

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

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

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

+0

这可能是一个更适合于Programmers.StackExchange的问题:http://programmers.stackexchange.com – CAbbott

+2

看看automapper。这是最快和推荐的方式。 –

回答

4

看在automapper嵌套映射:Nested mappings

这将节省您大量的时间,如果你正在使用一个项目ORM,映射将在任何时间成为小菜一碟:)

+2

+1。当我想使用数据库级对象并将它们转换为视图模型时,我使用AutoMapper。有时我只是在我的视图中使用数据库级别的对象,如果我不需要定制任何东西;但是,有时我可能需要在我的视图模型中使用其他属性,在这种情况下,我使用AutoMapper来获取基础数据。 –

+0

此外,我会建议保持你的眼睛在自动映射器维基页面上。他们将带来更强大的新功能。 :) –

+0

谢谢@ElYusubov。 AutoMapper看起来是一个不错的选择。 –

0

我经常有看到域对象的意见,我不认为在大多数情况下有什么问题。

我发现扁平化域对象通常会使我的视图更加直接和易于理解,因为我删除了对象层次结构或至少对其进行了解压缩。看来你的方法是一种扁平化你的对象的方法?

如果您不熟悉它,我会查看AutoMapper。这是我通常用来将我的域对象平铺到视图中。

0

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

答案是:是的,这是解决软件的正确方法,因为很多像MVVM,MVC,MVP,MVPVM范式和所有其它的节目,这都试图解决一些问题 直接产生在视图中连接模型对象。

其次,假设“是”对问题1,你可以使用具有转换器的相同 办法执行其它转换器或将 你做的每一个在控制器中的时间?

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

因此,对于您的模型中的每个类而言,通常不存在视图模型<,而是表示将在视图中显示的抽象部分的视图模型。

这可以是例如整个公式,列表,特别是列表中的一个项目, 通常由1..n个模型对象组成。但是:ViewModel最有趣的一点是 ,它可以将所有这些数据放在一个形状中,这个形状可以很容易地被视图绑定(绑定?)为 。通过这种方式,该视图可以轻松地通过 访问所需的数据。如果设计正确,只需在模型更改时进行小型 更新。

有它是什么模式,以及如何架构一个 应用程序,了解变化的,即维护和测试,即 容易断言,你的软件做什么,预计一些非常好的来源。

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

0

你也应该看看ValueInjecter(是的,它就是这么写)。我已经使用了Automapper和ValueInjecter,并发现在大多数情况下,使用ValueInjecter比较容易,因为不像Automapper那样涉及到设置。 Automapper更适合于嵌套集合的更复杂的对象和对象。