WinForms应用程序的架构?

Mic*_*tum 13 .net c# architecture winforms

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

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

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

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

Hok*_*ike 10

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

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

构建自己的CAB系列目录


Pat*_*eam 6

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

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

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

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

进化设计和非循环组件化

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

战斗复杂性

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

保持代码结构清洁


Jur*_*uri 5

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

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

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

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