Clean Code II - Dependency Injection

51
Clean Code II Foothill College, Oct. 11 th , 2014 Dependency Injection

description

All 3 Clean Code presentations provide great value by themselves, but taken together are designed to offer a holistic approach to successful software creation. This first session creates the foundation for the 2nd and 3rd Clean Code presentation on Dependency Injection, as it explains expected base knowledge. Why writing Clean Code makes us more efficient Over the lifetime of a product, maintaining the product is actually one - if not the most - expensive area(s) of the overall product costs. We will dive into the basics of Inversion of Control (IOC) and Dependency Injection (DI) to review different ways of achieving decoupling, using and exploring both: Best Practices, Design and Anti Patterns. This presentation requires knowledge and understanding of basics like DRY, SoC, SRP, SOLID etc. which are building the base for decoupled architecture. However, we will start at the basics of DI and will work towards intermediate and advanced scenarios depending on the participating group. This presentation is based on C# and Visual Studio 2013. However, the demonstrated patterns and practice can be applied to every other programming language too. Note: Moving forwards this presentation will be updated with the latest version of the slides for the last event I did the presentation instead of creating new separate slide decks here on slideshare. Presentation dates and locations: 2014-11-14 SoCal Code Camp - Los Angeles, CA 2014-10-11 Silicon Valley Code Camp, Los Altos Hills, CA

Transcript of Clean Code II - Dependency Injection

Page 1: Clean Code II - Dependency Injection

Clean Code II

Foothill College, Oct. 11th, 2014

Dependency Injection

Page 2: Clean Code II - Dependency Injection

Theo Jungeblut• Engineering manager & lead by day

at AppDynamics in San Francisco

• Coder & software craftsman by night, first time dad and house builder

• Architects decoupled solutions & crafts maintainable code to last

• Worked in healthcare and factory automation, building mission critical applications, framework & platforms

• Degree in Software Engineeringand Network Communications

• Enjoys cycling, running and [email protected]

www.designitright.net

Page 3: Clean Code II - Dependency Injection

We are hiring!http://www.appdynamics.com/ careers

Page 4: Clean Code II - Dependency Injection

and there are much more positions

Page 5: Clean Code II - Dependency Injection

Your feedback is important!

http://www.speakerrate.com/theoj

Page 6: Clean Code II - Dependency Injection

Where to get the Slides

http://www.slideshare.net/theojungeblut

Page 7: Clean Code II - Dependency Injection

Overview

• What is the issue?• What is Dependency Injection?• What are Dependencies?• What is the IoC-Container doing for you?• What, how, why?• Q & A

Page 8: Clean Code II - Dependency Injection

UI Layer

ServiceLayer

Business Layer

Data Layer

Web UI

Service

ProcessorProcessor

Service

RepositoryRepository

Mobile UI

Processor

A cleanly layered Architecture

Page 9: Clean Code II - Dependency Injection

What is the problem?

Page 10: Clean Code II - Dependency Injection
Page 11: Clean Code II - Dependency Injection

What is Clean Code?

Page 12: Clean Code II - Dependency Injection

Clean Code is maintainable

Source code must be:• readable & well structured• extensible• testable

Page 13: Clean Code II - Dependency Injection

Code Maintainability *

Principles Patterns Containers

Why? How? What?

Extensibility Clean Code Tool reuse

* from: Mark Seemann’s “Dependency Injection in .NET” presentation Bay.NET 05/2011

Page 14: Clean Code II - Dependency Injection

What is Dependency Injection?

Page 15: Clean Code II - Dependency Injection

Without Dependency Injection

public class ExampleClass{

private Logger logger;

public ExampleClass(){

this.logger = new Logger();

this.logger.Log(“Constructor call”);}

}

Page 16: Clean Code II - Dependency Injection

public class ExampleClass{

private Logger logger;

public ExampleClass(){

this.logger = new Logger();

this.logger.Log(“Constructor call”);}

}

Without Dependency Injection

Avoid

Page 17: Clean Code II - Dependency Injection

Inversion of Control –

Constructor Injectionhttp://www.martinfowler.com/articles/injection.html

public class ExampleClass{

private ILogger logger;

public ExampleClass(ILogger logger){

this.logger = logger;if (logger == null){

throw new ArgumentNullException(“logger”);}

this.logger.Log(“Constructor call”);}

}

Page 18: Clean Code II - Dependency Injection

Why is Dependency Injection

beneficial?

Page 19: Clean Code II - Dependency Injection

Benefits of Dependency InjectionBenefit Description

Late binding Services can be swapped withother services.

Extensibility Code can be extended and reusedin ways not explicitly planned for.

Paralleldevelopment

Code can be developed in parallel.

Maintainability Classes with clearly definedresponsibilities are easier to maintain.

TESTABILITY Classes can be unit tested.

* from Mark Seemann’s “Dependency Injection in .NET”, page 16

Page 20: Clean Code II - Dependency Injection

The Adapter Patternfrom Gang of Four, “Design Patterns”

Page 21: Clean Code II - Dependency Injection

What are

Dependencies ?

Page 22: Clean Code II - Dependency Injection

Stable Dependency

“A DEPENDENCY that can be referenced without any detrimental effects.

The opposite of a VOLATILE DEPENDENCY. “

* From Glossary: Mark Seemann’s “Dependency Injection in .NET”

Page 23: Clean Code II - Dependency Injection

Volatile Dependency

“A DEPENDENCY that involves side effects that may be undesirable at times.

This may include modules that don’t yet exist, or that have adverse requirements on its runtime environment.

These are the DEPENDENCIES that are addressed by DI.“

* From Glossary: Mark Seemann’s “Dependency Injection in .NET”

Page 24: Clean Code II - Dependency Injection

Lifetime a Job

for the Container

Page 25: Clean Code II - Dependency Injection

public class ExampleClass{

private Logger logger;

public ExampleClass(){

this.logger = new Logger();

this.logger.Log(“Constructor call”);}

}

Without Dependency Injection

Avoid

Page 26: Clean Code II - Dependency Injection

“Register, Resolve, Release”“Three Calls Pattern by Krzysztof Koźmic: http://kozmic.pl/

1. Register 2. Resolve

Build up Your code

Execute ReleaseClean

up

Page 27: Clean Code II - Dependency Injection

What the IoC-Container will do for you

1. Register 2. Resolve

Build up ReleaseClean

up

Page 28: Clean Code II - Dependency Injection

Separation of Concern (SoC)probably by Edsger W. Dijkstra in 1974

You codeExecute

• Focus on purpose of your code• Know only the contracts of the

dependencies• No need to know implementations• No need to handle lifetime of the

dependencies

Page 29: Clean Code II - Dependency Injection

The 3 Dimensions of DI

1.Object Composition2.Object Lifetime3.Interception

Page 30: Clean Code II - Dependency Injection

Register - Composition Root

• XML based Configuration• Code based Configuration• Convention based (Discovery)

Page 31: Clean Code II - Dependency Injection

Resolve

Resolve a single object request for example by Constructor Injection by resolving the needed object graph for this object.

Page 32: Clean Code II - Dependency Injection

Release

Release objects from Container when not needed anymore.

Page 33: Clean Code II - Dependency Injection

Anti Patterns

Page 34: Clean Code II - Dependency Injection

Control Freak

http://www.freakingnews.com/The-Puppet-Master-will-play-Pics-102728.asp

Page 35: Clean Code II - Dependency Injection

// UNITY Exampleinternal static class Program{ private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm;

private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); }}

Inversion of Control –

Service Locatorhttp://www.martinfowler.com/articles/injection.html

Page 36: Clean Code II - Dependency Injection

// UNITY Exampleinternal static class Program{ private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm;

private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); }}

Inversion of Control –

Service Locatorhttp://www.martinfowler.com/articles/injection.html

Anti-Pattern

based on Mark Seemann

Page 37: Clean Code II - Dependency Injection

Inversion of Control –

Setter (Property) Injection

// UNITY Examplepublic class ContactManager : IContactManager{ [Dependency] public IContactPersistence ContactPersistence { get { return this.contactPersistence; }

set { this.contactPersistence = value; } }}

http://www.martinfowler.com/articles/injection.html

Page 38: Clean Code II - Dependency Injection

Property Injection

+ Easy to understand

- Hard to implement robust

* Take if an good default exists

- Limited in application otherwise

Page 39: Clean Code II - Dependency Injection

Method Injection

public class ContactManager : IContactManager{ …. public bool Save (IContactPersistencecontactDatabaseService, IContact contact) { if (logger == null) {

throw new ArgumentNullException(“logger”); } …. // Additional business logic executed before calling the save

return contactDatabaseService.Save(contact); }}

http://www.martinfowler.com/articles/injection.html

Page 40: Clean Code II - Dependency Injection

Method Injection

• Needed for handling changing dependencies in method calls

Page 41: Clean Code II - Dependency Injection

Ambient Contextpublic class ContactManager : IContactManager{ …. public bool Save (….) { …. IUser currentUser = ApplicationContext.CurrentUser; …. }}

* The Ambient Context object needs to have a default value if not assigned yet.

Page 42: Clean Code II - Dependency Injection

Ambient Context

• Avoids polluting an API with Cross Cutting Concerns

• Only for Cross Cutting Concerns

• Limited in application otherwise

Page 43: Clean Code II - Dependency Injection

Interception

Public class LoggingInterceptor : IContactManager{ public bool Save(IContact contact) { bool success;

this. logger.Log(“Starting saving’);

success = this.contactManager.Save(contact);

this. logger.Log(“Starting saving’);

return success; }}

Public class ContactManager : IContactManager{ public bool Save(IContact contact) { ….

return Result }}

* Note: strong simplification of what logically happens through interception.

Page 44: Clean Code II - Dependency Injection

Dependency Injection Container & more• Typically support all types of Inversion of Control mechanisms• Constructor Injection• Property (Setter) Injection• Method (Interface) Injection• Service Locator

•.NET based DI-Container• Unity• Castle Windsor • StructureMap• Spring.NET• Autofac• Puzzle.Nfactory• Ninject• PicoContainer.NET• and more

Related Technology:• Managed Extensibility Framework (MEF)

Page 45: Clean Code II - Dependency Injection

The “Must Read”-Book(s)

http://www.manning.com/seemann/

by Mark Seemann

Dependency Injection is a set of software design principles and patterns that enable us to develop loosely coupled code.

Page 46: Clean Code II - Dependency Injection

Summary Clean Code - DIMaintainability is achieved through:

• Simplification, Specialization Decoupling (KISS, SoC, IoC, DI)

• Dependency InjectionConstructor Injection as default, Property and Method Injection as needed, Ambient Context for Dependencies with a default,Service Locator never

• Registration Configuration by Convention if possible, exception in Code as neededConfiguration by XML for explicit extensibility and post compile setup

• Quality through Testability (all of them!)

Graphic by Nathan Sawaya courtesy of brickartist.com

Page 47: Clean Code II - Dependency Injection

Downloads, Feedback & Comments:

Q & A

Graphic by Nathan Sawaya courtesy of brickartist.com

[email protected] www.speakerrate.com/theoj

Page 48: Clean Code II - Dependency Injection

References… http://www.manning.com/seemann/http://en.wikipedia.org/wiki/Keep_it_simple_stupidhttp://picocontainer.org/patterns.htmlhttp://en.wikipedia.org/wiki/Dependency_inversion_principlehttp://en.wikipedia.org/wiki/Don't_repeat_yourselfhttp://en.wikipedia.org/wiki/Component-oriented_programminghttp://en.wikipedia.org/wiki/Service-oriented_architecturehttp://www.martinfowler.com/articles/injection.htmlhttp://www.codeproject.com/KB/aspnet/IOCDI.aspxhttp://msdn.microsoft.com/en-us/magazine/cc163739.aspxhttp://msdn.microsoft.com/en-us/library/ff650320.aspxhttp://msdn.microsoft.com/en-us/library/aa973811.aspxhttp://msdn.microsoft.com/en-us/library/ff647976.aspxhttp://msdn.microsoft.com/en-us/library/cc707845.aspxhttp://msdn.microsoft.com/en-us/library/bb833022.aspxhttp://unity.codeplex.com/https://code.google.com/p/autofac/http://funq.codeplex.comhttp://simpleinjector.codeplex.comhttp://docs.castleproject.org/Windsor.MainPage.ashxhttp://commonservicelocator.codeplex.comhttp://philipm.at/2011/di_speed.htmlhttp://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparisonhttp://stackoverflow.com/questions/4581791/how-do-the-major-c-sharp-di-ioc-frameworks-comparehttp://diframeworks.apphb.comhttp://www.sturmnet.org/blog/2010/03/04/poll-results-ioc-containers-for-net

Lego

(tra

dem

arke

d in

cap

itals

as

LEG

O)

Page 49: Clean Code II - Dependency Injection

Blog, Rating, Slides

http://www.DesignItRight.net

www.speakerrate.com/theoj

www.slideshare.net/theojungeblut

Page 50: Clean Code II - Dependency Injection

Time to say Thank You!

The OrganizersFoothill College (team)

The volunteers (how about you?)The

Spon

sors

Pict

ures

from

htt

p://

blog

.sili

conv

alle

y-co

deca

mp.

com

Page 51: Clean Code II - Dependency Injection

… thanks for you attention!

And visit and support the

www.siliconvalley-codecamp.com

Please fill out the feedback, and…

www.speakerrate.com/theoj