通用视图模型?

我想知道尝试制作一个采用通用视图模型的视图是一种好习惯吗?

我想知道这是因为有人提到他预计必须做很多重复的代码,除非他开始制作通用视图和通用视图模型。

所以基本上这些视图就像一组控件。 一个视图可能有2个控件(比如文本框和单选按钮),另一个视图可能有50个控件。

它们都具有相同的外观和感觉(它只是通过控制数量增长)。 基本上他认为有一个视图模型接受对象(域对象)查看它并查看50个字段并呈现正确的控件类型。

我猜一个编辑模板可以用来计算出控件但是我并没有在通用视图模型上出售。

我喜欢generics,他们可以做非常强大的事情,在某些情况下他们很好,但我不是总体上对他们疯狂,并试图不使用。

我发现大多数时候它可能会减少重复的代码,但有时会使代码变得更复杂。 当然这可能只是因为我仍然是一个相对较新的编程,它可能仍然高于我的技能水平。

我遇到的下一个问题是我认为视图模型应该尽可能平坦,并且只暴露实际将要使用的数据,这样人们就不会开始使用从未在视图中出现过的属性。

我遇到的下一个问题是,如果你有一些复杂的对象,其中包含有对象的对象,它就可以继续运行。 它可能会持续很长时间。

我没有看到通用ViewModels有什么问题。 与ViewBag相比,这是一种删除重复并保持编译时检查的好方法。

例:

想象一下,您有一组ProductCategory等的模型类。每个类( ProductModelCategoryModel )都有一个关联的显示和编辑器模板,它生成适当的视图。

现在,您要构建一组用于查看和编辑的页面。

我通常创建一个布局(Web表单中的母版页)来呈现常见内容(页眉,页脚,菜单等)

然后我会创建单独的,强类型的视图,接受作为模型ProductViewModelCategoryViewModel等。

现在我们需要定义那些视图模型类。 每个视图模型类都应该采用ProductModelCategoryModel等实例(将传递给模板)。 但是布局通常需要一些额外的数据(即选择的菜单,登录的用户名等)。 我的解决方案是创建一个通用的ViewModel,它封装了Layout的这些重复数据:

 public class EntityViewModel where T : EntityModel { public T Entity { get; set; } public string UserName { get; set; } public string SelectedMenu { get; set; } } 

然后,您可以轻松创建ProductViewModel : EntityViewModel ,其中包含Layout渲染页面所需的所有内容,您可以在其中添加任何其他特定于产品的数据。

我个人避免在视图模型中使用generics。 我同意你提到的针对他们的大多数理由,特别是这个:

我遇到的下一个问题是我认为视图模型应该尽可能平坦,并且只暴露实际将要使用的数据,这样人们就不会开始使用从未在视图中出现过的属性

视图模型背后的想法是,它们需要特定地与给定视图的要求相关联,而不是像域模型那样使它们成为通用(/generics)。 我更喜欢在视图模型中复制代码,而不是在视图和部分中重复使用一些通用怪物。

即使在需要生成动态表单和控件的情况下,也不需要使用通用视图模型。

因此,除非你有一些特定于超级特定的场景(目前无法想到任何场景),否则在视图模型中避免使用generics可能是件好事。

这就是说,不要完全排除它们,如果你觉得通用视图模型有用的情况可以毫不犹豫地在这里展示,通过解释场景并显示所有代码以便我们可以讨论一下。

就ViewModel而言,我通常让我的所有ViewModelinheritance自BaseViewModel,它暴露了有助于实现MVVM的方法。 如果您想看一个例子,请在下面评论。

我真的不喜欢在viewmodel中放置业务逻辑。 我认为除了常规属性和构造函数内的error handling之外,什么都不应该在视图模型中。 它使代码更清晰,您可以更自由地添加视图模型。 如果必须使用大量重复的代码,则可以将其隔离到单独的viewmodel,然后将其嵌套在需要它的位置。 这样,您在视图中也只需要您所需的内容。