C# WinForms应用程序的体系结构?

C# WinForms应用程序的体系结构?,c#,.net,winforms,architecture,C#,.net,Winforms,Architecture,几周前,我启动了一个WinForms项目,因为我不知道我想要什么功能,所以我只是一路上添加了它们。这现在造成了一个可怕的混乱,我的主窗体是一个大泥球,一些重要的状态更改是由UI元素触发的,以至于我必须调用控件的OnChange事件来更改数据库中的某些状态 简而言之:我刚开始一个新项目,我想采取更好的方法。我只是不知道哪个才是“好”的。在ASP.NETMVC中,我发现MVVM模式非常有用,但在桌面上,MVVM似乎只适用于WPF,而不适用于WinForms 另一种方法是三层体系结构:我有一个数据库类

几周前,我启动了一个WinForms项目,因为我不知道我想要什么功能,所以我只是一路上添加了它们。这现在造成了一个可怕的混乱,我的主窗体是一个大泥球,一些重要的状态更改是由UI元素触发的,以至于我必须调用控件的OnChange事件来更改数据库中的某些状态

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

另一种方法是三层体系结构:我有一个数据库类,它当前直接与UI对话。现在,我创建了一个新的静态类(“ApplicationState”),它与数据库对话并触发事件,告诉UI“嘿,有什么改变了!”。UI将操纵状态,该状态随后将处理数据库持久性,并在UI需要更新时再次引发事件。这里的要点是ApplicationState类从不直接修改UI,而是UI订阅事件。这看起来是一种干净的“MVC-y”方式,但也许我忽略了一些东西


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

我一直追求的(首先)是有一个分层的应用程序

  • 表示层(仅UI和数据绑定逻辑)
  • 接口层到业务层(定义访问BL的合同)
  • 业务层实现(实际逻辑、数据验证等)
  • 数据访问层的接口层(定义访问DAL的合同)
  • 数据访问层实现
这将非常好地组织您的应用程序。然后我会寻找一些MVC类型的方法。我没有用WinForms开发那么多,更多的是用Asp.net和一些Java桌面客户端(我使用的地方)。WinForms更多地使用.Net数据绑定方法(数据源、数据成员等)。你应该采用这种方法,而不是强迫别人去做别的事情。我发现它不太匹配


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

只要开始为您能想到的一切编写单元测试即可。由于与WinForms的紧密耦合,一些片段将很难进行单元测试,所以将它们分离出来。清洁的洗。重复。

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

有关WinForms模型视图演示器方法的优秀系列文章,请访问


我们的经验法则是,由于web的无状态性,大多数网站都倾向于MVC。除非您试图提供非常丰富的web体验并引入silverlight,否则您应该使用MVVM。XAML与MVVM齐头并进,也可以是您的智能客户端选择(或者是一个不错的MVCP模式)


真正的MVC几乎不可能在任何其他情况下得到支持,因为控制器应该处理所有的输入。大多数非web体系结构都有为您提供此功能的控件。事实上,大多数人都说ASP.NET MVC是一种混合MVC,但根据我的经验,它非常好。

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

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

很好。但是,它只适用于您的后端体系结构。它将为您提供一个坚实、灵活、简单的后端模板。事实证明,它具有非常好的体系结构模式。此外,它不仅可以插入WinForm,还可以插入任何其他(MVC ASP.NET等)前端

然后再好

链接1: 链接2:

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


希望这个答案有帮助

我想这会让.NET在两层之间形成奶酪?奶酪层在哪里?我喜欢cheese。cheese是将主要内容保持在一起的接口层,以及MS Unity提供的依赖项注入,它可以获得BL的正确实例化等:)我认为这种方法对于“大型”应用程序是有意义的,所以+1。我只是担心对于我的应用程序来说,这是过分的。这是一个简单的应用程序,有1个主窗体、1个数据库和3或4个附加窗体,但没有太多功能。因此,5层可能真的太过分了,我更喜欢在UI和数据库之间交换数据的最简单方法,而不需要UI中的所有业务逻辑,而且我不知道是否应该使用静态类。@Michael:那么我会试试