SlideShare a Scribd company logo
1 of 70
Download to read offline
Building maintainable
app with MVP and
Dagger2
KRISTIJAN JURKOVIĆ
ANDROID TEAM LEAD @ INFINUM
We're an independent
design & development
agency.
INFINUM
• 90 people in 3 offices
• 15 android developers
• hundreds of projects
OUR BIGGEST ISSUES?
“Sometimes when you fill a vacuum, it still
sucks.”
― Dennis Ritchie
MVP TO THE RESCUE?
PROGRAM TO INTERFACES
NOT IMPLEMENTATIONS
ModelPresenterView
LoginActivity LoginPresenterImpl LoginInteractorImpl
LoginView LoginPresenter LoginInteractor
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
login(username, pass)
loginPresenter loginView
loginInteractor
login(username, pass) login(username, pass,
listener)
login(username, pass,
listener)
VIEW PRESENTER MODEL
public interface HomeView {
...
}
public interface HomePresenter {
...
}
public interface CurrencyInteractor {
...
}
VIEW
PRESENTER
MODEL
public interface HomeView {
...
}
VIEW
public class HomeActivity
extends BaseActivity
implements HomeView {
// this is an interface
HomePresenter presenter;
...
}
public interface HomePresenter {
...
}
PRESENTER
public class HomePresenterImpl
implements HomePresenter {
// interface
private HomeView view;
// and another interface
private CurrencyInteractor interactor;
public HomePresenterImpl(
HomeView view, CurrencyInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
...
}
public interface CurrencyInteractor {
...
}
MODEL
public class CurrencyInteractorImpl
implements CurrencyInteractor {
...
}
HOW SHOULD I GET MY
CONTENT?
public interface HomeView {
void showCurrencies(List<Currency> currencies);
}
public interface HomePresenter {
void loadCurrencyList();
}
public interface CurrencyInteractor {
void getCurrencyList(CurrencyListener listener);
}
public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data 

}
}
public class HomePresenterImpl
implements HomePresenter {
...
@Override
public void loadCurrencyList() {
interactor.getCurrencyList(...);
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
...
@Override
public void getCurrencyList(
CurrencyListener listener) {
// do API/DB call
// return result with listener
}
}
VIEW SHOULDN’T CREATE ITS
DEPENDENCIES
DEPENDENCY INJECTION
JSR 330
• 5 annotations - @Named, @Inject, @Qualifier, @Scope,
@Singleton
• 1 interface - Provider<T>
DAGGER2 TO THE RESCUE
DAGGER 2
• @Module, @Provides, @Component, @Subcomponent,
ScopedProvider
• Injection into Fields, Constructors, Methods
• Each @Inject has to have its @Provides
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class GsonConverterModule {
@Provides
@Singleton
public Converter.Factory
provideConverter(Gson gson) {
return GsonConverterFactory.create(gson);
}
}
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
@Component(modules = {
HostModule.class,
GsonConverterModule.class,
ClientModule.class,
LoggerModule.class,
ExecutorsModule.class,
ApiModule.class,
GsonModule.class
})
@Singleton
public interface AppComponent {
}
public class MyApplication extends Application {
protected AppComponent appComponent;
protected void init() {
appComponent = DaggerAppComponent.create();
}
}
HOW CAN WE REUSE THAT
IN OUR ACTIVITIES?
public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data 

}
}
• Inject presenter into view
• Inject view and interactor into presenter
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
@Inject
public CurrencyInteractorImpl(ApiService service) {
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
@Inject
public CurrencyInteractorImpl(ApiService service) {
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
public class HomePresenterImpl
implements HomePresenter {
@Inject
public HomePresenterImpl(HomeView view,
CurrencyInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
}
public class HomeActivity
extends BaseActivity
implements HomeView {
@Inject
HomePresenter presenter;
}
@Subcomponent(modules = HomeModule.class)
public interface HomeComponent {
void inject(HomeActivity activity);
}
WHAT’S THAT
“SUBCOMPONENT” THING
YOU MENTIONED?
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
HOME
MODULE
HOMECOMPONENT
EXECUTORS
MODULE
@Component(modules = {
...
})
@Singleton
public interface AppComponent {
HomeComponent plus(HomeModule module);
}
public abstract class BaseActivity
extends AppCompatActivity {
Override
protected void onCreate(Bundle savedInstanceState) {
...
injectDependencies(MyApplication.getAppComponent());
}
protected abstract
void injectDependencies(AppComponent appComponent);
}
public class HomeActivity
extends BaseActivity
implements HomeView {
protected void
injectDependencies(AppComponent appComponent) {
appComponent
.plus(new HomeModule(this))
.inject(this);
}
}
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
HOME
MODULE
HOMECOMPONENT
SESSIONCOMPONENT
SESSION
MODULE
EXECUTORS
MODULE
SATISFACTION LEVEL 9001
“If you don’t like testing your product, most
likely your customers won’t like to test it
either.”
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
APPTESTCOMPONENT
MOCKHOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
SYNC
EXECUTORS
MODULE
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
public class MyTestApplication
extends MyApplication
implements TestLifecycleApplication {
@Override
protected void init() {
appComponent = DaggerAppTestComponent.create();
}
}
protected void enqueueResponse(String filename) {
String body = ResourceUtils.readFromFile(filename);
MockResponse mockResponse =
new MockResponse()
.setBody(body)
.setResponseCode(HttpURLConnection.HTTP_OK);
mockWebServer.enqueue(mockResponse);
}
@Override
public void setup() throws Exception {
super.setup();
controller = Robolectric
.buildActivity(MockActivity.class)
.create()
.start()
.resume()
.visible();
fragment = DashboardDrivingModeFragment.newInstance();
controller.get().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment, null)
.commit();
ButterKnife.bind(this, fragment.getView());
}
@Test
public void testEmptyStateNotVisible() {
enqueueResponse(“rest-currency-response.json”);
btnCurrencyList.performClick();
assertThat(emptyView).isNotVisible();
}
THINGS TO REMEMBER
• Orientation change
THINGS TO REMEMBER
• Dagger2 is a powerful tool - make good use of it
• Save yourselves from regression bugs
REFERENCES
• http://antonioleiva.com/mvp-android/
• https://medium.com/@czyrux/presenter-surviving-
orientation-changes-with-
loaders-6da6d86ffbbf#.xou7c71uz
• http://frogermcs.github.io/dependency-injection-with-
dagger-2-custom-scopes/
• https://www.youtube.com/watch?v=oK_XtfXPkqw
Any questions?
KRISTIJAN.JURKOVIC@INFINUM.CO
@KJURKOVIC
Visit infinum.co or find us on social networks:
infinum.co infinumco infinumco infinum

More Related Content

What's hot

What's hot (20)

Angular2 + rxjs
Angular2 + rxjsAngular2 + rxjs
Angular2 + rxjs
 
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
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
Angular 2 - The Next Framework
Angular 2 - The Next FrameworkAngular 2 - The Next Framework
Angular 2 - The Next Framework
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
Angular2 workshop
Angular2 workshopAngular2 workshop
Angular2 workshop
 
Angular modules in depth
Angular modules in depthAngular modules in depth
Angular modules in depth
 
Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2
 
Angular 8
Angular 8 Angular 8
Angular 8
 
Angular 2: core concepts
Angular 2: core conceptsAngular 2: core concepts
Angular 2: core concepts
 
Angular2 for Beginners
Angular2 for BeginnersAngular2 for Beginners
Angular2 for Beginners
 
Beyond AngularJS: Best practices and more
Beyond AngularJS: Best practices and moreBeyond AngularJS: Best practices and more
Beyond AngularJS: Best practices and more
 
The productive developer guide to Angular 2
The productive developer guide to Angular 2The productive developer guide to Angular 2
The productive developer guide to Angular 2
 
AngularJS - dependency injection
AngularJS - dependency injectionAngularJS - dependency injection
AngularJS - dependency injection
 
Angular js-crash-course
Angular js-crash-courseAngular js-crash-course
Angular js-crash-course
 
Angular js 2
Angular js 2Angular js 2
Angular js 2
 
Angular2 - In Action
Angular2  - In ActionAngular2  - In Action
Angular2 - In Action
 
Di &amp; dagger
Di &amp; daggerDi &amp; dagger
Di &amp; dagger
 
Angular2
Angular2Angular2
Angular2
 
AngularJS - Services
AngularJS - ServicesAngularJS - Services
AngularJS - Services
 

Viewers also liked

Viewers also liked (20)

Evolving the Android Core with Aspects
Evolving the Android Core with AspectsEvolving the Android Core with Aspects
Evolving the Android Core with Aspects
 
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
 
World-Class Testing Development Pipeline for Android
 World-Class Testing Development Pipeline for Android World-Class Testing Development Pipeline for Android
World-Class Testing Development Pipeline for Android
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
 
Moderne App-Architektur mit Dagger2 und RxJava
Moderne App-Architektur mit Dagger2 und RxJavaModerne App-Architektur mit Dagger2 und RxJava
Moderne App-Architektur mit Dagger2 und RxJava
 
Getting started with dagger 2
Getting started with dagger 2Getting started with dagger 2
Getting started with dagger 2
 
Android talks #08 dagger2
Android talks #08   dagger2Android talks #08   dagger2
Android talks #08 dagger2
 
Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016
 
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
 
Infinum Android Talks #12 - MVP design pattern for Android Apps
Infinum Android Talks #12 - MVP design pattern for Android AppsInfinum Android Talks #12 - MVP design pattern for Android Apps
Infinum Android Talks #12 - MVP design pattern for Android Apps
 
Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016
 
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
 
A realtime infrastructure for Android apps: Firebase may be what you need..an...
A realtime infrastructure for Android apps: Firebase may be what you need..an...A realtime infrastructure for Android apps: Firebase may be what you need..an...
A realtime infrastructure for Android apps: Firebase may be what you need..an...
 
Android Effective UI: Tips, Tricks and Patterns
Android Effective UI: Tips, Tricks and PatternsAndroid Effective UI: Tips, Tricks and Patterns
Android Effective UI: Tips, Tricks and Patterns
 
A Journey Through MV Wonderland
A Journey Through MV WonderlandA Journey Through MV Wonderland
A Journey Through MV Wonderland
 
Cloud Design Pattern
Cloud Design PatternCloud Design Pattern
Cloud Design Pattern
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android Libs
 
Android Architecture MVP Pattern
Android Architecture MVP Pattern Android Architecture MVP Pattern
Android Architecture MVP Pattern
 
Add ClassyShark to your Android toolbox
Add ClassyShark to your Android toolboxAdd ClassyShark to your Android toolbox
Add ClassyShark to your Android toolbox
 
Android with dagger_2
Android with dagger_2Android with dagger_2
Android with dagger_2
 

Similar to Building maintainable app

Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13
Stephan Hochdörfer
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring Edition
Stephan Hochdörfer
 
Guice tutorial
Guice tutorialGuice tutorial
Guice tutorial
Anh Quân
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS Development
Jussi Pohjolainen
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpday
Stephan Hochdörfer
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014
Antoine Sabot-Durand
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flex
prideconan
 
What is your money doing?
What is your money doing?What is your money doing?
What is your money doing?
Alfonso Fernández
 

Similar to Building maintainable app (20)

Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13
 
Android architecture
Android architecture Android architecture
Android architecture
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring Edition
 
Google GIN
Google GINGoogle GIN
Google GIN
 
Guice tutorial
Guice tutorialGuice tutorial
Guice tutorial
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS Development
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
 
S313937 cdi dochez
S313937 cdi dochezS313937 cdi dochez
S313937 cdi dochez
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand
 
CDI in JEE6
CDI in JEE6CDI in JEE6
CDI in JEE6
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpday
 
A tour through Swift attributes
A tour through Swift attributesA tour through Swift attributes
A tour through Swift attributes
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
Angular workshop - Full Development Guide
Angular workshop - Full Development GuideAngular workshop - Full Development Guide
Angular workshop - Full Development Guide
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
Introduction to CDI
Introduction to CDIIntroduction to CDI
Introduction to CDI
 
Net conf BG xamarin lecture
Net conf BG xamarin lectureNet conf BG xamarin lecture
Net conf BG xamarin lecture
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flex
 
What is your money doing?
What is your money doing?What is your money doing?
What is your money doing?
 

Recently uploaded

%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
chiefasafspells
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 

Recently uploaded (20)

AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AI
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 

Building maintainable app