본문
170608(목) - DI with Dagger2
DI with Dagger2
https://blog.gouline.net/dagger-2-even-sharper-less-square-b52101863542
- 작동 방식
1. privider method를 정의
2. object graph에 로드
3. 필요에 따라서 내용을 대상에 injection
- Module
public class ApplicationModule {
private Application mApp;
public ApplicationModule(Application app) {
mApp = app;
}
@Singleton
@Provides
SharedPreferences provideSharedPrefs() {
return PreferenceManager.getDefaultSharedPreferences(mApp);
}
}
- Context, System services, REST service, Database manager, Message passing, Analytics tracker etc. 사용가능
- Component
@Singleton
@Component(modules = {ApplicationMoudule.class})
public interface ApplicationComponent {
void inject (DemoApplication app);
void inject (MainActivity activity);
}
- Application
public class DemoApplication extends Application {
private ApplicationComponent mComponent;
@Override
public void onCreate() {
super.onCreate();
mCompnent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build());
}
public ApplicationComponent getComponent() {
reuturn mComponent;
}
}
- Injection
public class MainActivity extends Activity {
@Inject SharedPreferences mSharedPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.Oncreate(savedInstanceState);
((DemoApplication) getApplication())
.getComponent()
.inject(this);
mSharedPrefs.edit()
.putString("status", "success!")
.apply();
}
}
- Named injections
같은 유형의 객체가 여러개 있을때 쓰면 용이
@Provides
@Named("default")
SharedPreferences provideDefaultSharedPrefs() {
...
}
@Provides
@Named("secret")
SharedPreference provideSecretSharedPrefs() {
...
}
@Inject @Named("default") SharedPreferences mDefaultSharedPrefs;
@Inject @Named("secret") SharedPreferences mSecretSharedPrefs;
- Lazy injections
- 하나의 target에 여러가지 다양한 injection이 있지만, 일부는 항상 발생하지는 않는 상황(예: 사용자 입력)
- 항상 dependency를 inject하면 낭비라고 생각되는 경우 사용
@Inject Lazy<SharedPreferences> mLazySharedPrefs;
void onSaveBtnClicked() {
mLazySharedPrefs.get()
.edit().putString("status", "lazy...");
.apply();
}
- get() 다음에는 injection 한 상태로 유지
- Provieder Injections
- 새로운 프로젝트에는 Factory를 사용 해야하지만, legacy code는 이를 사용가능
- 객체를 injection하는 대신에 여러 instance를 생성해야 하는 상황에 사용
@Inject
Provider<Entry> mEntryProvider;
Entry entry1 = mEntryProvider.get();
Entry entry2 = mEntryProvider.get();
'Mobile > DI' 카테고리의 다른 글
170609(금) - DI with Dagger2 (0) | 2017.06.09 |
---|---|
170609(금) - DI with Dagger2 (0) | 2017.06.09 |
170609 (금) - DI with Dagger2 (0) | 2017.06.09 |
170608(목) - DI with Dagger2 (0) | 2017.06.08 |
170608(목) - DI with Dagger2 (0) | 2017.06.08 |
댓글