【问题标题】:Circular-dependency best practice循环依赖最佳实践
【发布时间】:2011-06-11 17:21:38
【问题描述】:

我目前正在编写一个从互联网检索信息的网络爬虫。简化后看起来像这样。

数据访问项目

  • 检索原始数据的对象
  • 对象将原始数据解析为对象 (!!)
  • 解析器返回的实体。

现在,我正在创建实际的解析器,我将像这样使用它:

using Application.DataAccess;
using Application.DataAccess.Entities;

namespace Application{
 public class TestScraper{
  public static ScrapeIt()
  {
   var source = DataAcces.Retriever.Retrieve("http://example.com");
   DataAccess.Entities.Entity entity = DataAccess.Parser.Parse(source);

   //Do stuf with source here.
  }
 }
}

如您所见,解析器返回一个实体。然而,这是在 DataAccess 命名空间中,然而,它没有任何意义......它是一个圆圈,我真的不知道如何解决这个问题。好吧,我可以想出一些东西,比如在这些层之间创建另一个层。

但我只想知道,你将如何解决这个问题。什么是好的(或最佳实践)。

【问题讨论】:

  • 为什么您的检索器和解析器在数据访问命名空间中,在您来保存实体之前,它们肯定与数据访问无关吗?
  • 抱歉,我没有看到圆圈。
  • @Beliskner 我试图将它与 SQL DAL 进行比较。从 SQL 服务器获取信息的函数通常在 DAL 中(类似于我的检索),将原始数据转换为可用对象的函数通常也在 DAL 中(类似于我的解析器)。

标签: c# circular-dependency


【解决方案1】:

您可以通过将两个类引用的内容分解到新类中来修复循环引用,然后旧类都引用新类。

因此,在您的情况下,您可以将实体移出 DataAccess 并移入可能由 DataAccess 和 Application 使用的新实体命名空间。

通过这样做,您从

开始
A <--> D

最终得到

A --> E
D --> E

【讨论】:

  • +1 - 我会这样做。定义创建循环引用的公共依赖项,然后将它们提取出来。
  • 你能举个例子吗?因为我很困惑新类是只包含头声明并且它有自己的类还是只是头声明工作?
  • @WaqasAhmed,E 将包含抽象/接口。
【解决方案2】:

数据访问层不应与域对象位于同一命名空间中。实体应该独立于不引用任何其他命名空间的程序集/命名空间中,这将允许其他基于逻辑的类(例如 DataAccess 和 Parsers)以更干净的方式自行引用实体。

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2010-12-11
    • 2012-10-09
    • 1970-01-01
    • 2015-07-29
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多