SlideShare a Scribd company logo
1 of 39
Download to read offline
Neversettle
intive.com
_You don’t need DI
Neversettle
intive.com
_DI and Service Locator
_Dagger vs. Koin
_Testing with Koin
_Summary
You don’t need DI
!2
Neversettle
intive.com
_DI and Service Locator
Neversettle
intive.com
!4
_Providing services to classes
DI and Service Locator
„
Neversettle
intive.com
As a result I think we need a more specific name
for this pattern. Inversion of Control is too
generic a term, and thus people find it confusing.
As a result with a lot of discussion with various
IoC advocates we settled on the
name Dependency Injection.
-Martin Fowler
DI and Service Locator
Neversettle
intive.com
_DI
_Logic in two sets
!6Source: https://www.techyourchance.com/dependency-injection-android/
DI and Service Locator
Neversettle
intive.com
_DI
_Logic in two sets, integration with Pure Dependency injection or frameworks
!7Source: https://www.techyourchance.com/dependency-injection-android/
DI and Service Locator
Neversettle
intive.com
_DI
_Logic in two sets, integration with Pure Dependency injection or frameworks
_Common techniques:
_constructor injection
_method/setter injection
_field injection
!8
DI and Service Locator
Neversettle
intive.com
_Service Locator
_Object which holds services that an application might need
!9Source: https://martinfowler.com/articles/injection.html#ServiceLocatorVsDependencyInjection
DI and Service Locator
Neversettle
intive.com
_Service Locator
class ServiceLocator {
private Map services = new HashMap();
public Object getService(String key){
return services.get(key);
}
public void loadService(String key, Object service) {
services.put(key, service);
}
}
!10
DI and Service Locator
„
Neversettle
intive.com
With service locator the application class asks for it
explicitly by a message to the locator. With injection
there is no explicit request, the service appears in the
application class - hence the inversion of control.
- Martin Fowler
DI and Service Locator
Neversettle
intive.com
_Dagger vs. Koin
Neversettle
intive.com
_Dagger
_Compile-time dependency injection framework
_Based on annotations and code generation
_1.0.0 version in 2013, current version is 2.16
_Works in Java and Kotlin
_Generates Java classes
Dagger vs. Koin
!13
Neversettle
intive.com
_Koin
_Runtime, lightweight service locator
_No code generation
_Based on Kotlin features
_0.2.0 version in 2017, current version is 0.9.3
_Written fully in Kotlin and works in Kotlin classes only
Dagger vs. Koin
!14
Neversettle
intive.com
_Field injection (Dagger)
class SearchActivity : AppCompatActivity() {
@Inject
lateinit var viewModel: SearchViewModel
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
(...)
}
}
Dagger vs. Koin
!15
Neversettle
intive.com
_Field injection (Koin)
class SearchActivity : AppCompatActivity() {
val viewModel: SearchViewModel by inject()
(...)
}
Dagger vs. Koin
!16
Neversettle
intive.com
_Reified trick (Koin)
inline fun <reified T> ComponentCallbacks.inject(
name: String = ""
): Lazy<T> = lazy { get<T>(name, emptyParameters()) }
Dagger vs. Koin
!17
Neversettle
intive.com
_Modules (Dagger)
@Module
class NetworkModule {
@Provides
fun provideOkHttp(): OkHttpClient {
return OkHttpClient.Builder().build()
}
@Provides
@Singleton
fun provideRetrofit(okClient: OkHttpClient,
networkConfig: NetworkConfig): Retrofit {
return RetrofitFactory.create(okClient, networkConfig)
}
}
Dagger vs. Koin
!18
Neversettle
intive.com
_Modules (Dagger)
@Singleton
@Component(
modules = arrayOf(
AppModule::class,
NetworkModule::class
)
)
interface SampleAppComponent {
fun inject(application: SampleApp): SampleApp
}
Dagger vs. Koin
!19
Neversettle
intive.com
_Modules (Dagger)
class SampleApp : Application() {
override fun onCreate() {
super.onCreate()
DaggerSampleAppComponent.builder()
.appModule(AppModule(this))
.build()
.inject(this)
}
}
Dagger vs. Koin
!20
Neversettle
intive.com
_Modules (Koin)
val networkModule = applicationContext {
factory { OkHttpClient.Builder().build() }
bean { RetrofitFactory(get(), get()).create() }
}
Dagger vs. Koin
!21
Neversettle
intive.com
_Modules (Koin)
class SampleApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(
appModule(),
networkModule())
)
}
}
Dagger vs. Koin
!22
Neversettle
intive.com
_Scoping (Dagger)
@Module
class SearchActivityModule {
@ActivityScope
@Provides
fun providesSearchViewModel(): SearchViewModel {
return SearchViewModel()
}
}
Dagger vs. Koin
!23
Neversettle
intive.com
_Scoping (Dagger)
@ActivityScope
@Subcomponent(
modules = arrayOf(
SearchActivityModule::class
)
)
interface SearchActivityComponent : AndroidInjector<SearchActivity> {
@Subcomponent.Builder
abstract class Builder : AndroidInjector.Builder<SearchActivity>()
}
Dagger vs. Koin
!24
Neversettle
intive.com
_Scoping (Dagger)
@Module(subcomponents = arrayOf(SearchActivityComponent::class))
internal abstract class SearchActivityBinder {
@Binds
@IntoMap
@ActivityKey(SearchActivity::class)
internal abstract fun bindYourActivityInjectorFactory(
builder: SearchActivityComponent.Builder
):AndroidInjector.Factory<out Activity>
}
Dagger vs. Koin
!25
Neversettle
intive.com
_Scoping (Dagger)
class SearchActivity : AppCompatActivity() {
@Inject
lateinit var viewModel: SearchViewModel
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
(...)
}
}
Dagger vs. Koin
!26
Neversettle
intive.com
_Scoping (Koin)
val searchActivityModule = applicationContext {
context(SearchActivity.SCOPE_CONTEXT_NAME) {
bean { SearchViewModel(get(), get()) }
}
}
Dagger vs. Koin
!27
Neversettle
intive.com
_Scoping (Koin)
class SearchActivity : AppCompatActivity() {
companion object {
const val SCOPE_CONTEXT_NAME = "SearchActivityScopeContext"
}
val SearchViewModel: SearchViewModel by inject()
override fun onStop() {
super.onStop()
if (isFinishing) {
releaseContext(SCOPE_CONTEXT_NAME)
}
}
}
Dagger vs. Koin
!28
Neversettle
intive.com
_ViewModel support (Dagger)
@Module
class SearchActivityModule {
@ActivityScope
@Provides
fun providesSearchViewModel(
activity: SearchActivity,
factory: SearchViewModelFactory
): SearchViewModel {
return ViewModelProviders.of(activity, factory)
.get(SearchViewModel::class.java)
}
}
Dagger vs. Koin
!29
Neversettle
intive.com
_ViewModel support (Dagger)
class SearchActivity : AppCompatActivity() {
@Inject
lateinit var viewModel: SearchViewModel
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
(...)
}
}
Dagger vs. Koin
!30
Neversettle
intive.com
_ViewModel support (Koin)
val searchActivityModule = applicationContext {
viewModel { SearchViewModel(get(), get()) }
}
Dagger vs. Koin
!31
Neversettle
intive.com
_ViewModel support (Koin)
class SearchActivity : AppCompatActivity() {
val viewModel: SearchViewModel by viewModel()
}
Dagger vs. Koin
!32
Neversettle
intive.com
_Testing with Koin
Neversettle
intive.com
_Activity test
class SearchActivityTest : AutoCloseKoinTest() {
val tested = SearchActivity().testable()
val viewModel = mock<SearchViewModel>()
@BeforeEach
fun beforeEach() {
val testModule = applicationContext {
bean { viewModel }
}
loadKoinModules(testModule)
}
@Test
fun `should test something very important here`() {
tested.onCreate(mock())
tested.dataAdapter.itemCount `should equal` 0
}
}
Testing with Koin
!34
Neversettle
intive.com
Testing with Koin
!35
_dryRun
class KoinDryRunTest : AutoCloseKoinTest() {
@Test
fun `should have all dependencies injectable`() {
dryRun()
}
}
Neversettle
intive.com
_Summary
Neversettle
intive.com
_Pros
_Scales better (when using constructor annotations)
_Implementation of Dependency Injection
_Errors reported on build time
_Well known
_Cons
_Slow build time (code generation)
_Relatively hard to implement and understand
_Quite a lot initial boilerplate
Summary
!37
_Dagger
Neversettle
intive.com
_Pros
_Very simple to use and easy to debug
_Almost no initial boilerplate
_No code generation (reified trick)
_Cons
_Errors on runtime (dryRun could help)
_Pollutes app classes with by inject() (Service Locator)
_Kind of weird scoping but flexible
_Works only in Activities/Fragments written in Kotlin (by inject())
Summary
!38
_Koin
Bonus
Supports ViewModel
out of the box
Neversettle
intive.com
Questions?
@sswierczek_
sebastian.swierczek@intive.com

More Related Content

What's hot

Extending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss ForgeExtending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss ForgeAntoine Sabot-Durand
 
ChtiJUG - Introduction à Angular2
ChtiJUG - Introduction à Angular2ChtiJUG - Introduction à Angular2
ChtiJUG - Introduction à Angular2Demey Emmanuel
 
Commit University - Exploring Angular 2
Commit University - Exploring Angular 2Commit University - Exploring Angular 2
Commit University - Exploring Angular 2Commit University
 
Technozaure - Angular2
Technozaure - Angular2Technozaure - Angular2
Technozaure - Angular2Demey Emmanuel
 
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Kelly Shuster
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsGlobalLogic Ukraine
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionStfalcon Meetups
 
Exploring CameraX from JetPack
Exploring CameraX from JetPackExploring CameraX from JetPack
Exploring CameraX from JetPackHassan Abid
 
Introduction to Google Guice
Introduction to Google GuiceIntroduction to Google Guice
Introduction to Google GuiceKnoldus Inc.
 
Improving app performance with Kotlin Coroutines
Improving app performance with Kotlin CoroutinesImproving app performance with Kotlin Coroutines
Improving app performance with Kotlin CoroutinesHassan Abid
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized projectFabio Collini
 
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...7mind
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsHassan Abid
 
Dependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutesDependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutesAntonio Goncalves
 

What's hot (20)

Extending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss ForgeExtending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss Forge
 
Building maintainable app
Building maintainable appBuilding maintainable app
Building maintainable app
 
ChtiJUG - Introduction à Angular2
ChtiJUG - Introduction à Angular2ChtiJUG - Introduction à Angular2
ChtiJUG - Introduction à Angular2
 
Commit University - Exploring Angular 2
Commit University - Exploring Angular 2Commit University - Exploring Angular 2
Commit University - Exploring Angular 2
 
Technozaure - Angular2
Technozaure - Angular2Technozaure - Angular2
Technozaure - Angular2
 
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
Internal Android Library Management (DroidCon SF 2016, Droidcon Italy 2016)
 
Explaination of angular
Explaination of angularExplaination of angular
Explaination of angular
 
Angular2
Angular2Angular2
Angular2
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency Injections
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency Injection
 
React advance
React advanceReact advance
React advance
 
AngularJS in practice
AngularJS in practiceAngularJS in practice
AngularJS in practice
 
Exploring CameraX from JetPack
Exploring CameraX from JetPackExploring CameraX from JetPack
Exploring CameraX from JetPack
 
Introduction to Google Guice
Introduction to Google GuiceIntroduction to Google Guice
Introduction to Google Guice
 
Improving app performance with Kotlin Coroutines
Improving app performance with Kotlin CoroutinesImproving app performance with Kotlin Coroutines
Improving app performance with Kotlin Coroutines
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
 
Angular modules in depth
Angular modules in depthAngular modules in depth
Angular modules in depth
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
 
Dependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutesDependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutes
 

Similar to You don't need DI

Dsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaDsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaUgo Matrangolo
 
Android architecture
Android architecture Android architecture
Android architecture Trong-An Bui
 
Introduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.jsIntroduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.jsReturn on Intelligence
 
Java EE 6 CDI Integrates with Spring & JSF
Java EE 6 CDI Integrates with Spring & JSFJava EE 6 CDI Integrates with Spring & JSF
Java EE 6 CDI Integrates with Spring & JSFJiayun Zhou
 
Inversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionInversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionDinesh Sharma
 
Java onguice20070426
Java onguice20070426Java onguice20070426
Java onguice20070426Ratul Ray
 
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 2014First Tuesday Bergen
 
Dependency injection in Java, from naive to functional
Dependency injection in Java, from naive to functionalDependency injection in Java, from naive to functional
Dependency injection in Java, from naive to functionalMarian Wamsiedel
 
Diving into VS 2015 Day4
Diving into VS 2015 Day4Diving into VS 2015 Day4
Diving into VS 2015 Day4Akhil Mittal
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andevMike Nakhimovich
 
Animation And Testing In AngularJS
Animation And Testing In AngularJSAnimation And Testing In AngularJS
Animation And Testing In AngularJSEdureka!
 
D2 OPEN SEMINAR - WWDC 핫 이슈
D2 OPEN SEMINAR - WWDC 핫 이슈D2 OPEN SEMINAR - WWDC 핫 이슈
D2 OPEN SEMINAR - WWDC 핫 이슈NAVER D2
 
Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Tales Andrade
 
Dependency injection: koin vs dagger
Dependency injection: koin vs daggerDependency injection: koin vs dagger
Dependency injection: koin vs daggerMatteo Pasotti
 

Similar to You don't need DI (20)

Dsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaDsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
 
Android architecture
Android architecture Android architecture
Android architecture
 
Introduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.jsIntroduction to Backbone.js & Marionette.js
Introduction to Backbone.js & Marionette.js
 
Koin
KoinKoin
Koin
 
Java EE 6 CDI Integrates with Spring & JSF
Java EE 6 CDI Integrates with Spring & JSFJava EE 6 CDI Integrates with Spring & JSF
Java EE 6 CDI Integrates with Spring & JSF
 
Angular js
Angular jsAngular js
Angular js
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Inversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionInversion of Control and Dependency Injection
Inversion of Control and Dependency Injection
 
Java onguice20070426
Java onguice20070426Java onguice20070426
Java onguice20070426
 
Dependency Injection for Android
Dependency Injection for AndroidDependency Injection for Android
Dependency Injection for Android
 
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
 
Koin Quickstart
Koin QuickstartKoin Quickstart
Koin Quickstart
 
Dependency injection in Java, from naive to functional
Dependency injection in Java, from naive to functionalDependency injection in Java, from naive to functional
Dependency injection in Java, from naive to functional
 
Dependency injection in iOS
Dependency injection in iOSDependency injection in iOS
Dependency injection in iOS
 
Diving into VS 2015 Day4
Diving into VS 2015 Day4Diving into VS 2015 Day4
Diving into VS 2015 Day4
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andev
 
Animation And Testing In AngularJS
Animation And Testing In AngularJSAnimation And Testing In AngularJS
Animation And Testing In AngularJS
 
D2 OPEN SEMINAR - WWDC 핫 이슈
D2 OPEN SEMINAR - WWDC 핫 이슈D2 OPEN SEMINAR - WWDC 핫 이슈
D2 OPEN SEMINAR - WWDC 핫 이슈
 
Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Delegateless Coordinators - take 2
Delegateless Coordinators - take 2
 
Dependency injection: koin vs dagger
Dependency injection: koin vs daggerDependency injection: koin vs dagger
Dependency injection: koin vs dagger
 

Recently uploaded

#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 

Recently uploaded (20)

#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 

You don't need DI