我想知道尝试制作一个采用通用视图模型的视图是一种好习惯吗?
我想知道这是因为有人提到他预计必须做很多重复的代码,除非他开始制作通用视图和通用视图模型。
所以基本上这些视图就像一组控件。一个视图可能有2个控件(比如文本框和单选按钮),另一个视图可能有50个控件。
它们都具有相同的外观和感觉(它只是通过控件的数量增长)。基本上他认为有一个视图模型接受对象(域对象)查看它并查看50个字段并呈现正确的控件类型。
我猜一个编辑模板可以用来计算控件但是我不会在通用视图模型上出售。
我喜欢泛型,他们可以做非常强大的事情,在某些情况下他们很好,但我不是总是对他们疯狂,并试图不使用。
我发现大部分时间它可能会减少重复代码,但有时会使代码变得更复杂。当然这可能只是因为我仍然是一个相对较新的编程,它可能仍然高于我的技能水平。
我遇到的下一个问题是我认为视图模型应该尽可能平坦,并且只暴露实际将要使用的数据,这样人们就不会开始使用从未在视图中使用过的属性了。第一名。
我遇到的下一个问题是,如果你有一些复杂的对象,其中包含有对象的对象,它就可以继续运行。它可能会持续很长时间。
答案 0 :(得分:5)
我个人避免在视图模型中使用泛型。我同意你提到的针对他们的大多数理由,尤其是这一理由:
我遇到的下一个问题是我 认为视图模型应该是 尽可能平坦,只暴露数据 实际上这将被使用 人们不会开始使用属性 这应该永远不会出现在视图中 第一个地方
视图模型背后的想法是,它们需要特定地与给定视图的要求相关联,而不是像域模型那样使它们成为通用(/泛型)。我更喜欢在视图模型中复制代码,而不是在视图和局部视图中重复使用一些通用怪物。
即使您需要generate dynamic forms and controls,也不需要使用通用视图模型。
所以,除非你有一些特定于超级特定的场景(目前无法想到任何场景),否则在视图模型中避免使用泛型可能是一件好事。
这就是说,不要完全排除它们,如果你觉得通用视图模型有用的话可以毫不犹豫地在这里展示,通过解释场景并显示所有代码我们可以讨论它。
答案 1 :(得分:3)
我认为通用ViewModel没有任何问题。与ViewBag相反,这是一种删除重复并保持编译时检查的好方法。
示例:强>
想象一下,您有Product
,Category
等一组模型类。
每个类(ProductModel
,CategoryModel
)都有一个关联的显示和编辑器模板,可以生成适当的视图。
现在您要构建一组用于查看和编辑的页面。
我通常会创建一个布局(Web表单中的母版页)来呈现常用内容(页眉,页脚,菜单等)
然后我会创建单独的,强类型的视图,接受模型ProductViewModel
,CategoryViewModel
等。
现在我们需要定义那些视图模型类。每个视图模型类都应该使用ProductModel
,CategoryModel
等实例(将传递给模板)。但是布局通常需要一些额外的数据(即选择的菜单,登录的用户名等)。我的解决方案是创建一个通用的ViewModel,它封装了Layout的重复数据:
public class EntityViewModel<T>
where T : EntityModel
{
public T Entity { get; set; }
public string UserName { get; set; }
public string SelectedMenu { get; set; }
}
然后,您可以轻松创建ProductViewModel : EntityViewModel<ProductModel>
,其中包含布局呈现页面所需的所有内容,您可以在其中添加任何其他特定于产品的数据。
答案 2 :(得分:1)
就ViewModel而言,我通常让我的所有ViewModel继承自BaseViewModel,它暴露了有助于实现MVVM的方法。如果您想看一个例子,请在下面发表评论。
答案 3 :(得分:0)
我真的不喜欢在viewmodel中放置业务逻辑。我认为除了常规属性和构造函数内的错误处理之外,什么都不应该在视图模型中。它使代码更清晰,您可以更自由地添加视图模型。 如果你有很多重复的代码,你可以将它隔离到单独的viewmodel,然后将它嵌套在你需要的地方。 这样,您的视图中也只有您需要的内容。