2010-11-30 126 views
0

一种常见的MVVM/WPF方法是将UI的控件直接数据绑定到底层模型对象。模型对象可能包含自己的验证逻辑(可能通过IDataErrorInfo公开),也可能由辅助类验证模型对象实例是否有错误进行验证。无论哪种情况,有时模型中都有无效数据,因此处于无效状态。将MVVM(WPF)与基于DDD的模型一起使用时的验证

但是,在DDD世界中,模型永远不会处于无效状态。您如何建议在使用WPF和DDD时执行验证?

感谢,

+0

在DDD中说直接绑定到MVVM中的模型? – Aliostad 2010-11-30 21:53:22

+1

如果你直接绑定到模型,你不能仅仅使用ValidationRules(甚至只是ValueConverters)来防止绑定将无效数据转发给模型吗? – Moonshield 2010-11-30 22:12:34

回答

1

我倾向于认为应该使用外观或类似层作为MVVM“模型”。该外观可能处于无效状态(不像DDD型号)。对于验证,它可以包含自己的逻辑或像FluentValidation这样的工具可以使用。一旦它处于有效状态,就可以调用它的“do action”函数。这会将外观中的数据传递给底层的DDD模型。采用这种方法,DDD模型在任何时候都不会遇到无效数据。

通过这种方法,Facade及其验证逻辑可以被多个视图/视图模型对使用,消除了当每个视图模型进行自己的验证时存在的验证逻辑重复。

1

我不认为在MVVM的视图应直接绑定到域模型,它真的应该结合视图模型来代替。然后,视图模型可处于可通过IDataErrorInfo反映的“无效”状态。仅当稍后用户操作(例如保存,确定,应用)将此应用于底层域模型时,如果域模型强制执行有效性,则还可以通过不允许在UI中进行操作来阻止应用。

尽管我必须说我发现在一定程度上重复验证逻辑并不总是很容易。

+1

您的最后一段提到了这种方法带来的负面影响 - 验证逻辑成为特定于虚拟机的事实,并倾向于最终在与相同基础模型交互的每个虚拟机中重复。 – 2010-12-02 16:11:12

0

验证属于您的业务逻辑(域模型)。我建议看一看.NET的FluentValidation

我已经有了ViewModel setter调用底层Model对象并让FluentValidation抛出异常的好运气。如果您使用的是WPF文本框,则绑定将继续工作,但TextBox将显示一个红色轮廓(假设您已经使用TextBox在每次击键时更新ViewModel的语法)。只是不要在getter中抛出异常,否则你会破坏绑定。

最好是将所有通信从ViewModel路由到某个中介(我介绍了一个Presenter,但这可以像将lambda传递给某个中介上的回调一样简单)。当在模型上操作时发生异常时,Presenter捕获异常并向用户显示一条友好的消息,其中包含异常的详细信息。 FluentValidation为此目的生成非常好的默认错误消息。