2011-01-19 105 views
5

我目前正在编写一个网络抓取工具,它从互联网上检索信息。简化它看起来像这样。循环依赖最佳实践

数据访问项目

  • 对象来获取原始数据
  • 对象的原始数据解析为对象(!!)
  • 的实体解析器回报。

现在,我创建实际的解析器,我要去使用它是这样的:

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命名空间中,但它没有意义......它是一个圆圈,我不知道如何解决这个问题。那么我可以想出一些东西,比如在这些图层之间创建另一个图层。

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

+1

为什么您的数据访问命名空间中的检索器和解析器,在您保存实体之前,它们确实与数据访问无关? – Hawxby 2011-01-19 12:14:21

+0

对不起,但我没看到这个圈子。 – SWeko 2011-01-19 12:14:56

回答

11

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

因此,在您的情况下,您可以将实体从DataAccess中移出并进入DataAccess和Application所使用的新实体名称空间。

通过这样做,你开始

A <--> D 

,并最终与

A --> E 
D --> E 
1

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