Slide 1

Slide 1 text

Dagger2ͰDI ʲୈ17ճʳpotatotips ࠤ౻ɹ൏ @satoshun_xyz

Slide 2

Slide 2 text

࠷ॳʹҰݴ • ઌ೔ݸਓతʹΞϓϦΛग़͠·ͨ͠

Slide 3

Slide 3 text

࠷ॳʹҰݴ reject͞Ε·ͨ͠….

Slide 4

Slide 4 text

࠷ॳʹҰݴ AndroidͰ΋reject͞ΕΔ͜ͱ͕͋Γ·͢

Slide 5

Slide 5 text

໨࣍ • DIͱ͸? • Dagger2ͷجຊతͳ࢖͍ํ

Slide 6

Slide 6 text

DIͱ͸? ֓ཁ Ϋϥεؒͷґଘؔ܎Λղܾ͢Δύλʔϯ ΫϥεC ΫϥεB ΫϥεA ΫϥεA͸ΫϥεBʹ ґଘ͍ͯ͠Δ ΫϥεB͸ΫϥεCʹ ґଘ͍ͯ͠Δ

Slide 7

Slide 7 text

DIͱ͸? ίʔυྫ class Blogger { public void post(String title) { // Կ͔ϝΠϯͷॲཧ // ... // fileʹlogΛऔΔ FileLogger logger = new FileLogger(“log.txt”); logger.logging(); } }

Slide 8

Slide 8 text

DIͱ͸? ίʔυྫ class Blogger { public void post(String title) { // Կ͔ϝΠϯͷॲཧ // ... // fileʹlogΛऔΔ FileLogger logger = new FileLogger(“log.txt”); logger.logging(); } }

Slide 9

Slide 9 text

DIͱ͸? ίʔυྫ class Blogger { FileLogger logger = new FileLogger(“log.txt”); public void post(String title) { // Կ͔ϝΠϯͷॲཧ // ... // fileʹlogΛऔΔ logger.logging(); } }

Slide 10

Slide 10 text

DIͱ͸? ίʔυྫ class Blogger { FileLogger logger; public Blogger(FileLogger logger) { this.logger = logger; } public void post(String title) { // Կ͔ϝΠϯͷॲཧ // ... // fileʹlogΛऔΔ logger.logging(); } }

Slide 11

Slide 11 text

DIͱ͸? ίʔυྫ class Blogger { FileLogger logger; public Blogger(FileLogger logger) { this.logger = logger; } public void post(String title) { // Կ͔ϝΠϯͷॲཧ // ... // fileʹlogΛऔΔ logger.logging(); } } logger = new FileLogger(“log”); blogger = new Blogger(logger); blogger.post(“Hello World”); ֎෦͔Β ґଘΛ஫ೖ

Slide 12

Slide 12 text

DIͱ͸? ·ͱΊ • ֎෦͔ΒΠϯελϯεΛ஫ೖ͢Δ͜ͱʹΑΓ, ৼΔ ෣͍(ಈ࡞)Λίϯτϩʔϧ͢Δ͜ͱ͕ग़དྷΔ(ྫ͑ ͹, ϙϦϞʔϑΟζϜ) • ͔͠͠ΫϥΠΞϯτଆͷෛ୲͕େ͖͘ͳͬͯ͠ ·͏ logger = new FileLogger(“log”); blogger = new Blogger(logger); blogger.post(“Hello World”);

Slide 13

Slide 13 text

Dagger2ͷ࢖͍ํ େ͖͘෼͚ͯComponentͱModuleͷ2͕ͭ͋Δ

Slide 14

Slide 14 text

Dagger2ͷجຊతͳ࢖͍ํ public class MainActivity extends ActionBarActivity { SharedPreferences mSharedPreferences; Gson gson; @Override protected void onCreate(Bundle saved) { mSharedPreferences = getSharedPreferences("app", Context.MODE_PRIVATE) gson = new GsonBuilder() .setFieldNamingPolicy( LOWER_CASE_WITH_UNDERSCORES) .create(); } }

Slide 15

Slide 15 text

Dagger2: ఆٛฤ public class MainActivity extends ActionBarActivity { @Inject SharedPreferences mSharedPreferences; @Inject Gson gson; … }

Slide 16

Slide 16 text

Dagger2: Moduleฤ @Module public class ApplicationModule { private final AndroidApplication application; public ApplicationModule(AndroidApplication application) { this.application = application; } @Provides Context provideContext() { return application; } @Provides @Singleton SharedPreferences provideSharedPreferences(Context context) { return context.getSharedPreferences("app", Context.MODE_PRIVATE); } } provideContextϝιου͔Β ࣗಈతʹҾ਺͕౉͞ΕΔ

Slide 17

Slide 17 text

Dagger2: Moduleฤ @Module public class DataModule { @Provides @Singleton Gson provideGson() { return new GsonBuilder() .setFieldNamingPolicy( LOWER_CASE_WITH_UNDERSCORES) .create(); } }

Slide 18

Slide 18 text

Dagger2: Componentฤ @Singleton @Component(modules = { ApplicationModule.class, DataModule.class }) public interface ApplicationComponent { void inject(MainActivity activity); } ΫϥεͰ࢖͍͍ͨModuleΛ Componentʹ·ͱΊΔ

Slide 19

Slide 19 text

Dagger2: جຊ׬੒ public class MainActivity extends ActionBarActivity { @Inject SharedPreferences mSharedPreferences; @Inject Gson gson; … } ઌ΄ͲModuleͰఆٛ ͨ͠Πϯελϯε͕ Inject͞ΕΔ!

Slide 20

Slide 20 text

·ͱΊ • Dagger2Λ࢖͏͜ͱͰʮઃఆΛར༻͔Β෼཭͢Δʯ ͕ग़དྷΔ • ςετ΋͠΍͘͢ͳΔ • Dagger1ΑΓDagger2͸ύϑΥʔϚϯε΋༏Ε͍ͯ Δ(Google͞Μ͍Θ͘) • ͜Ε͔Β͸Dagger2ͷ࣌୅(๻ͷҙݟ) • AndroidͰ΋reject͞ΕΔ͜ͱ͕͋Δ

Slide 21

Slide 21 text

ࢀߟ • http://google.github.io/dagger/ • https://github.com/satoshun/dagger2-sample