【发布时间】:2013-11-11 21:00:46
【问题描述】:
在过去的项目中,我注意到许多可维护性问题源于数据访问和业务逻辑的广泛混合,以及逻辑对实体的高度依赖。我并没有试图设计一个可以避免所有这些的假设系统,但我有兴趣减少从长远来看由紧密耦合的代码引入的问题。
概述(简化为仅代表手头的问题):
- 横切:实体
- 表示层:UI,使用实体显示内容,通常启动对 BLL 的调用
- 业务逻辑层 (BLL):与实体一起工作的逻辑,通常作为静态方法实现,通常也调用 DAL
- 数据访问层 (DAL):为实体提供 CRUD 方法的映射器(手动编码的 SQL 查询)
变化
我打算让所有部分都更易于测试和维护。因此,我决定引入一些更改,主要是在 DAL 和 BLL 中,因为它们会造成最大的麻烦。逻辑嵌入在查询中,BLL 高度依赖于 DAL 的方法和实体。
DAL
- 引入了一种从 C# 生成 SQL 而不是硬编码查询的机制。这会导致编译时错误而不是运行时错误。通过这种方式,我们应该能够更早地发现查询和实体模型的不一致之处。
BLL
- 删除了对 DAL 的引用(将它们完全解耦),所有逻辑都通过新的“胶水”层从 UI 调用,该层将 UI 链接到 DAL 和 BLL。
在我看来,到目前为止一切都很好,这对我们来说应该很有效。现在是最大的变化。
- 我打算引入的另一个更改是命令模式的变体,以消除对实体模型的依赖。我还想确保业务逻辑是可测试的。因此,在我看来,“胶水”层应该将实体转换为仅包含特定逻辑所需数据的命令对象。当模型发生变化时,只需要调整映射,业务逻辑保持不变。
这似乎是个好主意,但我预计会有大量的业务逻辑,导致需要维护大量的命令对象。这是合理的恐惧还是我担心太多?您对这类问题有何经验?
【问题讨论】:
标签: c# maintainability decoupling