【问题标题】:Properly Refactoring to avoid a Circular Dependency正确重构以避免循环依赖
【发布时间】:2013-08-21 16:19:32
【问题描述】:

我遇到了循环依赖的问题。有人问过类似的问题,我已经阅读了很多答案。大多数都处理变通方法,但我想重构,所以我认为它是正确的,我想对我哪里出错的地方提供一些输入。我可以改变我正在做的事情,但不能改变整个项目架构。

我在 Visual Studio 2012 中使用 VB.Net。

我有两个类库:

  1. DataLayer 用于访问数据库。
  2. DataObject,其中包含代表我的业务对象的类。

我的表示层调用 DataLayer 中的方法,该方法从 DataObject 类库返回对象。
(我已经稍微简化了 - 我实际上有一个控制器层,但它需要引用上面的两个类库。这个是我之前的现有架构。)

在 DataObject 类库中,我有一个代表文件的抽象类。它具有文件名、用户 ID 等属性。它还有一个方法 GetFile(),我在派生类中对其进行编码,因为获取文件的方法不同。 DataLayer 方法返回这些文件对象的集合,但在需要之前我不想获取实际文件。


到目前为止,我有一个调用 webService 的派生类(使用来自 baseClass 的属性)和一个访问 fileSystem 的派生类。两者都返回一个表示文件的字节数组。调用类不需要知道如何检索文件。

现在我有一个新要求,即使用数据库中的数据动态构建文件。我可以使用基类中的属性获取我需要的所有数据。

我的问题是我的 GetFile() 方法将需要访问我的 DataLayer 类库以从数据库中提取数据,这会导致循环依赖。 DataLayer 类库引用了DataObject 因为那是它返回的内容。但现在我需要从 DataObjects 中的一个类中调用 DataLayer。

  • 我可以从演示文稿中调用 DataLayer 并将结果传递给 我的 DataObject 的 GetFile() 方法,然后是我的表示层 需要为这个派生类做一些特别的事情。我的目标是 派生类在不知道表示的情况下处理 GetFile 关于实施。
  • 我可以为此 DataLayer 代码创建一个新的类库,但我 不喜欢特殊情况。
  • 我可以直接在 DataObject 类中访问数据库,但是 绕过分层架构。

我无法改变我们的架构,但我可以改变我的方法。

有什么意见吗?

【问题讨论】:

    标签: visual-studio circular-dependency n-tier-architecture data-layer


    【解决方案1】:

    我想我有答案了。

    在我的具体类中,当我最初加载数据时(在 DataLayer 中),我将获得创建文件所需的所有数据。我会将它存储在我的具体类中的一个新属性中,我的 GetFile() 方法将使用它来构建文件。

    这会产生更多开销 - 我会调用数据库并将所有这些数据在可能不需要时放入内存中。我试试看性能如何。

    对这种方法有什么批评吗?

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2013-02-06
      • 1970-01-01
      • 2012-02-15
      • 2011-12-24
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多