正确地重构以避免循环依赖

时间:2013-08-21 16:19:33

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

我遇到循环依赖问题。有类似的问题已经被问到,我已经阅读了很多答案。大多数处理解决方案,但我想重构,所以我有正确的,我想在我出错的地方输入一些。我可以改变我正在做的事情而不是整个项目架构。

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

我有两个类库:

  1. DataLayer 用于访问数据库。
  2. DataObject ,其中包含代表我的业务对象的类。
  3. 我的表示层调用DataLayer中的方法,该方法从DataObject类库中返回对象 (我有点简化 - 我实际上有一个控制器层,但它需要上面两个类库的引用。这是一个现有的架构,从我的时间开始。)

    在DataObject类库中,我有一个表示文件的抽象类。它具有诸如filename,userID等属性。它还有一个方法GetFile(),我在派生类中编码,因为有不同的方法来获取文件。 DataLayer方法返回这些文件对象的集合,但我不想在需要之前获取实际文件。


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

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

    我的问题是我的GetFile()方法需要访问我的DataLayer类库以从数据库中提取数据,这会导致循环依赖。 DataLayer类库自引用DataObject这就是它的回报。但是现在我需要从DataObjects中的类调用DataLayer。

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

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

    有什么意见吗?

1 个答案:

答案 0 :(得分:0)

我想我有答案。

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

这有一点开销 - 我进行数据库调用,并在可能不需要时将所有这些数据放入内存中。我会试一试,看看性能如何。

对这种方法的任何批评?