2011-01-19 88 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)以更乾淨的方式自行引用實體。