2015-07-28 63 views
3

我正在開發一個Android應用程序並使用Dagger 2在我的活動/片段中注入一些對象作爲單例。一些對象從數據庫加載。匕首2:從數據庫加載的注入對象

那麼是否有可能在後臺加載數據庫對象,並儘快注入它?或者,如果我在通過匕首初始化單身人士時加載它,它是沒有問題的?或者,我可以將引用傳遞給活動/片段並在那裏加載對象。

你對這個問題的處理方法是什麼?

回答

4

這是一個有趣的問題,因爲它涉及上我認爲是第一個問題很多人開始依賴注入(DI)將面臨:什麼類型的對象,我應該注入,我應該怎麼了,在你的情況下,我應該手動傳遞什麼?

當您使用依賴注入(大概也是單元測試,但是這是一個不同的故事),重要的是你理解的對象類型/類你設計的分類是非常重要的:

  1. 服務:執行某些操作的對象,如業務邏輯。
    • 這些是單元測試中你想要的mock的事情。
  2. 值對象(爲了我們的討論,還包括DTOs和實體..認爲POCO或POJO):這些是持有信息的對象。通常是不可變的模型對象。價值對象對服務沒有任何依賴性,即你永遠不想向它們注入任何東西。
    • 你絕不會在單元測試中嘲笑這類對象!您可以使用具體類型,最好使用Test Data Builders來創建它們。

注:這些都是我的這些術語的快速判讀。如果您閱讀Domain Driven Design的書籍,您會發現更精確的定義,但我認爲這應該足以達到討論DI的目的。

Misko Hevery(的AngularJS ;-)父親提到這些術語,如「服務」超負荷,尤其是在Android中,其中「服務」有特定的含義,於是,他把價值對象和服務Newables注射劑分別爲。我認爲這是很好的建議。

要將這些概念應用於您的案例:您需要一些查詢數據庫的類以查找有問題的對象。

比方說,你在談論的對象是Student,它可能有一些不可變的領域的東西隱約像:

class Student { 
    public final long id; 
    public final String firstName; 
    public final String lastName; 
    public final String email; 

    public Student(...) { 
     // assignment of fields here... 
    } 
} 

然後你就會有一些對象,從數據庫中查詢Student條目,讓我們說這句話StudentRepository這裏:

class StudentRepository { 
    public List<Student> findAll() { 
     // db access here... 
    } 
} 

在這個例子中,Student是一個值對象(newable)和StudentRepository是服務(注射用)。

在代碼中,你只需要使用匕首注入StudentRepository - 但你最好從未注入Student ......

這很難,無需瞭解更多的細節,給予進一步的建議你在做什麼,但希望這能夠回答你的問題:你必須將數據庫中的實體從數據庫中讀取到需要的地方,你不應該在任何地方注入它。

+0

我在數據庫中存儲例如用戶會話,並希望以單例形式傳遞它。因爲我已經有了某種「存儲庫」(它實際上在我的應用程序中被稱爲服務;)我將使用您的解決方案,而不是會話,在我的活動中注入存儲庫並從那裏加載會話。 – SamVimes