2009-11-12 71 views
2

我有一個電子郵件組件,我正在將其集成到我的應用程序中,尋找一些關於如何構建一個包裝的技巧,以便我可以將其與另一個第三方第三方組件如果需要。圍繞第三方組件創建一個包裝 - 交換和解耦

我的做法,現在是:

  1. 建立一個界面的功能,我需要。
  2. 創建一個實現接口的類,使用此類中的第三方組件。
  3. 該組件的任何使用將經由接口所以像:

    IPop3 POP3 =新AcmeIncePop3Wrapper(); pop3.connect();

和內部AcmeIncePop3Wrapper將是:

public void connect() 
    { 
     AcmeIncePop3 pop = new AcmeIncePop3(); 
     pop.connect(); 
    } 

這是一個好方法嗎?

我大概可以通過使用ninject添加另一個抽象,所以我可以換出實現,但真的這似乎是我需要的,因爲我不希望每天都在改變第三方程序集,只是不想使事情緊密結合。

回答

1

我會說你的實現很好,這正是我要做的事情包裝的東西。

1

你說得對。

僅僅使用接口並不能解決問題,因爲如果位於第三方程序集中,則無法將定義的接口添加到所需的類中。相反,做兩件事情之一:

  1. 創建一個通用於所有你知道的不同 組件 方法類全新的,並且處理 每個不同的組件可以 存在(額外的邏輯可能是 需要在這裏處理主要的 差異)。

  2. 創建共同 方法等的接口,然後創建一個新 類,從3 黨的類繼承,並實現 接口。對 需要使用的新裝配件中的每個班級執行此操作。

問題與選項2的是,你不能擴展sealed class,這是我所期望的第三方來做。 我推薦選項1.

2

我認爲你有一個很好的實現。基本上你的界面是「這就是我想要處理的電子郵件」,第三方組件可能會做不同的事情,但如果你基於你的界面構建包裝類,你應該可以將任何第三方組件加入到該界面中。

您可能要留意的唯一事情就是您正在創建具體課程的位置。你可以考慮使用一個工廠或某些東西,如果你正在創新它 - 如果不是它可能不是什麼大不了的。我只是在想,如果你在整個地方創建新的AcmeIncePop3(),那麼它仍然與那個具體的類緊密耦合。

+0

好主意,所以我可以創建一個類似於GetPop3Object()的方法,所以我必須在一個位置更改代碼以交換實現。 – mrblah

+0

是的,這就是主意。我不確定實現它的最佳方式是什麼。查看工廠模式以獲取更多詳細信息。 –