WinForms应用程序的架构?

几个星期前我已经启动了一个WinForms项目,因为我真的不知道我想要什么function,所以我只是在路上添加它们。 这现在引起了一个可怕的混乱,我的MainForm是一个很大的泥球,例如一些重要的状态变化是由UI元素触发到我必须调用控件的OnChange事件,以便更改数据库中的某些状态。

简而言之:我刚刚开始了一个新项目,我希望采取更好的方法。 我只是不知道哪个是“好的”。 在ASP.net MVC中,我发现MVVM模式非常有用,但在桌面上,MVVM似乎只适用于WPF,而不适用于WinForms。

另一种方法是三层架构:我有我的数据库类,它目前直接与UI对话。 我现在创建一个新的静态类(“ApplicationState”),它与数据库进行通信并触发事件,告诉用户界面“嘿,有些东西改变了!”。 UI将操纵State,然后将处理数据库持久性,并在UI需要更新时再次引发事件。 这里的要点是ApplicationState类永远不会直接修改UI,但是UI订阅了Events。 这看起来像干净/“MVC-y”的方式,但也许我在这里忽略了什么?

基本上我的最终目标是让UI完全独立于数据库层,以确保我不再将业务逻辑连接到UI。

不要放在MVVM上 – 它也适用于WinForms。 基本上,如果使用数据绑定,则必须决定对象将绑定到什么。 通常,特别是对于更复杂的UI,您不希望直接绑定到您的域对象,您希望构建您的UI可以绑定的专用类(有时是包装器),它们提供视图所需的一切(MVVM的本质)和技术与Winforms一样好用。

关于WinForms Model-View-Presenter方法的一个很好的系列可以在

构建自己的CAB系列目录

NDepend文档附带了一些非常酷的高级在线博客文章,文章和有关.NET代码体系结构的白皮书。

关于通过.NET程序集分区代码的建议

控制组件依赖性以获得清洁架构

重新分解,重新构建和平衡成本

进化设计和非循环组件化

分层,水平度量和方法话语

战斗复杂性

此外,如果您想要不断检查您的UI代码是否独立于数据库代码,您可以轻松编写一些代码查询语言规则,这些规则将在开发时在Visual Studio中进行实时检查:

保持代码结构清洁

我总是会(第一个)拥有分层应用程序

  • 表示层(JUST UI和数据绑定逻辑)
  • 接口层到业务层(定义访问BL的合同)
  • 业务层实现(实际逻辑,数据validation等……)
  • 接口层到数据访问层(定义访问DAL的合同)
  • 数据访问层实现

这非常好地组织了您的应用程序。 然后我会寻找一些MVC类型的方法。 我没有使用WinForms开发这么多,更多的是使用Asp.net和一些Java Desktop客户端(我使用MVC )。 WinForms更适用于.Net数据绑定方法(DataSource,DataMember,…)。 你应该采取这种方法,而不是试图强迫其他东西。 我发现它与那不相符。

最有用的是将我们的UI逻辑布局到不同的控件中(如Asp.net中的UserControls)。 这有利于重用。

只需开始为您能想到的一切编写unit testing。 由于与WinForms的紧密耦合,有些部分难以进行unit testing,因此将它们分开。 清洁。 洗净,重复一遍。

Nido框架很好。 但它仅适用于您的后端架构。 它将为您提供一个坚固,灵活,简单的后端与t4模板。 它被certificate具有非常好的建筑模式。 此外,它不仅可以插入WinForm,还可以插入任何其他(MVC ASP.NET等)前端。

然后再次RocketFramework也很好

Link1: http: //rocketframework.codeplex.com Link2: http : //nidoframework.codeplex.com

我们的经验法则是,由于网络的无状态特性,大多数网站都倾向于使用MVC。 除非您尝试提供非常丰富的Web体验并引入Silverlight,否则您应该使用MVVM。 XAML与MVVM密切相关,也可以成为您的智能客户端选择(或者是一个不错的MVCP模式)。

由于控制器假设处理所有输入,因此在任何其他情况下,真正的MVC几乎不可能维持。 大多数非Web架构都有可以为您提供此控件的控件。 事实上,大多数人认为ASP.NET MVC无论如何都是混合MVC,但它在我的经验中非常好。

好的,
我在上面找到了一些不错的答案,但根据我在winform中的4年经验,我可以说你可以使用dotnet远程处理这个目的。 简而言之,您需要为业务逻辑和客户端工作创建一个解决方案,并为数据库连接另一个解决方案,您可以将其称为服务器。 这两个解决方案都应包含一些常见项目,然后您可以轻松地在应用程序上工作而无需担心数据库。
我建议你阅读有关dotnet远程处理的内容。

希望,这个答案很有帮助。