【问题标题】:How applicable is the command pattern in this attempt to decouple layers? [closed]在这种解耦层的尝试中,命令模式的适用性如何? [关闭]
【发布时间】: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


    【解决方案1】:

    我真的不明白命令模式在这里有什么帮助。我成功地将 BL 与 DAL 分离的方法是使用外观模式。 DAL 应该实现接口,而 BL 应该通过将这些接口的实例注入其中来初始化。在测试 BL 时,您可以提供完整的模拟 DAL,从而使单元测试更加容易。

    【讨论】:

    • 感谢您的有用评论。您提到的外观模式将完成与我提到的粘合层类似的任务,对吗?另外,DAL 的接口不会仍然将 BL 耦合到实体模型吗?
    • @Korijn 实际上,我将“胶水层”视为外观的另一个术语 :) 您如何定义实体,它们只是 POCO,还是包含逻辑?一种方法(如果您有很多实体,这将是一项繁重的工作)是让 DAL 将实体与 BL 定义的模型对象(通过接口)进行转换。
    • 他们只是 POCO 的。您提到的使用一组额外的域对象来回转换的方法是我们已经探索过的方法,当您拥有约 100 个具有多达 50 个属性的实体时,这确实是一场会计噩梦。
    • @Korijn 在这种情况下,如果可能,让您的 POCO 实现 BL 定义的接口。
    • @Korijn 我的错误,我的意思是外观。对不起。
    【解决方案2】:

    我可以看到整体设计存在几个问题。

    删除了对 DAL 的引用(将它们完全解耦),所有逻辑 通过新的“胶水”层从 UI 调用,该层链接 UI 到 DAL 和 BLL。

    您所指的这个“胶水”层应该是Interfaces 层。一般来说,Interfaces 层以一种可测试的方式松散地耦合了各种原本不相关的层。

    我打算引入的另一个变化是命令的变体 模式,以消除对实体模型的依赖。我也 想要确保业务逻辑是可测试的。 T

    查看Repository Pattern。使用依赖注入,这几乎就是它所解决的问题。

    引入了一种从 C# 生成 SQL 的机制,而不是 对查询进行硬编码。

    小心这个。确保您没有使用 home brew LINQ to SQL 重新发明轮子。

    总之,改变是不可避免的。没有任何模式可以让所有变更更易于管理。命令模式不会解决业务层中的范围蔓延。您最好的选择是坚持您已有的 n 层解决方案,并根据您现有的最佳信息,尽您所能做出明智的设计决策。

    【讨论】:

    • 感谢您的有用建议。我没有创建自己的 LINQ to SQL 版本,实际上它正是我正在使用的。我设法将它嵌入到映射器中,以便“外部世界”不知道实际上正在使用 LINQ to SQL。使用接口听起来是个很好的调查方法。谢谢。我认为这也与大卫的建议不谋而合。我一定会很快在概念验证中探索它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2012-10-24
    相关资源
    最近更新 更多