C# MVPVM-使用接口或演示者进行事件处理

C# MVPVM-使用接口或演示者进行事件处理,c#,winforms,design-patterns,mvvm,mvp,C#,Winforms,Design Patterns,Mvvm,Mvp,处理按钮点击、行双击等事件。什么是更好的方法 演示者可直接访问以查看。因此视图可以直接调用演示者上的相应方法,例如presenter.Save() 或 接口中的事件 interface ILoginDetailView: { event EventHandler Save; } 看法 演讲者 view.Save += new EventHandler(view_Save); 我觉得第二种方法更好,因为它使视图与演示者分离。但是,在所有描述模式的文章/论文中,都使用了第一

处理按钮点击、行双击等事件。什么是更好的方法

演示者可直接访问以查看。因此视图可以直接调用演示者上的相应方法,例如
presenter.Save()

接口中的事件

interface ILoginDetailView:
{
   event EventHandler Save;        
}
看法

演讲者

view.Save += new EventHandler(view_Save);

我觉得第二种方法更好,因为它使视图与演示者分离。但是,在所有描述模式的文章/论文中,都使用了第一种方法。

我也会使用第二种方法,因为正如您所说的那样,这将使视图与演示者分离,从而使这些内容可测试。

就我个人而言,我总是使用第二种方法。一般来说,我不喜欢让视图了解演示者,解耦是一个很大的优势。否则,我会发现自己在创建函数时会从视图中获取特定变量。事件模式很好地打破了这一点。

我认为第一种方法更干净

一次扑救并不像是一件大事。这是直接的行动

在MVVM中,您在viewmodel上调用命令;在MVC中,您在控制器上调用操作;在MVP中,您在presenter上调用方法

保存或保存是一个事件,但不是保存

但这可能是关于个人偏好的问题。

在MVPVM(模型-视图-演示者-视图-模型)模式中,说明视图通常与您的视图紧密耦合。这允许视图模型、视图和业务/数据访问层保持解耦

因此,再次强调的是,演示者可以严格控制以允许直接访问视图,而无需为视图模型或视图增加责任


这是一篇很棒的文章,对MVC、MVP、MVVM和MVPVM进行了很好的讨论。

“这反过来使这些东西可测试”第二种方法如何使您具有更高的可测试性?@PeterPorfy您可以为
ILoginDetailView
创建一个模型,因此无需真正实例化视图。相反,模型可以完全按照您希望的方式运行,以测试ViewModel。在使用第一种方法时两者都不一样。在我的演示者上调用Save方法或从模拟视图触发事件时,我看不出测试有什么不同。第二个是更多的工作,没有附加值。@PeterPorfy当此接口的唯一目的是提供对视图事件的访问时,您是对的。当使用接口从视图访问其他部分时(无论出于何种原因),这将使该部分的测试更容易…这只是语义。。。他可以称之为视图。保存按钮点击。。。那么你的答案是什么?是的,他可以称之为DoSomething。但这并不重要,因为问题是他应该使用事件还是演示者方法。我只是觉得有可以模仿的界面更干净。TDD和所有这些。。。硬约束视图对我来说是一种廉价的出路。你现在有了一个视图,它不再是一个愚蠢的视图了。@Heliac请阅读Spontifixus在文章中的评论。你对可测试性有什么问题?实际上,演示者在这两个方面都有一个IView界面。为什么您认为测试事件订阅比测试方法调用更容易?我在TDD+MVP中做了很多工作,在这些情况下测试没有什么不同,事件变化只是一个额外的步骤,没有额外的值就给耦合留下错误的印象。这就是我所说的。事件模型有点松散耦合,但视图知道presenter方法更干净,松散耦合足够好,您不会从事件方法中获得太多额外的实际价值。请阅读:你会意识到这主要是关于个人喜好的,这就是为什么我从“我想”开始。
view.Save += new EventHandler(view_Save);