diff --git a/app/build.gradle b/app/build.gradle index f5445fb..9e69c13 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'kotlin-android' + id 'kotlin-kapt' } android { @@ -34,9 +35,13 @@ android { dependencies { implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'com.google.android.material:material:1.4.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.1' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + + implementation 'com.google.dagger:dagger:2.39.1' + kapt 'com.google.dagger:dagger-compiler:2.39.1' + testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt index a91a1eb..9f43c01 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Activity.kt @@ -1,14 +1,13 @@ package com.example.dependencyinjectionstart.example1 +import javax.inject.Inject + class Activity { - val monitor = Monitor() - val keyboard = Keyboard() - val mouse = Mouse() - val computerTower = ComputerTower( - Storage(), - Memory(), - Processor() - ) - val computer = Computer(monitor, computerTower, keyboard, mouse) + @Inject + lateinit var computer: Computer + + init { + DaggerMyComponent.create().inject(this) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt new file mode 100644 index 0000000..22a1e5c --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Component.kt @@ -0,0 +1,20 @@ +package com.example.dependencyinjectionstart.example1 + +class Component { + + private fun getComputer() : Computer { + val monitor = Monitor() + val keyboard = Keyboard() + val mouse = Mouse() + val computerTower = ComputerTower( + Storage(), + Memory(), + Processor() + ) + return Computer(monitor, computerTower, keyboard, mouse) + } + + fun inject(activity: Activity) { +// activity.keyboard = Keyboard() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt index 30d1e0d..f301e18 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/Computer.kt @@ -1,6 +1,6 @@ package com.example.dependencyinjectionstart.example1 -class Computer( +class Computer ( val monitor: Monitor, val computerTower: ComputerTower, val keyboard: Keyboard, diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt new file mode 100644 index 0000000..e737dd1 --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerModule.kt @@ -0,0 +1,60 @@ +package com.example.dependencyinjectionstart.example1 + +import dagger.Module +import dagger.Provides + + +// Если у нас нет доступа к классу (например, библиотеку), то с помощью модуля мы можем создать +// экземпляр класса с помощью Модуля и его провайдера +@Module +class ComputerModule { + + @Provides + fun provideMonitor(): Monitor { + return Monitor() + } + + @Provides + fun provideProcessor(): Processor { + return Processor() + } + + @Provides + fun provideMemory(): Memory { + return Memory() + } + + @Provides + fun provideStorage(): Storage { + return Storage() + } + + @Provides + fun provideMouse(): Mouse { + return Mouse() + } + + @Provides + fun provideKeyboard(): Keyboard { + return Keyboard() + } + + @Provides + fun provideComputerTower( + storage: Storage, + memory: Memory, + processor: Processor + ): ComputerTower { + return ComputerTower(storage, memory, processor) + } + + @Provides + fun provideComputer( + monitor: Monitor, + computerTower: ComputerTower, + keyboard: Keyboard, + mouse: Mouse + ): Computer { + return Computer(monitor, computerTower, keyboard, mouse) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt index 2cf8e18..8d742e8 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/ComputerTower.kt @@ -1,6 +1,6 @@ package com.example.dependencyinjectionstart.example1 -class ComputerTower( +class ComputerTower ( val storage: Storage, val memory: Memory, val processor: Processor diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt b/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt new file mode 100644 index 0000000..36cc7fe --- /dev/null +++ b/app/src/main/java/com/example/dependencyinjectionstart/example1/MyComponent.kt @@ -0,0 +1,9 @@ +package com.example.dependencyinjectionstart.example1 + +import dagger.Component + +@Component(modules = [ComputerModule::class]) +interface MyComponent { + + fun inject(activity: Activity) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt index 84775ec..e81bcaf 100644 --- a/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt +++ b/app/src/main/java/com/example/dependencyinjectionstart/example2/presentation/MainActivity.kt @@ -3,10 +3,13 @@ package com.example.dependencyinjectionstart.example2.presentation import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.example.dependencyinjectionstart.R +import com.example.dependencyinjectionstart.example1.Activity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + val activity = Activity() + activity.computer.toString() } } \ No newline at end of file