正确重构以避免循环依赖



我遇到了一个循环依赖的问题。有人问过类似的问题,我读了很多答案。大多数都是关于变通办法的,但我想重构,这样我就可以纠正错误,并且我希望得到一些关于哪里出错的信息。我可以改变我正在做的事情,但不能改变整个项目架构。

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

我有两个类库:

  1. DataLayer用于访问数据库
  2. DataObject,它包含表示我的业务对象的类

我的Presentation Layer调用DataLayer中的方法,该方法从DataObject类库返回对象
(我做了一些简化——我实际上有一个控制器层,但它需要引用上面的两个类库。这是我以前的现有架构。)

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


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

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

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

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

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

有什么意见吗?

我想我有答案了。

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

这会增加一点开销——我会调用DB,并在可能不需要的时候将所有这些数据放在内存中。我会试试看性能如何。

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

相关内容

  • 没有找到相关文章

最新更新