什么是在MVVM中实现逻辑验证的好方法?
我正在使用MVVM模式来创建一个带有WPF GUI的.Net软件。使用IDataErrorInfo对属性进行验证,所有字段都点亮。不过,我正在寻找一种实现某种业务逻辑的好方法。什么是在MVVM中实现逻辑验证的好方法?
简单的例子;如果您有一个包含列的表,我使用IDataErrorInfo接口来检查名称是否为空/有效。但我也想确保列名是唯一的。也可能是该列在其他地方正在使用,因此无法删除。
关于如何使用MVVM实现业务逻辑的任何建议?一直在环顾四周,似乎无法找到'''的解决方案。
我想推荐这本书(链接到Amazon.com): Building Enterprise Applications with Windows Presentation Foundation and the Model View ViewModel Pattern
虽然它只是在其标题MVVM,它提供了范围广泛的议题以及可能的方式来组织和结构应用。
我发现了很多有用的想法和建议。
我看到的唯一缺点是它不会太深入单个主题。另一方面,您可以快速阅读并且不需要按顺序阅读每章,而是专注于您所寻找的内容。
这本书可以帮助您了解您想知道的内容的总体概念,以及您可能稍后进一步深入的良好起点。
目前我有一本MVVM书http://www.amazon.com/Developers-Guide-Microsoft-Prism-Applications/dp/073565610X/;不知道这些书是否有很大的不同。这本书我有,我似乎无法找到一个好的解决方案 – ferdyh 2012-02-09 13:31:44
@Ferdy:亚马逊链接提供了一个“看看里面”。您可能需要查看目录,将其与您已有的图书进行比较。我特别想到第5章“业务层”,它提出了构建它的一些考虑。 – 2012-02-09 14:20:47
使用MVVM模式时,业务逻辑的位置总是很困难。问题始终是View Model还是Model?
我想这取决于你在哪里检查重复。
如果您试图阻止用户复制View中显示的数据,那么您可以在关联的View Model中进行检查。
如果您试图阻止用户复制模型中或相关数据层(读取数据库)中存在的数据,则应在模型域内执行该数据。
您需要牢记的唯一一件事就是您的代码将数据提交给View,以了解是否存在重复问题,但由View决定是否提供该数据。
很多时候,我将大量的业务逻辑和'助手'函数放在一个单独的类库项目中,并从最好的位置调用功能。这可以更轻松地将功能从视图模型切换到模型,反之亦然。
你见过msdn MVVM模式页吗?看看here。
请记住,尽管如此,所有的事情都需要采取实用的方法。可能有些情况下,将视觉业务逻辑放置在View代码后面,但应始终保持在最低限度。
+1提到将代码放置在单独的lib中。我经常见到人们盲目地坚持使用MVVM导致虚拟机和/或M成长为尴尬的上帝对象,因为他们认为*所有*必须是3个类中的一个(V VM或M) – stijn 2012-02-09 08:52:38
在我使用WPF和Silverlight内的MVVM时,业务逻辑通常在可通过各种消费者的服务访问的域层中实现得更深。就以这种更抽象的方式实施域逻辑而言,根据应用程序的复杂性以及您的业务规则的动态性,存在无数选项。
有人会说域对象的验证应该发生在IOC可注入验证服务中,而不是被烘焙到域对象本身中(除非它绝对是核心的,不变的逻辑到你的域)。
我通常会发现这种方法有点矫枉过正。你可以让你的域对象实现某种验证接口,这可能会通过整个对象图链接验证。领域对象可以采用烘焙或动态的方式征集可共享的业务规则,例如,一个规则,用于检查域对象及其相关对象的状态,并将条目添加到一组破坏的业务规则中。
那么我的实现它的问题更深层的是,我通常喜欢使用现有的功能;例如,WPF使用IDataErrorInfo接口为错误标记字段。不知何故,我想为我的业务逻辑验证钩住。 – ferdyh 2012-02-09 09:10:22
经过一番搜索互联网后,我发现这个网站:http://rachel53461.wordpress.com/2012/01/22/validating-business-rules-in-mvvm/;他们采用了一种有趣的方法,使用IDataErrorInfo接口将业务逻辑验证相结合。任何人都有这种方法的经验? – ferdyh 2012-02-09 09:06:00