2014-09-04 102 views
0

我有一个MVC ASP.NET项目,我目前使用静态ViewModelHelper类,它有几个方法(1为每个视图模型),在某些参数和模型对象,并生成查看模型对象让我从我的控制器返回到我的视图。它们目前都是静态的,整个类都是无状态的,当我想实例化一个视图模型的实例时,我只是使用它,因为一些数据需要相当复杂的逻辑。寻找替代静态帮手类

这些方法在View Model类中的构造函数会更好吗?我的理解是最好不要在视图模型中有任何逻辑,但我可能是错的。或者有可能是我应该在这里用来帮助我创建这些视图模型的设计模式?

+0

ViewModels绝对可以包含逻辑。您可能会对POCO这个术语以及POCO通常没有任何逻辑的事实感到困惑 - 但ViewModel绝对是这样做的。在_Views_中使用逻辑并不是一个好主意......但绝对在为视图提供服务的模型中。 – 2014-09-04 00:50:05

回答

1

这是您的项目的架构和设计问题,您的ViewModel应该是什么样子以及它们应该在何处/如何初始化。现在看来,你的ViewModel是DTO,你可以用工厂方法初始化它们。这很好,但我建议实际上接受抽象工厂模式,并确保工厂实现不会因无关的责任而过载。这是一个“实用”类的继承问题,应该让每个开发人员都谨慎起来。另一方面,与视图有关的初始化逻辑,例如,填充选择列表,可以很好地位于ViewModels本身。在这种情况下,你应该警惕重复。

另一种可能的方法是使用构建器模式。

无论哪种方式可以是一个干净的解决方案,如果你专门使用它,而不是混合和匹配。只要你保持干净,当然。 ;)

虽然没有看到相当复杂的逻辑,但我建议你检查为什么初始化逻辑是复杂的开始。如果它真的必须。也许有些商业逻辑在那里偷偷溜走?

0

您的ViewModels应该只是DTO,只有属性的类。没有逻辑。将逻辑放在其他类(服务或完整的商业逻辑,取决于),并让他们填充ViewModel。

我知道这个答案看起来相对于实质设计考虑非常短,但这是它的核心。对于推理等,请看看一些完整的ASP.NET MVC解决方案,如https://prodinner.codeplex.com/

+2

我不得不不同意“无逻辑”作为统一规则。当然不是硬性和快速的商业逻辑 - 但绝对有一些逻辑应该进入ViewModel。例如,我们有ViewModel,它根据ViewModel满足的条件决定DOM元素应该具有哪些CSS类。他们不是企业关心的问题,他们是这个观点的关注点......但是这个逻辑在视图里面没有任何地方。 – 2014-09-04 00:55:59

+0

在某种程度上,这是正确的。 – 2014-09-04 00:58:43

+0

ViewModel确实具有与UI相关的逻辑,比如当我点击一个按钮,显示某种东西的颜色或者如何将DTO呈现给UI时。格式化的双值。 ViewModel不应该包含的逻辑就是业务逻辑,比如计算DTO中的数据的方式。 – 2017-12-12 15:07:06