본문

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

공유

댓글