SlideShare a Scribd company logo
Keeping up
with DI and
Dagger
Matt Dupree
Gimli
LegolasAragorn
Dev
Marketing CEO
Keeping up
with DI and
Dagger
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
class Human {
private final Water water;
Human() {
water = new Water();
}
}
class Human {
private final Water water;
Human() {
water = new Water();
}
}
class Human {
private final Water water;
Human(Water water) {
this.water = water;
}
}
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
1. Leverage OO for faster, cleaner implementation
2. Leverage tests to ensure changes didn’t break anything
1. Leverage OO for faster, cleaner implementation
2. Leverage tests to ensure changes didn’t break anything
–Alan Kay, The Computer Revolution
hasn’t Happened Yet
“any particular implementation
is making pragmatic choices
and these…choices are likely
not to be able to cover all of
the cases at the level of
efficiency and…richness
required…this is standard OOP
lore…we need to have
different ways of dealing with
the same concepts in a way
that does not distract the
programmer”
class LockDashboardFragment : Fragment() {
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
lockConnection = BleLockConnection()
lockConnection.initialize()
view.findViewById<View>(R.id.lockUnlockButton)
.setOnClickListener {
val command = Command(if (isLocked) UNLOCK else LOCK)
lockConnection.sendCommand(command)
}
}
}
class LockDashboardFragment : Fragment() {
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
lockConnection = BleLockConnection()
lockConnection.initialize()
view.findViewById<View>(R.id.lockUnlockButton)
.setOnClickListener {
val command = Command(if (isLocked) UNLOCK else LOCK)
lockConnection.sendCommand(command)
}
}
}
class LockDashboardFragment : Fragment() {
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
lockConnection = BleLockConnection()
lockConnection.initialize()
view.findViewById<View>(R.id.lockUnlockButton)
.setOnClickListener {
val command = Command(if (isLocked) UNLOCK else LOCK)
lockConnection.sendCommand(command)
}
}
}
class LockDashboardFragment : Fragment() {
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
lockConnection = BleLockConnection()
lockConnection.initialize()
view.findViewById<View>(R.id.lockUnlockButton)
.setOnClickListener {
val command = Command(if (isLocked) UNLOCK else LOCK)
lockConnection.sendCommand(command)
}
}
}
class LockDashboardFragment : Fragment() {
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
lockConnection = BleLockConnection()
lockConnection.initialize()
view.findViewById<View>(R.id.lockUnlockButton)
.setOnClickListener {
val command = Command(if (isLocked) UNLOCK else LOCK)
lockConnection.sendCommand(command)
}
}
}
class LockDashboardFragment : Fragment() {
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
lockConnection.initialize()
view.findViewById<View>(R.id.lockUnlockButton)
.setOnClickListener {
val command = Command(if (isLocked) UNLOCK else LOCK)
lockConnection.sendCommand(command)
}
}
}
class LockDashboardFragment : Fragment() {
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
lockConnection.initialize();
view.findViewById<View>(R.id.lockUnlockButton)
.setOnClickListener {
val command = Command(if (isLocked) UNLOCK else LOCK)
lockConnection.sendCommand(command)
}
}
}
1. Leverage OO for faster, cleaner implementation
2. Leverage tests to ensure changes didn’t break anything
1. Leverage OO for faster, cleaner implementation
2. Leverage tests to ensure changes didn’t break anything
…The trick now was to make
space for the new functionality
without breaking anything that
already worked…After the
addition of a few
unimplemented operations…
the bulk of the tests passed. By
the end of the day, all of the
tests were passing…In two days,
the potential market was
multiplied several fold…”
–Kent Beck, TDD By Example
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help with testing?
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
LockDashboard
LockDashboardPresenter
LockDashboardPresenterLocksRepository
LockDashboardPresenterLocksRepository
Database
LoaderManager
class LockDashboard extends Fragment {
Presenter locklistPresenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
}
}
class LockDashboard extends Fragment {
Presenter locklistPresenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
}
}
class LockDashboard extends Fragment {
Presenter locklistPresenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
}
}
class LockDashboard extends Fragment {
Presenter locklistPresenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
}
}
class LockDashboard extends Fragment {
Presenter locklistPresenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
}
}
static class Factory {
Presenter makePresenter() {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
return new Presenter(locksRepository);
}
}
–Dagger Docs
“Dagger is a replacement for
these FactoryFactory classes that implements
the dependency injection design pattern
without the burden of writing the boilerplate.”
class LockDashboard extends Fragment {
Presenter locklistPresenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
AndroidInjection.inject(this);
// ...
}
}
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help with testing?
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
How do I Dagger?
How do I Dagger?
@Provides
@Binds
@Component
@Module
@Inject
@BindsInstance
@Scope @Named @Qualifier
@Subcomponent @Component.Builder
How do I Dagger?
Dagger?
Dag?
Directed
acyclic
graph
LockDashboardPresenterLocksRepository
Database
LoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
Components create the injected roots of the
object graph
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
}
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
}
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
class Presenter {
private final LocksRepository locksRepository;
Presenter(LocksRepository locksRepository) {
this.locksRepository = locksRepository;
}
class Presenter {
private final LocksRepository locksRepository;
@Inject
Presenter(LocksRepository locksRepository) {
this.locksRepository = locksRepository;
}
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
…But its never that easy. Why?
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
interface LocksRepository {
LockLoadResult loadLocks();
}
interface LocksRepository {
LockLoadResult loadLocks();
}
?
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
package android.database.sqlite;
public final class SQLiteDatabase extends SQLiteClosable {}
package android.database.sqlite;
public final class SQLiteDatabase extends SQLiteClosable {}
?
Modules have methods that know how to add
“tricky” objects to the object graph as nodes
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
@Module
class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
}
@Module
class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
}
@Module
class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
}
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
@Module
class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
}
@Module
class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
}
@Module
class LockListModule {
@Provides Database providesDb(SQLiteOpenHelper helper) {
return helper.getWritableDatabase();
}
}
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
}
@Component(modules = LockListModule.class)
interface LockListComponent {
void inject(LockDashboard lockDashboard);
}
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
@Module
class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
}
@Module
abstract class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
@Binds abstract LocksRepository bindsLockListApiService(
CacheFirstLocksRepository locksRepository);
}
@Module
abstract class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
@Binds abstract LocksRepository bindsLockListApiService(
CacheFirstLocksRepository locksRepository);
}
@Module
abstract class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
@Binds abstract LocksRepository bindsLockListApiService(
CacheFirstLocksRepository locksRepository);
}
@Module
abstract class LockListModule {
@Provides Database providesDb() {
SQLiteOpenHelper helper = //...
return helper.getWritableDatabase();
}
@Binds abstract LocksRepository bindsLockListApiService(
CacheFirstLocksRepository locksRepository);
}
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
@Module
class LockListModule {
@Provides LoaderManager providesLoaderManager() {
return //???
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.create().inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.builder()
.loaderManager(getLoaderManager())
.build()
.inject(this);
// ...
}
}
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
}
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
@Component.Builder interface Builder {
@BindsInstance Builder loaderManager(LoaderManager lMgr);
LockListComponent build();
}
}
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
@Component.Builder interface Builder {
@BindsInstance Builder loaderManager(LoaderManager lMgr);
LockListComponent build();
}
}
@Component
interface LockListComponent {
void inject(LockDashboard lockDashboard);
@Component.Builder interface Builder {
@BindsInstance Builder loaderManager(LoaderManager lMgr);
LockListComponent build();
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.builder()
.loaderManager(getLoaderManager())
.build()
.inject(this);
// ...
}
}
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.builder()
.loaderManager(getLoaderManager())
.build()
.inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
AndroidInjection.inject(this);
// ...
}
}
class LockDashboard extends Fragment {
Presenter locklistPresenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final Context context = getContext();
Database database = new Database(context);
LocksRepository locksRepository =
new LocksRepository(database, getLoaderManager());
lockListPresenter =
new Presenter(locksRepository);
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
AndroidInjection.inject(this);
}
}
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
DatabaseLoaderManager
LockDashboard
Presenter
LocksRepository
FakeDatabaseLoaderManager
@Component(modules = LockListModule.class)
interface LockListComponent {
void inject(LockDashboard lockDashboard);
}
@Component(modules = TestLockListModule.class)
interface TestLockListComponent extends LockListComponent {
void inject(LockDashboard lockDashboard);
}
@Component(modules = TestLockListModule.class)
interface TestLockListComponent extends LockListComponent {
void inject(LockDashboard lockDashboard);
}
@Component(modules = TestLockListModule.class)
interface TestLockListComponent extends LockListComponent {
void inject(LockDashboard lockDashboard);
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
DaggerLockListComponent.builder()
.loaderManager(getLoaderManager())
.build()
.inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
((MyApplication)getActivity().getApplication())
.getLockDashboardComponent()
.loaderManager(getLoaderManager())
.build()
.inject(this);
// ...
}
}
class LockDashboard extends Fragment {
@Inject Presenter presenter;
@Override public View onCreateView(
LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
((MyApplication)getActivity().getApplication())
.getLockDashboardComponent()
.loaderManager(getLoaderManager())
.build()
.inject(this);
// ...
}
}
What is DI?
Why would I want DI?
Why would I want Dagger to do DI?
How do I Dagger?
How can Dagger help me keep up?
Keeping up
with DI and
Dagger
@philosohacker
@unikeytech
(we’re hiring)

More Related Content

What's hot

Vaadin7
Vaadin7Vaadin7
Strong Duck Type Driven Development
Strong Duck Type Driven DevelopmentStrong Duck Type Driven Development
Strong Duck Type Driven Development
jcinnamond
 
Paintfree Object-Document Mapping for MongoDB by Philipp Krenn
Paintfree Object-Document Mapping for MongoDB by Philipp KrennPaintfree Object-Document Mapping for MongoDB by Philipp Krenn
Paintfree Object-Document Mapping for MongoDB by Philipp Krenn
JavaDayUA
 
Drools rule Concepts
Drools rule ConceptsDrools rule Concepts
Drools rule Concepts
RaviShankar Mishra
 
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code ExampleMaven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
Nikhil Bhalwankar
 
Drools Introduction
Drools IntroductionDrools Introduction
Drools Introduction
JBug Italy
 
Codemotion 2013 scalatra play spray
Codemotion 2013 scalatra play sprayCodemotion 2013 scalatra play spray
Codemotion 2013 scalatra play spray
realbot
 
Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)
Artur Skowroński
 
Get Back in Control of Your SQL with jOOQ at #Java2Days
Get Back in Control of Your SQL with jOOQ at #Java2DaysGet Back in Control of Your SQL with jOOQ at #Java2Days
Get Back in Control of Your SQL with jOOQ at #Java2Days
Lukas Eder
 
Testable, Object-Oriented JavaScript
Testable, Object-Oriented JavaScriptTestable, Object-Oriented JavaScript
Testable, Object-Oriented JavaScript
Jon Kruger
 
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby DeveloperVenturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Jon Kruger
 
Drupalcamp gent - Node access
Drupalcamp gent - Node accessDrupalcamp gent - Node access
Drupalcamp gent - Node access
Jasper Knops
 
MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019
MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019
MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019
Dave Stokes
 
Talk about html5 security
Talk about html5 securityTalk about html5 security
Talk about html5 security
Huang Toby
 
Blockchain: Developer Perspective
Blockchain: Developer PerspectiveBlockchain: Developer Perspective
Blockchain: Developer Perspective
Artur Skowroński
 
Top5 scalabilityissues
Top5 scalabilityissuesTop5 scalabilityissues
Top5 scalabilityissues
ColdFusionConference
 
JBoss Drools - Open-Source Business Logic Platform
JBoss Drools - Open-Source Business Logic PlatformJBoss Drools - Open-Source Business Logic Platform
JBoss Drools - Open-Source Business Logic Platform
elliando dias
 
Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)
nyccamp
 
Hacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce CompanyHacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce Company
MongoDB
 
Figaro
FigaroFigaro

What's hot (20)

Vaadin7
Vaadin7Vaadin7
Vaadin7
 
Strong Duck Type Driven Development
Strong Duck Type Driven DevelopmentStrong Duck Type Driven Development
Strong Duck Type Driven Development
 
Paintfree Object-Document Mapping for MongoDB by Philipp Krenn
Paintfree Object-Document Mapping for MongoDB by Philipp KrennPaintfree Object-Document Mapping for MongoDB by Philipp Krenn
Paintfree Object-Document Mapping for MongoDB by Philipp Krenn
 
Drools rule Concepts
Drools rule ConceptsDrools rule Concepts
Drools rule Concepts
 
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code ExampleMaven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
 
Drools Introduction
Drools IntroductionDrools Introduction
Drools Introduction
 
Codemotion 2013 scalatra play spray
Codemotion 2013 scalatra play sprayCodemotion 2013 scalatra play spray
Codemotion 2013 scalatra play spray
 
Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)Blockchain: Developer's Perspective (Java Edition)
Blockchain: Developer's Perspective (Java Edition)
 
Get Back in Control of Your SQL with jOOQ at #Java2Days
Get Back in Control of Your SQL with jOOQ at #Java2DaysGet Back in Control of Your SQL with jOOQ at #Java2Days
Get Back in Control of Your SQL with jOOQ at #Java2Days
 
Testable, Object-Oriented JavaScript
Testable, Object-Oriented JavaScriptTestable, Object-Oriented JavaScript
Testable, Object-Oriented JavaScript
 
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby DeveloperVenturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
 
Drupalcamp gent - Node access
Drupalcamp gent - Node accessDrupalcamp gent - Node access
Drupalcamp gent - Node access
 
MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019
MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019
MySQL Without the SQL - Oh My! -> MySQL Document Store -- Confoo.CA 2019
 
Talk about html5 security
Talk about html5 securityTalk about html5 security
Talk about html5 security
 
Blockchain: Developer Perspective
Blockchain: Developer PerspectiveBlockchain: Developer Perspective
Blockchain: Developer Perspective
 
Top5 scalabilityissues
Top5 scalabilityissuesTop5 scalabilityissues
Top5 scalabilityissues
 
JBoss Drools - Open-Source Business Logic Platform
JBoss Drools - Open-Source Business Logic PlatformJBoss Drools - Open-Source Business Logic Platform
JBoss Drools - Open-Source Business Logic Platform
 
Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)Node Access in Drupal 7 (and Drupal 8)
Node Access in Drupal 7 (and Drupal 8)
 
Hacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce CompanyHacking MongoDB at RelateIQ, A Salesforce Company
Hacking MongoDB at RelateIQ, A Salesforce Company
 
Figaro
FigaroFigaro
Figaro
 

Similar to Di and Dagger

Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)
Danny Preussler
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScript
Andrew Dupont
 
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingZend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
Tricode (part of Dept)
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...
go_oh
 
Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...
Thinqloud
 
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
 
The cost of learning - advantage of mixer2
The cost of learning - advantage of mixer2The cost of learning - advantage of mixer2
The cost of learning - advantage of mixer2
Y Watanabe
 
Building DSLs with Groovy
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with Groovy
Sten Anderson
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
pootsbook
 
Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15
Murat Yener
 
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
Jiayun Zhou
 
Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS
Nuxeo
 
Teste de Integração com DbUnit e jIntegrity
Teste de Integração com DbUnit e jIntegrityTeste de Integração com DbUnit e jIntegrity
Teste de Integração com DbUnit e jIntegrity
Washington Botelho
 
Single page webapps & javascript-testing
Single page webapps & javascript-testingSingle page webapps & javascript-testing
Single page webapps & javascript-testing
smontanari
 
Sqladria 2009 SRC
Sqladria 2009 SRCSqladria 2009 SRC
Sqladria 2009 SRC
tepsum
 
Improving android experience for both users and developers
Improving android experience for both users and developersImproving android experience for both users and developers
Improving android experience for both users and developers
Pavel Lahoda
 
Droidcon2013 android experience lahoda
Droidcon2013 android experience lahodaDroidcon2013 android experience lahoda
Droidcon2013 android experience lahoda
Droidcon Berlin
 
Introduction to Domain-Driven Design
Introduction to Domain-Driven DesignIntroduction to Domain-Driven Design
Introduction to Domain-Driven Design
Yoan-Alexander Grigorov
 
Backbone - TDC 2011 Floripa
Backbone - TDC 2011 FloripaBackbone - TDC 2011 Floripa
Backbone - TDC 2011 Floripa
Rafael Felix da Silva
 

Similar to Di and Dagger (20)

Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScript
 
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingZend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...
 
Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...Learning jQuery made exciting in an interactive session by one of our team me...
Learning jQuery made exciting in an interactive session by one of our team me...
 
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
 
The cost of learning - advantage of mixer2
The cost of learning - advantage of mixer2The cost of learning - advantage of mixer2
The cost of learning - advantage of mixer2
 
Building DSLs with Groovy
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with Groovy
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 
Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15
 
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
 
Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS Devoxx08 - Nuxeo Core, JCR 2, CMIS
Devoxx08 - Nuxeo Core, JCR 2, CMIS
 
Teste de Integração com DbUnit e jIntegrity
Teste de Integração com DbUnit e jIntegrityTeste de Integração com DbUnit e jIntegrity
Teste de Integração com DbUnit e jIntegrity
 
Single page webapps & javascript-testing
Single page webapps & javascript-testingSingle page webapps & javascript-testing
Single page webapps & javascript-testing
 
Sqladria 2009 SRC
Sqladria 2009 SRCSqladria 2009 SRC
Sqladria 2009 SRC
 
Improving android experience for both users and developers
Improving android experience for both users and developersImproving android experience for both users and developers
Improving android experience for both users and developers
 
Droidcon2013 android experience lahoda
Droidcon2013 android experience lahodaDroidcon2013 android experience lahoda
Droidcon2013 android experience lahoda
 
Introduction to Domain-Driven Design
Introduction to Domain-Driven DesignIntroduction to Domain-Driven Design
Introduction to Domain-Driven Design
 
Backbone - TDC 2011 Floripa
Backbone - TDC 2011 FloripaBackbone - TDC 2011 Floripa
Backbone - TDC 2011 Floripa
 

More from K. Matthew Dupree

intro-to-metaprogramming-in-r.pdf
intro-to-metaprogramming-in-r.pdfintro-to-metaprogramming-in-r.pdf
intro-to-metaprogramming-in-r.pdf
K. Matthew Dupree
 
Intro To Gradient Descent in Javascript
Intro To Gradient Descent in JavascriptIntro To Gradient Descent in Javascript
Intro To Gradient Descent in Javascript
K. Matthew Dupree
 
Dagger 2, 2 years later
Dagger 2, 2 years laterDagger 2, 2 years later
Dagger 2, 2 years later
K. Matthew Dupree
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
K. Matthew Dupree
 
If Android Tests Could Talk
If Android Tests Could TalkIf Android Tests Could Talk
If Android Tests Could Talk
K. Matthew Dupree
 
Writing testable android apps
Writing testable android appsWriting testable android apps
Writing testable android apps
K. Matthew Dupree
 
Functional Testing for React Native Apps
Functional Testing for React Native AppsFunctional Testing for React Native Apps
Functional Testing for React Native Apps
K. Matthew Dupree
 
Testable android apps
Testable android appsTestable android apps
Testable android apps
K. Matthew Dupree
 

More from K. Matthew Dupree (8)

intro-to-metaprogramming-in-r.pdf
intro-to-metaprogramming-in-r.pdfintro-to-metaprogramming-in-r.pdf
intro-to-metaprogramming-in-r.pdf
 
Intro To Gradient Descent in Javascript
Intro To Gradient Descent in JavascriptIntro To Gradient Descent in Javascript
Intro To Gradient Descent in Javascript
 
Dagger 2, 2 years later
Dagger 2, 2 years laterDagger 2, 2 years later
Dagger 2, 2 years later
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
 
If Android Tests Could Talk
If Android Tests Could TalkIf Android Tests Could Talk
If Android Tests Could Talk
 
Writing testable android apps
Writing testable android appsWriting testable android apps
Writing testable android apps
 
Functional Testing for React Native Apps
Functional Testing for React Native AppsFunctional Testing for React Native Apps
Functional Testing for React Native Apps
 
Testable android apps
Testable android appsTestable android apps
Testable android apps
 

Recently uploaded

Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
Alberto Brandolini
 
Going AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applicationsGoing AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applications
Alina Yurenko
 
Orca: Nocode Graphical Editor for Container Orchestration
Orca: Nocode Graphical Editor for Container OrchestrationOrca: Nocode Graphical Editor for Container Orchestration
Orca: Nocode Graphical Editor for Container Orchestration
Pedro J. Molina
 
Streamlining End-to-End Testing Automation
Streamlining End-to-End Testing AutomationStreamlining End-to-End Testing Automation
Streamlining End-to-End Testing Automation
Anand Bagmar
 
如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样
如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样
如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样
gapen1
 
Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...
Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...
Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...
The Third Creative Media
 
Beginner's Guide to Observability@Devoxx PL 2024
Beginner's  Guide to Observability@Devoxx PL 2024Beginner's  Guide to Observability@Devoxx PL 2024
Beginner's Guide to Observability@Devoxx PL 2024
michniczscribd
 
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom KittEnhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
Peter Caitens
 
How GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdfHow GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdf
Zycus
 
The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024
Yara Milbes
 
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
safelyiotech
 
Ensuring Efficiency and Speed with Practical Solutions for Clinical Operations
Ensuring Efficiency and Speed with Practical Solutions for Clinical OperationsEnsuring Efficiency and Speed with Practical Solutions for Clinical Operations
Ensuring Efficiency and Speed with Practical Solutions for Clinical Operations
OnePlan Solutions
 
美洲杯赔率投注网【​网址​🎉3977·EE​🎉】
美洲杯赔率投注网【​网址​🎉3977·EE​🎉】美洲杯赔率投注网【​网址​🎉3977·EE​🎉】
美洲杯赔率投注网【​网址​🎉3977·EE​🎉】
widenerjobeyrl638
 
Boost Your Savings with These Money Management Apps
Boost Your Savings with These Money Management AppsBoost Your Savings with These Money Management Apps
Boost Your Savings with These Money Management Apps
Jhone kinadey
 
Cost-Effective Strategies For iOS App Development
Cost-Effective Strategies For iOS App DevelopmentCost-Effective Strategies For iOS App Development
Cost-Effective Strategies For iOS App Development
Softradix Technologies
 
DECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSIS
DECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSISDECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSIS
DECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSIS
Tier1 app
 
All you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVMAll you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVM
Alina Yurenko
 
Flutter vs. React Native: A Detailed Comparison for App Development in 2024
Flutter vs. React Native: A Detailed Comparison for App Development in 2024Flutter vs. React Native: A Detailed Comparison for App Development in 2024
Flutter vs. React Native: A Detailed Comparison for App Development in 2024
dhavalvaghelanectarb
 
Building API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructureBuilding API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructure
confluent
 

Recently uploaded (20)

Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
 
Going AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applicationsGoing AOT: Everything you need to know about GraalVM for Java applications
Going AOT: Everything you need to know about GraalVM for Java applications
 
bgiolcb
bgiolcbbgiolcb
bgiolcb
 
Orca: Nocode Graphical Editor for Container Orchestration
Orca: Nocode Graphical Editor for Container OrchestrationOrca: Nocode Graphical Editor for Container Orchestration
Orca: Nocode Graphical Editor for Container Orchestration
 
Streamlining End-to-End Testing Automation
Streamlining End-to-End Testing AutomationStreamlining End-to-End Testing Automation
Streamlining End-to-End Testing Automation
 
如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样
如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样
如何办理(hull学位证书)英国赫尔大学毕业证硕士文凭原版一模一样
 
Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...
Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...
Unlock the Secrets to Effortless Video Creation with Invideo: Your Ultimate G...
 
Beginner's Guide to Observability@Devoxx PL 2024
Beginner's  Guide to Observability@Devoxx PL 2024Beginner's  Guide to Observability@Devoxx PL 2024
Beginner's Guide to Observability@Devoxx PL 2024
 
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom KittEnhanced Screen Flows UI/UX using SLDS with Tom Kitt
Enhanced Screen Flows UI/UX using SLDS with Tom Kitt
 
How GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdfHow GenAI Can Improve Supplier Performance Management.pdf
How GenAI Can Improve Supplier Performance Management.pdf
 
The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024
 
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
 
Ensuring Efficiency and Speed with Practical Solutions for Clinical Operations
Ensuring Efficiency and Speed with Practical Solutions for Clinical OperationsEnsuring Efficiency and Speed with Practical Solutions for Clinical Operations
Ensuring Efficiency and Speed with Practical Solutions for Clinical Operations
 
美洲杯赔率投注网【​网址​🎉3977·EE​🎉】
美洲杯赔率投注网【​网址​🎉3977·EE​🎉】美洲杯赔率投注网【​网址​🎉3977·EE​🎉】
美洲杯赔率投注网【​网址​🎉3977·EE​🎉】
 
Boost Your Savings with These Money Management Apps
Boost Your Savings with These Money Management AppsBoost Your Savings with These Money Management Apps
Boost Your Savings with These Money Management Apps
 
Cost-Effective Strategies For iOS App Development
Cost-Effective Strategies For iOS App DevelopmentCost-Effective Strategies For iOS App Development
Cost-Effective Strategies For iOS App Development
 
DECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSIS
DECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSISDECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSIS
DECODING JAVA THREAD DUMPS: MASTER THE ART OF ANALYSIS
 
All you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVMAll you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVM
 
Flutter vs. React Native: A Detailed Comparison for App Development in 2024
Flutter vs. React Native: A Detailed Comparison for App Development in 2024Flutter vs. React Native: A Detailed Comparison for App Development in 2024
Flutter vs. React Native: A Detailed Comparison for App Development in 2024
 
Building API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructureBuilding API data products on top of your real-time data infrastructure
Building API data products on top of your real-time data infrastructure
 

Di and Dagger