在MVVM中实现逻辑验证的好方法是什么?

时间:2012-02-09 08:24:31

标签: .net wpf validation mvvm

我正在使用MVVM Pattern来创建一个带有WPF GUI的.Net软件。使用IDataErrorInfo可以很好地验证属性,其中所有字段都会亮起。但是,我正在寻找一种实现某种业务逻辑的好方法。

简单的例子;如果你有一个包含列的表,我使用IDataErrorInfo接口来检查名称是否为空/有效。但我也想确保列名是唯一的。也可能是该列正在其他地方使用,因此无法删除。

有关如何使用MVVM实现业务逻辑的任何建议?一直在四处寻找,似乎找不到“解决方案”。

3 个答案:

答案 0 :(得分:2)

使用MVVM模式时,业务逻辑的位置始终是一个困难的位置。问题始终是View Model还是Model?

我想这取决于您检查重复的位置。

如果您试图阻止用户复制视图中显示的数据,那么您将在相关的视图模型中进行检查。

如果您试图阻止用户复制模型内或关联数据层(读取数据库)中存在的数据,则应在模型域中执行。

您唯一需要记住的是,您的代码会向View提供有关复制的数据,但由View决定是否提供复制。

我经常将大量的业务逻辑和“帮助”函数放在一个单独的类库项目中,并从最好的地方调用功能。这样可以更轻松地将功能从视图模型切换到模型,反之亦然。

您是否看过msdn MVVM模式页面?看看here

请记住,尽管如此,需要采取务实的方法。有时可能会在后面的View代码中放置适当的业务逻辑,但应始终将其保持在最低限度。

答案 1 :(得分:1)

我想推荐这本书(链接到Amazon.com): Building Enterprise Applications with Windows Presentation Foundation and the Model View ViewModel Pattern

虽然它的标题中只包含MVVM,但它提供了广泛的主题以及组织和构建应用程序的可能方法。

我发现了很多有用的想法和建议。

我看到的唯一缺点是它并没有深入到单一主题。另一方面,您可以快速阅读,无需按顺序阅读每一章,而是专注于您所寻找的内容。

这本书可以帮助您大致了解您想要了解的内容,以及您可能会在以后深入了解的良好起点。

答案 2 :(得分:0)

在WPF和Silverlight中使用MVVM时,业务逻辑通常在域层中更深层次地实现,可通过各种消费者通过服务访问。至于以这种更抽象的方式实现域逻辑,根据应用程序的复杂性以及业务规则的动态性,有无穷无尽的选项。

有人会说,域对象的验证应该在IOC可注入验证服务中进行,而不是被束缚到域对象本身(除非它对你的域是绝对核心的,不变的逻辑)。

我一般认为这种做法有点矫枉过正。您可以让您的域对象实现某种验证接口,这可能会将验证链接到整个对象图。域对象可以以烘焙或动态方式登记在可共享的业务规则中,例如,一个规则,用于检查域对象及其相关对象的状态,并将一个条目添加到一组已损坏的业务规则中。