我有兴趣发现开发人员用来将他们的视图从他们的领域模型中抽象出来的不同方法。
目前,我为要在视图中使用的每个模型创建一个 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 个 ViewModels 来支持这一点,并且由于我使用我的自定义转换器,因此将有一个从用户到问题的转换链:(为简洁起见,缩短了一些名称)
_userToUserViewModelConverter.Convert(userModel)
|
V
_qSubscriptionToViewModelConverter.Convert(userModel.QSubscriptions)
|
V
_questionToViewModelConverter.Convert(QSubscription.Question)
这工作得很好,我只是想知道其他管理它的方法。
我的第一个问题是,你认为我不让我的领域模型触及我的观点是正确的方法吗?
其次,假设对问题 1 为"是",您会使用让转换器执行其他转换器的相同方法,还是在控制器中一次执行每个转换器?
查看自动映射器中的嵌套映射: 嵌套映射
这将为您节省大量时间,如果您在项目上使用ORM,映射将立即变得轻而易举:)
我的第一个问题是,你认为我采取了正确的方法吗? 不让我的域模型触及我的观点?
答案是:是的,这是处理软件的正确方法,正如许多范式,如MVVM,MVC,MVP,MVPVM和所有其他范式所显示的那样,它们都试图解决一些问题。源于在视图中直接连接模型对象。
其次,假设对问题 1 为"是",您是否使用相同的方法 让转换器执行其他转换器的方法,或者将 您在控制器中一次执行每个操作?
通常,视图模型是视图和模型之间的适配器。
因此,模型中>通常
例如,这可以是整个公式器、列表,尤其是列表中的项目,它通常由模型的 1..n 个对象组成。但是:最有趣的一点的ViewModel是,它以可以轻松的形状获取所有这些数据受视图约束(绑定?这样,视图有一些简单的可咀嚼方式访问所需的数据。如果设计得当,它只需要做小事如果模型更改,则进行更新。
关于模型是什么以及如何构建一个,有一些非常好的资源了解变化的应用程序,即可维护和可测试的应用程序,即很容易断言您的软件可以执行预期操作。
我建议阅读: 分层架构中的WPF应用程序框架(WAF)/MVVM
我经常有公开域对象的视图,我认为在大多数情况下没有任何问题。
我发现扁平化域对象通常会使我的观点更加直接和易于理解,因为我删除了对象层次结构或至少简化了对象层次结构。 看来您的方法是扁平化对象的一种方式?
如果您还不熟悉AutoMapper,我会看看它。这是我通常用于将域对象扁平化为视图的方法。
你还应该看看ValueInjecter(是的,它是这样拼写的)。我同时使用过自动映射器和ValueInjecter,并发现在大多数情况下,使用ValueInjecter更容易,因为与Automapper不同,不涉及任何设置。自动映射器更适合更复杂的对象和具有嵌套集合的对象。