24
Dagger2: Практический ликбез по работе с кинжалами Дмитрий Полищук

Droidcon Moscow 2015. Dagger2 практический ликбез по работе с кинжалами. Дмитрий Полищук - Yandex

Embed Size (px)

Citation preview

PowerPoint Presentation

Dagger2:

?

public class NetworkClient {

}private static final class NetworkClientHolder { static NetworkClient INSTANCE = new NetworkClient();}public FutureTask execute(Request request) { ...}public NetworkClient() { this.client = new OkHttpClient();}public static NetworkClient getInstance() { return NetworkClientHolder.INSTANCE;}

public static NetworkClient getInstance() { return NetworkClientHolder.INSTANCE;}public class MyFragment extends Fragment {

}

@Override public void onResume() { super.onResume(); updateFeed(); }

private void updateFeed() { NetworkClient client = NetworkClient.getInstance(); FutureTask response = client.execute(request); ...}

public static NetworkClient getInstance() { return NetworkClientHolder.INSTANCE;}.

- - :

MyActivityNetworkClientOkHttpClientMyActivityOkHttpClientNetworkClient

public class NetworkClient {

}public FutureTask execute(Request request) { ...}public NetworkClient(Client client) { this.client = client;}

public class MyFragment extends Fragment {

@Override public void onResume() { super.onResume();

updateFeed(); }

}

private void updateFeed() { NetworkClient client = NetworkClient.getInstance(); FutureTask response = client.execute(request); ...}private void updateFeed() { Client client = new OkHttpClient(); NetworkClient client = new NetworkClient(client); FutureTask response = client.execute(request); ...}

c Dagger2

@Modulepublic class NetworkModule {

}@Provides@SingletonClient provideOkHttpClient() { return new OkHttpClient();}

-

NetworkClient constructor injectionpublic class NetworkClient {

}public FutureTask execute(Request request) { ...}public NetworkClient(Client client) { this.client = client;}@Inject@Singletonprivate final Client client;

NetworkClient setter injectionpublic class NetworkClient {

}public FutureTask execute(Request request) { ...}public void setClient(Client client) { this.client = client;}@Inject@Singletonpublic NetworkClient() {

}@Injectprivate final Client client;private Client client;

NetworkClient Dagger2public class MyFragment extends Fragment {

}

private void updateFeed() { Client client = new OkHttpClient(); NetworkClient client = new NetworkClient(client); FutureTask response = client.execute(request); ...}private void updateFeed() { FutureTask response = client.execute(request); ...}@Inject NetworkClient client;@Overridepublic void onActivityCreated(Bundle state) { super.onActivityCreated(state); getComponent().inject(this);}

Injection

@Component

@Component(modules = { NetworkModule.class })public interface AppComponent {

}@Singleton

?@Generated("dagger.internal.codegen.ComponentProcessor")public final class MyFragment_MembersInjector implements MembersInjector { private final MembersInjector supertypeInjector; private final Provider clientProvider;

public MyFragment_MembersInjector(MembersInjector supertypeInjector, Provider clientProvider) { assert supertypeInjector != null; this.supertypeInjector = supertypeInjector; assert clientProvider != null; this.clientProvider = clientProvider; }

@Override public void injectMembers(MyFragment instance) { if (instance == null) { throw new NullPointerException("Cannot inject members into a null reference"); } supertypeInjector.injectMembers(instance); instance.client = clientProvider.get(); }

public static MembersInjector create(MembersInjector supertypeInjector, Provider clientProvider) { return new MyFragment_MembersInjector(supertypeInjector, clientProvider); }}

@Component vs @Subcomponent@PerActivity@Subcomponent(modules = ActivityModule.class)public interface ActivitySubcomponent {

}

@Component(modules = { NetworkModule.class })public interface AppComponent {

ActivitySubcomponent plus(ActivityModule module);}

@Subcomponent

plus()

, !

@Qualifier@Modulepublic class NetworkModule {

@Provides @Singleton NetworkClient taxiClient(Client client) { return new NetworkClient(client, "https://taxi.yandex.ru/api"); }

@Provides @Singleton NetworkClient mapsClient(Client client) { return new NetworkClient(client, "https://maps.yandex.ru/api"); }}@Named("taxi")@Named("maps")

@Qualifier@Inject@Named("taxi")NetworkClient taxiClient;

@Inject@Named("maps")NetworkClient mapsClient;

Dagger IntelliJ Pluginhttps://github.com/square/dagger-intellij-plugin

?

Proguard

Dagger1: http://square.github.io/dagger/

Dagger2: http://google.github.io/dagger

(U2020 Dagger2): https://clck.ru/9aSsV

: https://clck.ru/9aVu4

DAGGER 2 - A New Type of dependency injection: http://www.youtube.com/watch?v=oK_XtfXPkqw

! @[email protected]