C# 我应该如何构建数据驱动的Win forms解决方案?

C# 我应该如何构建数据驱动的Win forms解决方案?,c#,winforms,architecture,C#,Winforms,Architecture,我正在编写一个Windows窗体应用程序,它正在发展并变得相当广泛 最初,我认为一个单独的图形组件项目、一个业务逻辑项目和一个数据访问项目将是最好的方法 随着应用程序越来越大,我开始认为更模块化的方法会更干净。。。e、 g.包含每个“类别”数据的用户控制、业务逻辑和数据访问的项目 例如。。。与产品相关的DAL对象以及单个项目中的关联业务对象和用户控件。这将导致解决方案中有更多的项目,每个项目都是独立的 但是,这可能会导致更复杂的情况,因为数据经常链接(产品表与供应商表、订单表和零件清单表等链接)

我正在编写一个Windows窗体应用程序,它正在发展并变得相当广泛

最初,我认为一个单独的图形组件项目、一个业务逻辑项目和一个数据访问项目将是最好的方法

随着应用程序越来越大,我开始认为更模块化的方法会更干净。。。e、 g.包含每个“类别”数据的用户控制、业务逻辑和数据访问的项目

例如。。。与产品相关的DAL对象以及单个项目中的关联业务对象和用户控件。这将导致解决方案中有更多的项目,每个项目都是独立的

但是,这可能会导致更复杂的情况,因为数据经常链接(产品表与供应商表、订单表和零件清单表等链接),因此很难完全抽象每个类别

在线上有数百篇软件体系结构文章,但帮助您将该体系结构转换为解决方案、项目和代码的文章并不多


有人能给我指出正确的方向吗?

我会将UI、数据和业务层放在不同的项目中。这从本质上减少了紧密耦合的机会-例如,UI代码直接使用数据层等。现在,如果您希望垂直划分,那么您可以这样做,即产品将有三个项目UI、业务和Dal等。这里可能有多种考虑因素:

  • 为什么要垂直分离?您是否看到可能的独立重用?如果没有,则避免分割
  • 若您必须划分,那个么您可以从管理的角度选择划分(比如只划分UI层),因为它可能有很多代码
  • 或者,您可以划分所有层,但粗颗粒除外。比如,产品也和它的孩子在一起
    就跨类别参考而言,它们无法避免,但必须通过良好记录和设计的合同进行。例如,Orders UI可能会调用Products BL来获取产品列表(请注意,许多其他UI组件将使用相同的方法来实现类似的功能)。

    VinayC对此很感兴趣,这里有一些额外的内容来补充他的答案(在评论中太难了)

    • 抽象出接口后面的所有数据访问,这样您就可以交换不同的接口,而不会有太多的依赖项硬连接到应用程序的其余部分
    • 在设计这些界面时,您将能够应用一些“垂直”思维。请看:作为一个开始
    • 我会为每一层做一个单独的组件(和项目),加上一个常量的“公共”组件等。尽可能保持这个组件没有依赖性
    • 在我使用这种方法的地方,我有时会将我的POCO放在公共程序集中的文件夹中,这样它们就可以很容易地重复使用。我用来分隔BL和DAL的接口使用这些接口,有时我也在其他层之间重复使用它们
    • 考虑使用属性;它们可以为您提供一个非常有用的扩展点
    • 将常用控件放入控件库以便于重用
    • 不要试图将领域模型/数据模型中在业务意义上彼此紧密绑定的部分(例如:订单和部分)分离出来