2011-10-19 97 views
1

在我們的項目,我們有一個類KnowledgeBaseManager,其中被使用的其他類如下:使用依賴注入還是有簡單的解決方案?

KnowledgeBaseManager manager = KnowledgeBaseManager.get(); 
manager.foo(); 

KnowledgeBaseManager擁有一個靜態變量standardKnowledgeBaseManager用於第一次時被初始化:

class KnowledgeBaseManager { 
    private static KnowledgeBaseManager standardKnowledgeBaseManager = null; 
    public static KnowledgeBaseManager get() { 
    if (standardKnowledgeBaseManager == null) { 
     standardKnowledgeBaseManager = new KnowledgeBaseManager(); 
     // initialize standardKnowledgeBaseManager with appropriate knowledge base 
    } 
    return standardKnowledgeBase; 
} 

此外,我們有一個參數化的構造

public static KnowledgeBaseManager get(OntModel model) {...} 

我們使用到現在爲止僅用於單元測試,我們需要一個帶有測試知識庫的KnowledgeBaseManager。

現在,我們有以下挑戰:爲了發展,我們希望該應用程序使用KB-經理在後臺另一個知識基礎(因爲速度)。更具體地說,我們用Wicket構建一個Web應用程序。因此,我們希望在應用程序,其中的知識基礎和KnowledgeBaseManager在應用程序中使用(根據wheter我們在開發或部署)開始申報地方。使用KB管理器的代碼(如

KnowledgeBaseManager manager = KnowledgeBaseManager.get(); 

現在)不應該爲此而改變。

的問題是:什麼是對,最好的架構?

我在考慮使用像PicoContainer或Guice這樣的依賴注入框架,但沒有任何經驗,我不確定這是否會成爲特定問題的開銷。有關我們案例最佳實踐的任何建議?

回答

2

您所用的單圖案 - 如果你的代碼是多線程的,要實現它錯了(見http://java.sun.com/developer/technicalArticles/Programming/singletons/

而且,你也已經發現,單身人士(即全局變量)是測試。依賴注入是答案之一。首先忽略所有框架。這意味着你可以用傳統的方式編寫你的KnowledgeBaseManager--一個帶有構造函數和方法的類,沒有靜態的singletonish-factorish方法。使用KnowledgeBaseManager代碼並實例化或查找的KnowledgeBaseManager-它,而通過構造函數或setter方法接收它(我更喜歡前者):

public class ClassUsingKnowledgeBaseManager { 

    protected final KnowledgeBaseManager knowledgeBaseManager; 

    public ClassUsingKnowledgeBaseManager(KnowledgeBaseManager knowledgeBaseManager) { 
    this.knowledgeBaseManager = knowledgeBaseManager; 
    } 

    // ... 

} 

注意,因爲類不查找/實例化管理,它並不關心你是使用單例還是什麼,並且你可以很容易地在你的測試中實例化一個不同的管理器,而不用以任何方式觸及你的代碼。在你以這種方式構造你的代碼之後,你可能會發現你最終會遇到一些醜陋的類,它們只是實例化所有你需要的對象,你需要一些額外的代碼來把對象綁定到不同的作用域(例如會話或請求 - 並使用配置文件來控制實例...如果您發現您正在編寫大量重複或樣板代碼,則可以查看DI框架,這可能會爲您節省時間。

但是對於很多程序,您可能可以在不使用DI框架的情況下編寫DI樣式的代碼。

0

你可以使用的結構設計模式。

您可以創建一個工廠,並配置它返回你所需要的對象。