循环依赖最佳实践

时间:2011-01-19 12:04:26

标签: c# circular-dependency

我目前正在编写一个网络抓取工具,可以从互联网上检索信息。简化它看起来像这样。

数据访问项目

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

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

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.
  }
 }
}

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

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

2 个答案:

答案 0 :(得分:11)

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

因此,在您的情况下,您可以将实体移出DataAccess,也可以移动到DataAccess和Application使用的新Entities命名空间。

通过这样做,你可以从

开始
A <--> D

并以

结束
A --> E
D --> E

答案 1 :(得分:1)

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