2011-07-13 111 views
0

我想爲我的項目使用的iTextsharp(PDF創建庫)設計一個接口。我不想在我的項目中引用iTextsharp,只是界面。C#類接口設計

比方說,我有

 interface IPdfTable { /* */ } 
    public class PdfTable : IPdfTable { /* */ } 

    interface IPdfCell { /* */ } 
    public class PdfCell : PdfCell { /* */ } 

雖然我可以輕鬆地構建爲每個類individualy,我有在實現難度,當這些類彼此交互的接口。在代碼的某處,我需要表格才能夠接受一組單元。

問題出現時,我有一個單元的集合,我需要將它添加到表中。不知何故,我需要將IPdfCell轉換爲庫接受的原始元素(iTextSharp)。我相信這個快速簡單的實施是向下的,但不是一個好的設計。

我能想到的唯一的另一個解決方案是使用接口來收集不同的設置,並在它被傳遞到其他元素時創建原始元素(由iTextsharp接受)。

有更好的實施嗎?

回答

0

通常,您將有一個翻譯層,將您的界面外觀實現轉換爲iTextSharp原生支持的類型。

如果您需要屬性到屬性映射並且可以爲您刪除大量翻譯工作,AutoMapper可以爲此提供幫助。

4

我不明白這樣一個接口的目標。無論如何,您的pdf生成代碼將被綁定到您正在使用的庫上,構建代理類/界面,這些代碼類或界面完全反映了庫的功能並不妨礙它,它只是添加了另一個層。如果您要切換到不同的PDF生成庫,那麼新庫很難與iText中的等價物以1:1匹配,並且您最終會改變接口並調用代碼。

我的建議是創建一個IPDFGenerator,然後創建一個耦合到iText的iTextPDFGenerator:IPDFGenerator,然後保留它。你將會得到你想要的分離,使iText遠離核心服務的能力,但它不需要在相同的類之間進行一堆無意義的映射。

我認爲你應該重新評估SOLID中的S,I和D,並確保你沒有過度使用它。

+0

好點。而不是將pdf生成庫封裝在一組接口中,更好的方法可能是在服務接口中封裝pdf生成。 – Jeff