.net 将视图层与现有winforms应用程序分离的路径?

.net 将视图层与现有winforms应用程序分离的路径?,.net,winforms,design-patterns,mvvm,separation-of-concerns,.net,Winforms,Design Patterns,Mvvm,Separation Of Concerns,鉴于: 我们的组织有一个标准的windows窗体应用程序 表单和业务逻辑是交织在一起的,即。我们知道,自治视图模式使得编写单元测试非常困难。我们的目标是采用单个表单,并将表示逻辑与表单本身分离,这样我们就有了一个独立的域实体/对象,可以更容易地针对它编写单元测试 我们没有完全重写。我正在寻找一种渐进的方法,允许单独处理一个屏幕 经过一些研究,我认为这种模式最适合这个组织做事的方式 该组织通常倾向于较少的间接层,因此更简单(尽管不太健壮)更好 从过去到将来的转变应该是公式化的(对于任何已经熟悉内部

鉴于:

  • 我们的组织有一个标准的windows窗体应用程序
  • 表单和业务逻辑是交织在一起的,即。我们知道,自治视图模式使得编写单元测试非常困难。我们的目标是采用单个表单,并将表示逻辑与表单本身分离,这样我们就有了一个独立的域实体/对象,可以更容易地针对它编写单元测试
  • 我们没有完全重写。我正在寻找一种渐进的方法,允许单独处理一个屏幕
  • 经过一些研究,我认为这种模式最适合这个组织做事的方式
  • 该组织通常倾向于较少的间接层,因此更简单(尽管不太健壮)更好
  • 从过去到将来的转变应该是公式化的(对于任何已经熟悉内部概念的开发人员来说,很容易教授)。这就是为什么他们想坚持使用Windows窗体而不是WPF等其他较新技术
  • 域模型对视图(表单)一无所知。表单将完全了解域模型的更改。这就形成了两层间接层。再多一个就可以了(这就是为什么我会考虑MVVM)
  • 我发现的大多数MVVM示例都说明了它如何与WPF相结合,而不是与普通的旧Windows窗体相结合

    两个问题:

    考虑到这一切,我说了什么,你是否认为我走的不是一条好路,或者我走错了方向?我想向管理层提出一些建议


    最后,你知道一个好的在线代码示例可以帮助我充实原型吗?

    在WPF中,我们可以在视图中的对象和ViewModel中的内容之间进行数据绑定,因为MVVM是WPF的完美模式

    我从这个例子中学到了MVVM:


    这是一个Windows Phone教程,但如果您了解它的工作原理,您可以轻松地将其用于任何WPF应用程序。

    在WPF中,我们可以在视图中的对象和ViewModel中的内容之间进行数据绑定,因为MVVM是WPF的完美模式

    我从这个例子中学到了MVVM:


    这是一个Windows Phone教程,但如果您能理解它的工作原理,您可以轻松地将其用于任何WPF应用程序。

    也许您最好的方法是用眼睛查看代码库,以了解其功能。自治视图(以及培育它的winforms)如此难以测试的一个主要原因是,开发人员倾向于将所有内容都集中在一个事件处理程序中

    以这个问题为例,它是关于MVC3的,但它是一个完全混乱的方法——一个负责配置gridview、配置响应和检索数据以填充gridview的方法。甚至很难知道从哪里开始回答这个问题,更不用说编写任何合理的(阅读:简明&快速执行)测试来确保解决方案有效

    如果您能够仔细阅读您的代码,并仔细地将所有业务逻辑和/或集成点封装到服务/组件/接口(和实现)中,最好在外部单独的程序集中

    一旦您将所有逻辑分解为单独的组件,每个组件都专注于自己的组件,那么您就可以编写测试,以确保它们执行预期的任务,而不必测试应用程序的任何其他部分,这些将是您的服务。您希望每个服务类型都是一个由实现支持的接口

    在编写和测试了所有这些不同的项目和程序集之后,可以使用(一种形式的)将它们重新引入到应用程序中。这进一步将UI与应用程序要执行的各种业务逻辑分离。这里的梦想是,当您准备重写UI时,可以重用已经编写和测试过的业务逻辑组件

    我认为winform类将有一个接受许多参数的构造函数(上面讨论的各种服务的混合)。DI框架将负责向winform类提供服务。在这之后,理想情况下,winforms事件处理程序将相对较小,只需使用从各种表单字段收集的参数值调用服务方法

    下面是一篇关于在winforms中使用(依赖项注入框架)的文章:。有很多不同的DI框架,我使用Castle Windsor,因为这是我第一次学习的,它们基本上都做相同的事情,所以,你需要做的就是找到一个你熟悉的框架

    这是一个基于web应用程序的应用程序,但对于如何从现有的“厨房水槽”应用程序中识别和重构服务应该具有指导意义

    这个答案正在变成一本书,而且非常抽象。最重要的是,您需要将应用程序视为一组乐高积木,将它们组合在一起以产生功能(每个积木都是一个问题),而UI只是将积木粘合在一起的粘合剂(这种类比并不完美)


    事实上,它更像是艺术而不是科学,但你可以训练你的思维以这种方式看待问题,一旦你这样做了,编程通常会变得容易得多。这条曲线有点陡峭,但是,坚持下去,你就会到达那里。

    也许你能做的最好的事情就是用眼睛观察代码库。自治视图(以及培育它的winforms)如此难以测试的一个主要原因是,开发人员倾向于将所有内容都集中在一个事件处理程序中

    以这个问题为例,它是关于MVC3的,但它是一个完全混乱的方法——一个负责配置gridview、配置响应和检索数据以填充