我有兴趣发现开发人员用来从他们的域模型中抽象出他们的观点的不同方式。
目前,我为要在视图中使用的每个模型创建一个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来支持这个,因为我使用我的自定义转换器,将有一个从User到问题的转换链: (为简洁起见缩短了一些名字)
_userToUserViewModelConverter.Convert(userModel)
|
V
_qSubscriptionToViewModelConverter.Convert(userModel.QSubscriptions)
|
V
_questionToViewModelConverter.Convert(QSubscription.Question)
这很有效,我只是想知道其他管理方式。
我的第一个问题是,您认为我采取了正确的做法,不让我的域名模型触及我的观点吗?
其次,假设问题1为“是”,您是否会使用相同的方法让转换器执行其他转换器,或者您是否会在Controller中一次执行每个转换器?
答案 0 :(得分:4)
查看automapper中的嵌套映射:Nested mappings
这将为您节省大量时间,如果您在项目中使用ORM,映射将立即成为一块蛋糕:)
答案 1 :(得分:0)
我经常有暴露域对象的视图,在大多数情况下我认为没有任何问题。
我发现展平域对象通常会使我的观点更直接且易于理解,因为我删除了对象层次结构或至少对其进行了解析。看来您的方法是一种展平对象的方法吗?
如果你还不熟悉,我会看看AutoMapper。这是我通常用来将我的域对象展平为视图。
答案 2 :(得分:0)
我的第一个问题是,你认为我采取了正确的方法 不让我的域名模型触及我的观点?
答案是:是的,这是处理软件的正确方法,因为很多范例如MVVM,MVC,MVP,MVPVM和所有其他范例都显示,所有这些都试图解决一些问题 直接连接视图中的模型对象。
其次,对问题1假设“是”,你会使用相同的吗? 让转换器执行其他转换器的方法 你在Controller中一次做一个吗?
通常,ViewModel是View和Model之间的适配器。
因此,&gt;通常&lt;不是模型中每个类的ViewModel, 但是一个ViewModel,它表示将在视图中显示的抽象部分。
这可以是整个Formular,List,尤其是列表中的项目, 通常由模型的1..n个对象组成。但是:最有意思的一点 ViewModel是,它可以轻松获取所有形状的数据 视图绑定(绑定?)这种方式有一些简单易懂的方式 访问它需要的数据。如果设计得对,它只需要很小 如果模型更改,则更新。
关于模型是什么以及如何构建模型,有一些非常好的资源 知道变化的应用程序,即可维护和可测试的,即 很容易断言你的软件能达到预期效果。
我建议阅读:WPF Application Framework (WAF) / MVVM in layered architecture
答案 3 :(得分:0)
您还应该看一下ValueInjecter(是的,这是拼写的)。我已经使用了Automapper和ValueInjecter,发现在大多数情况下,使用ValueInjecter更容易,因为与Automapper不同,没有涉及设置。 Automapper更适合具有嵌套集合的更复杂的对象和对象。