我正在開發一個Android應用程序並使用Dagger 2在我的活動/片段中注入一些對象作爲單例。一些對象從數據庫加載。匕首2:從數據庫加載的注入對象
那麼是否有可能在後臺加載數據庫對象,並儘快注入它?或者,如果我在通過匕首初始化單身人士時加載它,它是沒有問題的?或者,我可以將引用傳遞給活動/片段並在那裏加載對象。
你對這個問題的處理方法是什麼?
我正在開發一個Android應用程序並使用Dagger 2在我的活動/片段中注入一些對象作爲單例。一些對象從數據庫加載。匕首2:從數據庫加載的注入對象
那麼是否有可能在後臺加載數據庫對象,並儘快注入它?或者,如果我在通過匕首初始化單身人士時加載它,它是沒有問題的?或者,我可以將引用傳遞給活動/片段並在那裏加載對象。
你對這個問題的處理方法是什麼?
這是一個有趣的問題,因爲它涉及上我認爲是第一個問題很多人開始依賴注入(DI)將面臨:什麼類型的對象,我應該注入,我應該怎麼新了,在你的情況下,我應該手動傳遞什麼?
當您使用依賴注入(大概也是單元測試,但是這是一個不同的故事),重要的是你理解的對象類型/類你設計的分類是非常重要的:
注:這些都是我的這些術語的快速判讀。如果您閱讀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
......
這很難,無需瞭解更多的細節,給予進一步的建議你在做什麼,但希望這能夠回答你的問題:你必須將數據庫中的實體從數據庫中讀取到需要的地方,你不應該在任何地方注入它。
我在數據庫中存儲例如用戶會話,並希望以單例形式傳遞它。因爲我已經有了某種「存儲庫」(它實際上在我的應用程序中被稱爲服務;)我將使用您的解決方案,而不是會話,在我的活動中注入存儲庫並從那裏加載會話。 – SamVimes