рдкрд░рд┐рдЪрдп
DI рдХреЗ рд▓рд┐рдП Android рд╡рд┐рдХрд╛рд╕ рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдбреИрдЧрд░ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ , рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреЛрдб рдЬрдирд░реЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред DI рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реНрд╡рдпрдВ рд╕рд░рд▓ рдФрд░ рд╕реАрдзреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбреИрдЧрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд▓рдЭрд╛ рджреЗрддреЗ рд╣реИрдВред рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕рд╛рдХреНрд╖рд░рддрд╛ рдореЗрдВ рдкреВрд░реНрдг рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрдЧреАред
рдХреЛрдЯрд▓рд┐рди рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рдЬреЛ рдЬрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЗрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛрдЗрди рдерд╛ , рдЬреЛ рдПрдХ рдбреАрдЖрдИ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рд░реНрд╡рд┐рд╕ рд▓реЛрдХреЗрдЯрд░ рд╣реИ, рдЬрд┐рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреИрдЯрд░реНрди-рд╡рд┐рд░реЛрдзреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ , рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧ рдЗрд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡реНрдпрд░реНрде рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЛ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ рд╕реЗрд╡рд╛ рд▓реЛрдХреЗрдЯрд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЦреБрдж рдХреЛрдЗрди рдирд╣реАрдВред
рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреНрддрдГрдХреНрд╖реЗрдкрдг
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИ? рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рдХреЛ рдмрдирд╛рдиреЗ рдпрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╛рд╣рд░ рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИред рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ Engine
, рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдпрд╣ рднреА рдПрдХ рд╡рд░реНрдЧ рд╣реИ Car
рдЬреЛ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ Engine
ред DI рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ
interface Engine
class DefaultEngine: Engine
class Car {
private val engine: Engine = DefaultEngine()
}
fun main() {
val car = Car()
}
рдпрджрд┐ рд╣рдо Car
DI рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ , рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
class Car(private val engine: Engine)
fun main() {
val car = Car(DefaultEngine())
}
рдпрд╣ рд╕рд░рд▓ рд╣реИ - рд╡рд░реНрдЧ рдХреЛ Car
рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ Engine
, рдЬрдмрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдмрд╕ рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рднреЗрдЬ рджреЗрдВред
рд╕реЗрд╡рд╛ рд▓реЛрдХреЗрдЯрд░
Service Locator. тАУ , . Koin ServiceLocator, , API.
object ServiceLocator {
fun <reified T> register(factory: () -> T) { ... }
fun <reified T> resolve(): T { ... }
}
, . :
interface Engine
class DefaultEngine: Engine
class Car {
private val engine: Engine = ServiceLocator.resolve()
}
fun main() {
ServiceLocator.register<Engine> { DefaultEngine() }
val car = Car()
}
DI, Car
, , тАУ Car
, . :
interface ServiceLocator {
fun <reified T> register(factory: () -> T)
fun <reified T> resolve(): T
}
class DefaultServiceLocator: ServiceLocator { ... }
class Car(private val serviceLocator: ServiceLocator) {
private val engine = serviceLocator.resolve<Engine>()
}
fun main() {
val serviceLocator = DefaultServiceLocator()
serviceLocator.register<Engine> { DefaultEngine() }
val car = Car(serviceLocator)
}
, Car
, . .. . :
class Car(private val engine: Engine)
fun main() {
ServiceLocator.register<Engine> { DefaultEngine() }
val car = Car(ServiceLocator.resolve<Engine>())
}
рдпрд╣ рд╢реБрджреНрдз рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИред рдХреЛрдЗрди рдХреЗ рд╕рд╛рде, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
interface Engine
class DefaultEngine: Engine
class Car(private val engine: Engine)
fun carModule() = module {
factory<Engine> { DefaultEngine() }
factory { Car(get<Engine>()) }
}
fun main() {
val koin = startKoin {
modules(carModule())
}.koin
val car = koin.get<Car>()
}
рдХрд╛рд╢, рд╣рдо рдЕрднреА рднреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдЗрди рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛kranid рдореИрдВ рдбреИрдЧрд░ 2 рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред
interface Engine
class DefaultEngine: Engine
class Car @Inject constructor(private val engine: Engine)
@Module
class AppModule {
@Provides
fun provideEngine(): Engine = DefaultEngine()
}
@Component(modules = [AppModule.class])
interface AppComponent {
fun car(): Car
}
fun main() {
val daggerComponent = DaggerAppComponent.create()
val car = daggerComponent.car()
}