SlideShare a Scribd company logo
Using Hilt in a
modularized project
Fabio Collini
@fabioCollini
Dependency Injection
Vs
Service Locator
class MyClass {

private val collaborator2 = Collaborator2()

fun execute() {

val value = Collaborator1.loadSomething()

collaborator2.doSomethingElse(value)

}

}
Plaincode
class MyClass(serviceLocator: ServiceLocator) {

private val collaborator1 = serviceLocator.collaborator1

private val collaborator2 = serviceLocator.collaborator2

fun execute() {

val value = collaborator1.loadSomething()

collaborator2.doSomethingElse(value)

}

}
ServiceLocator
class MyClass(

private val collaborator1: Collaborator1,

private val collaborator2: Collaborator2

) {

fun execute() {

val value = collaborator1.loadSomething()

collaborator2.doSomethingElse(value)

}

}
DependencyInjection
class MyClass(

private val collaborator1: Collaborator1,

private val collaborator2: Collaborator2

) {

fun execute() {

val value = collaborator1.loadSomething()

collaborator2.doSomethingElse(value)

}

}
class MyClass(serviceLocator: ServiceLocator) {

private val collaborator1 = serviceLocator.collaborator1

private val collaborator2 = serviceLocator.collaborator2

fun execute() {

val value = collaborator1.loadSomething()

collaborator2.doSomethingElse(value)

}

}
ServiceLocatorDependencyInjection
Dependencies are
retrieved using the
Service Locator
Dependencies are
injected by the
container
Dagger is a Dependency Injection framework
But a Dagger component can be used as a Service Locator
Is Dagger a Dependency Injection framework?
What about Hilt?
WhatIcareabout
Dependency Injection on classes we can instantiate
Easy setup on classes instantiated by the framework
Testability
Objects
definition
Dagger&Hilt
The same syntax can be
used to define objects using
both Dagger and Hilt
class MyRepository(

private val api: Api

) {

fun loadData() = api.load()

}
class MyRepository @Inject constructor(

private val api: Api

) {

fun loadData() = api.load()

}
@Singleton

class MyRepository @Inject constructor(

private val api: Api

) {

fun loadData() = api.load()

}
Retrofit.Builder()

.baseUrl("""...")

!//!!...

.build()

.create(Api"::class.java)
@Provides

@Singleton

fun provideApi(): Api {

return Retrofit.Builder()

.baseUrl("""...")

!//!!...

.build()

.create(Api"::class.java)

}
@Module

object MyModule {

@Provides

@Singleton

fun provideApi(): Api {

return Retrofit.Builder()

.baseUrl("""...")

!//!!...

.build()

.create(Api"::class.java)

}

}
Using an object
instead of a class
Dagger generates
less code
@Singleton

class MyRepository @Inject constructor(

private val api: Api

) {

fun loadData() = api.load()

}
@Singleton

class MyRepository @Inject constructor(

private val cache: Cache,

private val api: Api

) {

fun loadData() = cache.load() "?: api.load()

}
interface MyRepository {

fun loadData(): Any

}

@Singleton

class MyRepositoryImpl @Inject constructor(

private val cache: Cache,

private val api: Api

) : MyRepository {

override fun loadData() = cache.load() "?: api.load()

}1
interface MyRepository {

fun loadData(): Any

}

@Singleton

class MyRepositoryImpl @Inject constructor(

private val cache: Cache,

private val api: Api

) : MyRepository {

override fun loadData() = cache.load() "?: api.load()

}1

@Module

interface AnotherModule {

@Binds

fun MyRepositoryImpl.bindsRepository(): MyRepository

}
Hilt
@InstallIn

@AndroidEntryPoint

@ViewModelInject

@HiltAndroidApp

@EntryPoint
Newannotations
@Module

object MyModule {

!//!!...

}
@Module

@InstallIn(SingletonComponent"::class)

object MyModule {

!//!!...

}
@Module

@InstallIn(SingletonComponent"::class)

object OkHttpConfigModule {

@Provides

@ElementsIntoSet

fun provideDefaultInterceptors(): Set<Interceptor> = emptySet()

@Singleton

@Provides

fun providesOkHttpClient(

interceptors: @JvmSuppressWildcards Set<Interceptor>

): OkHttpClient {

val httpClient = OkHttpClient.Builder()

interceptors.forEach {

httpClient.addInterceptor(it)

}

return httpClient.build()

}1

}2
src/main
@Module

@InstallIn(SingletonComponent"::class)

object OkHttpConfigModule {

@Provides

@ElementsIntoSet

fun provideDefaultInterceptors(): Set<Interceptor> = emptySet()

@Singleton

@Provides

fun providesOkHttpClient(

interceptors: @JvmSuppressWildcards Set<Interceptor>

): OkHttpClient {

val httpClient = OkHttpClient.Builder()

interceptors.forEach {

httpClient.addInterceptor(it)

}

return httpClient.build()

}1

}2

@Module

@InstallIn(SingletonComponent"::class)

object DebugOkHttpConfigModule {

@Provides

@IntoSet

fun provideDebugInterceptor(): Interceptor = HttpLoggingInterceptor()

}
src/mainsrc/debug
class MainActivity : AppCompatActivity() {

@Inject

lateinit var permissionManager: PermissionManager

@Inject

lateinit var mainNavigator: MainNavigator

!//!!...

}
@AndroidEntryPoint

class MainActivity : AppCompatActivity() {

@Inject

lateinit var permissionManager: PermissionManager

@Inject

lateinit var mainNavigator: MainNavigator

!//!!...

}
@AndroidEntryPoint

class MainActivity : AppCompatActivity() {

@Inject

lateinit var permissionManager: PermissionManager

@Inject

lateinit var mainNavigator: MainNavigator

!//!!...

}
@AndroidEntryPoint

class MainActivity : AppCompatActivity() {

private val viewModel: MyViewModel by viewModels()

@Inject

lateinit var permissionManager: PermissionManager

@Inject

lateinit var mainNavigator: MainNavigator

!//!!...

}
class MyViewModel @ViewModelInject constructor(

private val useCase: MyUseCase

) : ViewModel() {

!//!!...

}
class MyViewModel @ViewModelInject constructor(

private val useCase: MyUseCase,

@Assisted private val handle: SavedStateHandle

) : ViewModel() {

!//!!...

}
class MyViewModel @ViewModelInject constructor(

private val useCase: MyUseCase,

@Assisted private val handle: SavedStateHandle

) : ViewModel() {

init {

load(handle.get<String>("Id"))

}

!//!!...

}
class MyApp : Application() {

@Inject

lateinit var dependency: Dependency

!//!!...

}
@HiltAndroidApp

class MyApp : Application() {

@Inject

lateinit var dependency: Dependency

!//!!...

}
No more components!
(sort of…)
@Component(

modules = {

"//""...

}

)

@Singleton

public abstract static class SingletonC implements SingletonComponent,

"//…

{

}

@Subcomponent(

modules = {

"//""...

}

)

@ActivityScoped

public abstract static class ActivityC implements ActivityComponent,

"//""...

{

@Subcomponent.Builder

abstract interface Builder extends ActivityComponentBuilder {

}

}
!!/**

* A generated base class to be extended by the @dagger.hilt.android.AndroidEntryPoint annotated class.

* If using the Gradle plugin, this is swapped as the base class via bytecode transformation.

!*/

public abstract class Hilt_MainActivity extends AppCompatActivity

implements GeneratedComponentManagerHolder {

"//""...

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

((MainActivity_GeneratedInjector) this.generatedComponent())

.injectMainActivity(UnsafeCasts.<MainActivity>unsafeCast(this));

super.onCreate(savedInstanceState);

}

"//""...

}
!!/**

* A generated base class to be extended by the @dagger.hilt.android.AndroidEntryPoint annotated class.

* If using the Gradle plugin, this is swapped as the base class via bytecode transformation.

!*/

public abstract class Hilt_MainActivity extends AppCompatActivity

implements GeneratedComponentManagerHolder {

"//""...

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

((MainActivity_GeneratedInjector) this.generatedComponent())

.injectMainActivity(UnsafeCasts.<MainActivity>unsafeCast(this));

super.onCreate(savedInstanceState);

}

"//""...

}
!!/**

* A generated base class to be extended by the @dagger.hilt.android.AndroidEntryPoint annotated class.

* If using the Gradle plugin, this is swapped as the base class via bytecode transformation.

!*/

public abstract class Hilt_MainActivity extends AppCompatActivity

implements GeneratedComponentManagerHolder {

"//""...

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

((MainActivity_GeneratedInjector) this.generatedComponent())

.injectMainActivity(UnsafeCasts.<MainActivity>unsafeCast(this));

super.onCreate(savedInstanceState);

}

"//""...

}
MonolithicComponent
Simple
sometimes you need an extra Qualifier annotation
Less generated code
Everything can be injected everywhere
internal can be useful to limit the scope
@EntryPoint

@InstallIn(SingletonComponent"::class)

interface MyEntryPoint {

val myUseCase: MyUseCase



fun inject(something: Something)

}
@EntryPoint

@InstallIn(SingletonComponent"::class)

interface MyEntryPoint {

val myUseCase: MyUseCase



fun inject(something: Something)

}

val entryPoint = EntryPointAccessors.fromApplication(

app, MyEntryPoint"::class.java)

val useCase = entryPoint.myUseCase
Testing
class MyClass @Inject constructor(

private val collaborator1: Collaborator1,

private val collaborator2: Collaborator2

) {

fun execute() {

val value = collaborator1.loadSomething()

collaborator2.doSomethingElse(value)

}

}
class MyClassTest {

private val collaborator1 = mock<Collaborator1>()

private val collaborator2 = mock<Collaborator2>()

private val myObject = MyClass(collaborator1, collaborator2)

@Test

fun testSomething() {

whenever(collaborator1.loadSomething()) doReturn "something"

myObject.execute()

verify(collaborator2).doSomethingElse("something")

}

}
@Singleton

open class MyAnalytics @Inject constructor()

interface MyUseCase

@Singleton

class MyUseCaseImpl @Inject constructor() : MyUseCase

@Module

@InstallIn(SingletonComponent"::class)

interface MyModule {

@Binds

fun MyUseCaseImpl.bindsUseCase(): MyUseCase

}

@AndroidEntryPoint

class MyActivity : AppCompatActivity() {

@Inject

lateinit var analytics: MyAnalytics

@Inject

lateinit var useCase: MyUseCase

!//!!...

}
@HiltAndroidTest

class MyActivityTest {

@get:Rule1

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

}
@HiltAndroidTest

class MyActivityTest {

@get:Rule1

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

@Inject

lateinit var analytics: MyAnalytics

@Inject

lateinit var useCase: MyUseCase

@Test

fun startActivity() {

rule.launchActivity(null)

hiltRule.inject()

!//now the properties contain the production objects

}

}
@HiltAndroidTest

class MyActivityTest {

@get:Rule1

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

@Test

fun startActivity() {

rule.launchActivity(null)

!//!!...

}

}
@Module

@InstallIn(SingletonComponent"::class)

object FakeAnalyticsModule {

@Provides

fun provideAnalytics(): MyAnalytics = mock()

}

@HiltAndroidTest

class MyActivityTest {

@get:Rule1

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

@Test

fun startActivity() {

rule.launchActivity(null)

!//!!...

}

}
@HiltAndroidTest

class MyActivityTest {

@get:Rule1

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

@Module

@InstallIn(SingletonComponent"::class)

object FakeAnalyticsModule {

@Provides

fun provideAnalytics(): MyAnalytics = mock()

}

@Test

fun startActivity() {

rule.launchActivity(null)

!//!!...

}

}
@HiltAndroidTest

class MyActivityTest {

@get:Rule

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

@BindValue

@JvmField

val analytics: MyAnalytics = mock()

@Test

fun startActivity() {

rule.launchActivity(null)

!//!!...

}

}
@HiltAndroidTest

class MyActivityTest {

@get:Rule

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

@BindValue

@JvmField

val useCase: MyUseCase = mock()

@Test

fun startActivity() {

rule.launchActivity(null)

!//!!...

}

}
error: [Dagger/DuplicateBindings] MyUseCase is bound multiple times
@HiltAndroidTest

@UninstallModules(MyModule"::class)

class MyActivityTest {

@get:Rule

val hiltRule = HiltAndroidRule(this)

@get:Rule

val rule = ActivityTestRule(MyActivity"::class.java, false, false)

@BindValue

@JvmField

val useCase: MyUseCase = mock()

@Test

fun startActivity() {

rule.launchActivity(null)

!//!!...

}

}
Multi-module
architecture
It works!
feature3feature1 feature2
App
feature3feature1 feature2
AppFeature1App
feature1 feature2
Feature1App
feature3
App
Activity
Repository
Api
UseCase
ViewModel
entitiesentitiesentitiesentities
domain
repository
UI
data source
presenter
Activity
Repository
Api
UseCase
ViewModel
entitiesentitiesentitiesentities
domain
repository
UI
data source
presenter
Activity
Repository
Api
UseCase
ViewModel
RepositoryImplRepositoryUseCase
domain data
UseCase
RepositoryImpl
Repository
domain data
Repository RepositoryImpl
UseCase
Inversion
Of Control
The “I” in S.O.L.I.D.
https://www.youtube.com/watch?v=GlDsfq3xHvo&t=
domain repository
Repository RepositoryImpl
UseCase
@Inject
@Inject
Module
@Binds
Incomplete Hilt config
dynamic
feature3
App
feature1 feature2
@EntryPoint
@Component
Wrappingup
Dependency Injection on classes we can instantiate
@Inject, @Provides and @Binds

Easy setup on classes instantiated by the framework
@AndroidEntryPoint and @HiltAndroidApp
Testability
@HiltAndroidTest and HiltAndroidRule
Hilt is definitely a
Dependency Injection framework
Hilt is definitely a
Dependency Injection framework
(even if you can use an EntryPoint as a Service Locator)
Links&contacts
Hilt documentation
dagger.dev/hilt/
Android Developers - Dependency injection with Hilt
developer.android.com/training/dependency-injection/hilt-android
Android Developers - Hilt testing guide
developer.android.com/training/dependency-injection/hilt-testing
Manuel Vivo - Dagger and Hilt navigation support in Android Studio
medium.com/androiddevelopers/dagger-navigation-support-in-android-studio-49aa5d149ec9
Fabio Collini - Dagger dependencies beyond the basics
proandroiddev.com/dagger-dependencies-beyond-the-basics-53474e48f932
@fabioCollini
linkedin.com/in/fabiocollini
github.com/fabioCollini
medium.com/@fabioCollini
THANKS
FOR YOUR
ATTENTION
QUESTIONS?
@fabioCollini

More Related Content

What's hot

Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI
Ajinkya Saswade
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
José Paumard
 
Spring Boot
Spring BootSpring Boot
Spring Boot
Jiayun Zhou
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017
Roman Elizarov
 
Kubernetes in Docker
Kubernetes in DockerKubernetes in Docker
Kubernetes in Docker
Docker, Inc.
 
What is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | EdurekaWhat is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | Edureka
Edureka!
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
Purbarun Chakrabarti
 
Android kotlin coroutines
Android kotlin coroutinesAndroid kotlin coroutines
Android kotlin coroutines
Bipin Vayalu
 
Rxjs ppt
Rxjs pptRxjs ppt
SELENIUM PPT.pdf
SELENIUM PPT.pdfSELENIUM PPT.pdf
SELENIUM PPT.pdf
RebelSnowball
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
Mattia Battiston
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Steve Pember
 
Maven Introduction
Maven IntroductionMaven Introduction
Maven Introduction
Sandeep Chawla
 
Springboot Microservices
Springboot MicroservicesSpringboot Microservices
Springboot Microservices
NexThoughts Technologies
 
Jetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UIJetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UI
Gilang Ramadhan
 
Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJS
Sandi Barr
 
ASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP FundamentalsASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP Fundamentals
Ido Flatow
 
Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017
Roman Elizarov
 
Technologies sur angular.pptx
Technologies sur angular.pptxTechnologies sur angular.pptx
Technologies sur angular.pptx
IdrissaDembl
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest Matchers
Shai Yallin
 

What's hot (20)

Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI Android jetpack compose | Declarative UI
Android jetpack compose | Declarative UI
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017
 
Kubernetes in Docker
Kubernetes in DockerKubernetes in Docker
Kubernetes in Docker
 
What is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | EdurekaWhat is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | Edureka
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
Android kotlin coroutines
Android kotlin coroutinesAndroid kotlin coroutines
Android kotlin coroutines
 
Rxjs ppt
Rxjs pptRxjs ppt
Rxjs ppt
 
SELENIUM PPT.pdf
SELENIUM PPT.pdfSELENIUM PPT.pdf
SELENIUM PPT.pdf
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
 
Maven Introduction
Maven IntroductionMaven Introduction
Maven Introduction
 
Springboot Microservices
Springboot MicroservicesSpringboot Microservices
Springboot Microservices
 
Jetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UIJetpack Compose - Android’s modern toolkit for building native UI
Jetpack Compose - Android’s modern toolkit for building native UI
 
Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJS
 
ASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP FundamentalsASP.NET Web API and HTTP Fundamentals
ASP.NET Web API and HTTP Fundamentals
 
Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017
 
Technologies sur angular.pptx
Technologies sur angular.pptxTechnologies sur angular.pptx
Technologies sur angular.pptx
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest Matchers
 

Similar to Using hilt in a modularized project

Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
Pierre-Yves Ricau
 
Hilt Annotations
Hilt AnnotationsHilt Annotations
Hilt Annotations
Ali Göktaş
 
Maintaining a dependency graph with weaver
Maintaining a dependency graph with weaverMaintaining a dependency graph with weaver
Maintaining a dependency graph with weaver
Scribd
 
Dependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony ContainerDependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony Container
Diego Lewin
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRready
MobileAcademy
 
Android architecture
Android architecture Android architecture
Android architecture
Trong-An Bui
 
Di code steps
Di code stepsDi code steps
Di code steps
Brian Kiptoo
 
Android & Kotlin - The code awakens #01
Android & Kotlin - The code awakens #01Android & Kotlin - The code awakens #01
Android & Kotlin - The code awakens #01
Omar Miatello
 
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
First Tuesday Bergen
 
Dependency Injection for Android
Dependency Injection for AndroidDependency Injection for Android
Dependency Injection for Android
First Tuesday Bergen
 
Dagger 2 vs koin
Dagger 2 vs koinDagger 2 vs koin
Dagger 2 vs koin
Jintin Lin
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02
rhemsolutions
 
Why Spring <3 Kotlin
Why Spring <3 KotlinWhy Spring <3 Kotlin
Why Spring <3 Kotlin
VMware Tanzu
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
C.T.Co
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
Alexey Buzdin
 
Android workshop
Android workshopAndroid workshop
Android workshop
Michael Galpin
 
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
DicodingEvent
 
Mastering the Sling Rewriter by Justin Edelson
Mastering the Sling Rewriter by Justin EdelsonMastering the Sling Rewriter by Justin Edelson
Mastering the Sling Rewriter by Justin Edelson
AEM HUB
 
Mastering the Sling Rewriter
Mastering the Sling RewriterMastering the Sling Rewriter
Mastering the Sling Rewriter
Justin Edelson
 
Say bye to Fragments with Conductor & Kotlin
Say bye to Fragments with Conductor & KotlinSay bye to Fragments with Conductor & Kotlin
Say bye to Fragments with Conductor & Kotlin
Miquel Beltran Febrer
 

Similar to Using hilt in a modularized project (20)

Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
 
Hilt Annotations
Hilt AnnotationsHilt Annotations
Hilt Annotations
 
Maintaining a dependency graph with weaver
Maintaining a dependency graph with weaverMaintaining a dependency graph with weaver
Maintaining a dependency graph with weaver
 
Dependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony ContainerDependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony Container
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRready
 
Android architecture
Android architecture Android architecture
Android architecture
 
Di code steps
Di code stepsDi code steps
Di code steps
 
Android & Kotlin - The code awakens #01
Android & Kotlin - The code awakens #01Android & Kotlin - The code awakens #01
Android & Kotlin - The code awakens #01
 
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
 
Dependency Injection for Android
Dependency Injection for AndroidDependency Injection for Android
Dependency Injection for Android
 
Dagger 2 vs koin
Dagger 2 vs koinDagger 2 vs koin
Dagger 2 vs koin
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02
 
Why Spring <3 Kotlin
Why Spring <3 KotlinWhy Spring <3 Kotlin
Why Spring <3 Kotlin
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
Android workshop
Android workshopAndroid workshop
Android workshop
 
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
Dicoding Developer Coaching #30: Android | Mengenal Macam-Macam Software Desi...
 
Mastering the Sling Rewriter by Justin Edelson
Mastering the Sling Rewriter by Justin EdelsonMastering the Sling Rewriter by Justin Edelson
Mastering the Sling Rewriter by Justin Edelson
 
Mastering the Sling Rewriter
Mastering the Sling RewriterMastering the Sling Rewriter
Mastering the Sling Rewriter
 
Say bye to Fragments with Conductor & Kotlin
Say bye to Fragments with Conductor & KotlinSay bye to Fragments with Conductor & Kotlin
Say bye to Fragments with Conductor & Kotlin
 

More from Fabio Collini

Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose world
Fabio Collini
 
Managing parallelism using coroutines
Managing parallelism using coroutinesManaging parallelism using coroutines
Managing parallelism using coroutines
Fabio Collini
 
Kotlin Delegates in practice - Kotlin community conf
Kotlin Delegates in practice - Kotlin community confKotlin Delegates in practice - Kotlin community conf
Kotlin Delegates in practice - Kotlin community conf
Fabio Collini
 
Kotlin delegates in practice - Kotlin Everywhere Stockholm
Kotlin delegates in practice - Kotlin Everywhere StockholmKotlin delegates in practice - Kotlin Everywhere Stockholm
Kotlin delegates in practice - Kotlin Everywhere Stockholm
Fabio Collini
 
Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture project
Fabio Collini
 
Solid principles in practice the clean architecture - Droidcon Italy
Solid principles in practice the clean architecture - Droidcon ItalySolid principles in practice the clean architecture - Droidcon Italy
Solid principles in practice the clean architecture - Droidcon Italy
Fabio Collini
 
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
SOLID principles in practice: the Clean Architecture - Devfest Emila RomagnaSOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
Fabio Collini
 
SOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean ArchitectureSOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean Architecture
Fabio Collini
 
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
Fabio Collini
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Fabio Collini
 
Recap Google I/O 2018
Recap Google I/O 2018Recap Google I/O 2018
Recap Google I/O 2018
Fabio Collini
 
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFrom java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
Fabio Collini
 
From java to kotlin beyond alt+shift+cmd+k
From java to kotlin beyond alt+shift+cmd+kFrom java to kotlin beyond alt+shift+cmd+k
From java to kotlin beyond alt+shift+cmd+k
Fabio Collini
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UK
Fabio Collini
 
Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2
Fabio Collini
 
Testing Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJavaTesting Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJava
Fabio Collini
 
Android Data Binding in action using MVVM pattern - droidconUK
Android Data Binding in action using MVVM pattern - droidconUKAndroid Data Binding in action using MVVM pattern - droidconUK
Android Data Binding in action using MVVM pattern - droidconUK
Fabio Collini
 
Data Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternData Binding in Action using MVVM pattern
Data Binding in Action using MVVM pattern
Fabio Collini
 
Android Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG FirenzeAndroid Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG Firenze
Fabio Collini
 
Testable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMTestable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVM
Fabio Collini
 

More from Fabio Collini (20)

Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose world
 
Managing parallelism using coroutines
Managing parallelism using coroutinesManaging parallelism using coroutines
Managing parallelism using coroutines
 
Kotlin Delegates in practice - Kotlin community conf
Kotlin Delegates in practice - Kotlin community confKotlin Delegates in practice - Kotlin community conf
Kotlin Delegates in practice - Kotlin community conf
 
Kotlin delegates in practice - Kotlin Everywhere Stockholm
Kotlin delegates in practice - Kotlin Everywhere StockholmKotlin delegates in practice - Kotlin Everywhere Stockholm
Kotlin delegates in practice - Kotlin Everywhere Stockholm
 
Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture project
 
Solid principles in practice the clean architecture - Droidcon Italy
Solid principles in practice the clean architecture - Droidcon ItalySolid principles in practice the clean architecture - Droidcon Italy
Solid principles in practice the clean architecture - Droidcon Italy
 
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
SOLID principles in practice: the Clean Architecture - Devfest Emila RomagnaSOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
SOLID principles in practice: the Clean Architecture - Devfest Emila Romagna
 
SOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean ArchitectureSOLID principles in practice: the Clean Architecture
SOLID principles in practice: the Clean Architecture
 
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf MilanFrom Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
 
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinAsync code on kotlin: rx java or/and coroutines - Kotlin Night Turin
Async code on kotlin: rx java or/and coroutines - Kotlin Night Turin
 
Recap Google I/O 2018
Recap Google I/O 2018Recap Google I/O 2018
Recap Google I/O 2018
 
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFrom java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
 
From java to kotlin beyond alt+shift+cmd+k
From java to kotlin beyond alt+shift+cmd+kFrom java to kotlin beyond alt+shift+cmd+k
From java to kotlin beyond alt+shift+cmd+k
 
Testing Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UKTesting Android apps based on Dagger and RxJava Droidcon UK
Testing Android apps based on Dagger and RxJava Droidcon UK
 
Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2Intro to Retrofit 2 and RxJava2
Intro to Retrofit 2 and RxJava2
 
Testing Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJavaTesting Android apps based on Dagger and RxJava
Testing Android apps based on Dagger and RxJava
 
Android Data Binding in action using MVVM pattern - droidconUK
Android Data Binding in action using MVVM pattern - droidconUKAndroid Data Binding in action using MVVM pattern - droidconUK
Android Data Binding in action using MVVM pattern - droidconUK
 
Data Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternData Binding in Action using MVVM pattern
Data Binding in Action using MVVM pattern
 
Android Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG FirenzeAndroid Wear CodeLab - GDG Firenze
Android Wear CodeLab - GDG Firenze
 
Testable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMTestable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVM
 

Recently uploaded

Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
Alina Yurenko
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
Gerardo Pardo-Castellote
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
timtebeek1
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
Green Software Development
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
mz5nrf0n
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
Hironori Washizaki
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
Mobile app Development Services | Drona Infotech
Mobile app Development Services  | Drona InfotechMobile app Development Services  | Drona Infotech
Mobile app Development Services | Drona Infotech
Drona Infotech
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
kalichargn70th171
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 

Recently uploaded (20)

Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
Mobile app Development Services | Drona Infotech
Mobile app Development Services  | Drona InfotechMobile app Development Services  | Drona Infotech
Mobile app Development Services | Drona Infotech
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 

Using hilt in a modularized project