2016-03-09 19 views
3

所以我有這個挑戰如下。解耦項目引用和依賴注入

我有gradle項目結構。

  • 主要項目

    - 一個。 Android(#子項目1)
    - b。 Commons(#Sub-Project 2)
    - c。 HTTP的通訊科(#次級項目3)

摘要 我具有與上述一個3個項目。 HTTP-Comms必須是獨立的,它依賴於Commons項目。 HTTP-Comms有一個接口和實現者,它公開了啓動和停止服務器的方法。問題是我有HTTP-Comms項目在Android的參考,並希望解耦。這樣一個正常的版本可以運行而不需要這個功能,開發者版本將運行這個功能。如果我將不包括在分佈在正常構建這個項目中,Android將失敗,因爲ClassNotFound的的..

簡要說明 現在這個HTTP-Comms project有NanoHttpdServer實現,有很多類,其參考圖書館有關服務器和其他實用程序類。它是獨立的。我們有一個接口IHttpComms它擁有一些方法來啓動和停止服務器

interface IHttpComms{ 
    public void startServer(); 
    public void stopServer(); 
    public void serveRequest(); 
} 

class Controller implements IhttpComms{ 

//Implements the feature 
// reference to other classes in the HTTP-Comms project. 

} 

現在還有另一種Android project具有操作按鈕啓動和停止服務器。所以這取決於HTTP-Comms項目。我在這裏做

IhttpComms comms = new Controller(); 

從而使得HTTP的通訊和Android項目之間的緊密耦合。

作爲Commons project可以被引用,應該有這些項目之間的共同代碼。 But Commons project cannot hold reference to HTTP-COMMS

現在,HTTP-Comms對我們來說是一個孵化功能,我們要求它在某些時候不是構建過程的一部分。

我的問題是...

  1. 我可以使用任何依賴注入framewroks,我會還是老樣子能夠注入項目外的依賴對象。 ??就像有一個控制器的實例並注入Android?

  2. 沒有DI框架..任何其他設計模式解決方案?

+0

這個Android項目是驅動程序項目嗎?我的意思是它自己運行或主要項目是驅動程序項目,它使用android之一? –

+0

@Erkan主要項目有按要求運行任務的等級腳本..並且在android和http-comms項目中都使用常用項目 –

回答

0

問題是,兩個IhttpComms及其實現都在同一個項目/ jar中。我會將IhttpComms移動到它自己的項目中,讓Android項目引用這個新的項目,它應該只有接口和抽象類。這樣你可以將你的Android項目從Http-Comms中的具體類中分離出來。然後,你可以自由地使用任何你喜歡的IhttpComms的實施和使用你在運行時加載它(你猜對了)一個DI框架,甚至不起眼的Class.forName

總結:

  1. IHttp,通訊科新的項目只接口,沒有依賴
  2. 的Android(#次級項目1)依賴於IHttp-通訊科
  3. 共享(#次級項目2)
  4. 的Http-通訊科(#次級項目3),IHttp -Comms實現(具體類)依賴於IHttp-Comms和Commons