我应该如何构建数据驱动的Win表单解决方案?

时间:2010-08-16 11:30:14

标签: c# winforms architecture

我正在编写一个正在发展并变得非常广泛的Windows窗体应用程序。

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

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

例如......与产品相关的DAL对象以及单个项目中的关联业务对象和用户控件。这应该最终解决方案中的大量项目,每个项目都是自包含的。

然而,由于数据经常被链接(产品表与供应商表和订单表和零件清单表等相关联),这可能会导致更多复杂化。因此,很难完全抽象每个类别。

在线有数百种软件架构文章,但并不是很多,它们可以帮助您将该架构转换为解决方案,项目和代码。

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

2 个答案:

答案 0 :(得分:5)

我会将UI,数据和业务层保存在不同的项目中。这基本上减少了紧耦合的可能性 - 例如,数据层直接被UI代码等使用。现在,如果你希望将它垂直划分,那么你可以做到这一点,即产品将有三个项目UI,Business&达尔等。这里可以有多个注意事项:

  1. 为什么要垂直分离 - 您是否看到可能的独立重用?如果没有则避免分裂。
  2. 如果你必须划分,那么你可以选择从管理角度划分只说UI层,因为它可能有很多代码
  3. 或者你可以分割所有层但是粗粒。例如,产品和它的孩子在一起。
  4. 就交叉类别参考而言,它们是无法避免的,但它们必须通过充分记录和完整的方式完成。设计合同。例如,Orders UI可以调用Products BL来获取产品列表(请注意,许多其他UI组件将使用相同的方法来实现类似的功能)。

答案 1 :(得分:2)

VinayC正在接受它,这里有一些额外的东西可以增加他的答案(在评论中太难)。

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