SolCal CodeCamp Clean Code II Dependency Injection San Diego, June 24rd 2012
Theo Jungeblut • Senior Software Developer at AppDynamics in San Francisco • architects decoupled solutions tailored to business needs and crafts maintainable code to last • worked in healthcare and factory automation, building mission critical applications, framework & platforms for 8+ years • degree in Software Engineering and Network Communications theo@designitright.net • enjoys cycling, running and eating www.designitright.net www.speakerrate.com/theoj
Overview • Why Clean Code? • What is Dependency Injection? • What are Dependencies? • What is the IoC-Container doing for you? • What, how, why? • Q&A
Does writing Clean Code make us more efficient?
What is Clean Code?
Clean Code is maintainable Source code must be: • readable & well structured • extensible • testable
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
What is Dependency Injection?
Without Dependency Injection public class ExampleClass { private logger logger; public ExampleClass() { this.logger = new Logger(); this.logger.Log(“Constructor call”); } }
Without Dependency Injection public class ExampleClass { private logger logger; public ExampleClass() { this.logger = new Logger(); this.logger.Log(“Constructor call”); } }
Inversion of Control – Constructor Injection http://www.martinfowler.com/articles/injection.html public class ExampleClass { private logger logger; public ExampleClass(ILogger logger) { this.logger = logger; if (logger == null) { throw new ArgumentNullException(“logger”); } this.logger.Log(“Constructor call”); } }
Benefits of Dependency Injection Benefit Description Late binding Services can be swapped with other services. Extensibility Code can be extended and reused in ways not explicitly planned for. Parallel Code can be developed in parallel. development Maintainability Classes with clearly defined responsibilities are easier to maintain. TESTABILITY Classes can be unit tested. * from Mark Seemann’s “Dependency Injection in .NET”, page 16
The Adapter Pattern from Gang of Four, “Design Patterns”
Inversion of Control – Setter (Property) Injection http://www.martinfowler.com/articles/injection.html // UNITY Example public class ContactManager : IContactManager { [Dependency] public IContactPersistence ContactPersistence { get { return this.contactPersistence; } set { this.contactPersistence = value; } } }
Property Injection + Easy to understand - Hard to implement robust * Take if an good default exists - Limited in application otherwise
Method Injection http://www.martinfowler.com/articles/injection.html 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); } }
Ambient Context public class ContactManager : IContactManager { …. public bool Save (….) { …. IUser currentUser = ApplicationContext.CurrentUser; …. } } * The Ambient Context object needs to have a default value if not assigned yet.
Ambient Context • Avoids polluting an API with Cross Cutting Concerns • Only for Cross Cutting Concerns • Limited in application otherwise
What are Dependencies ?
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”
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”
Lifetime a Job for the Container
“Register, Resolve, Release” “Three Calls Pattern by Krzysztof Koźmic: http://kozmic.pl/ Build 1. Register Execu Clean You code Release up 2. Resolve te up
What the IoC-Container will do for you Build 1. Register Clean Release up 2. Resolve up
Separation of Consern (SoC) probably by Edsger W. Dijkstra in 1974 • Focus on purpose of your code • Know only the contracts of the Execu You code dependencies te • No need to know implementations • No need to handle lifetime of the dependencies
The 3 Dimensions of DI 1.Object Composition 2.Object Lifetime 3.Interception
Register - Composition Root • XML based Configuration • Code based Configuration • Convention based (Discovery)
Resolve Resolve a single object request for example by Consturctor Injection by resolving the needed object graph for this object.
Release Release objects from Container when not needed anymore.
Interception Public class LoggingInterceptor : IContactManager { public bool Save(IContact contact) { bool success; Public class ContactManager : IContactManager this. logger.Log(“Starting saving’); { public bool Save(IContact contact) success = { this.contactManager.Save(contact); …. this. logger.Log(“Starting saving’); return Result } return success; } } } * Note: strong simplification of what logically happens through interception.
Anti Patterns
Control Freak http://www.freakingnews.com/The-Puppet-Master-will-play-Pics-102728.asp
Inversion of Control – Service Locator http://www.martinfowler.com/articles/injection.html // UNITY Example internal static class Program { private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm; private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); } }
Inversion of Control – Service Locator http://www.martinfowler.com/articles/injection.html // UNITY Example internal static class Program { private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm; private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); } }
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 Related Technology: • Spring.NET • Managed Extensibility Framework (MEF) • Autofac • Windows Communication Foundation (WCF) • Puzzle.Nfactory • Ninject • PicoContainer.NET • and more
The “Must Read”-Book(s) by Mark Seemann Dependency Injection is a set of software design principles and patterns that enable us to develop loosely coupled code. http://www.manning.com/seemann/
Summary Clean Code - DI Maintainability is achieved through: • Simplification, Specialization Decoupling (KISS, SoC, IoC, DI) • Dependency Injection Constructor Injection as default, Property and Method Injection as needed, Ambient Context for Dependencies with a default, Service Locator never Graphic by Nathan Sawaya courtesy of brickartist.com • Registration Configuration by Convention if possible, exception in Code as needed Configuration by XML for explicit extensibility and post compile setup • Quality through Testability (all of them!)
Q&A Downloads, Feedback & Comments: theo@designitright.net www.designitright.net www.speakerrate.com/theoj Graphic by Nathan Sawaya courtesy of brickartist.com
References… http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11 http://www.manning.com/seemann/ http://en.wikipedia.org/wiki/Keep_it_simple_stupid http://picocontainer.org/patterns.html http://en.wikipedia.org/wiki/Dependency_inversion_principle http://en.wikipedia.org/wiki/Don't_repeat_yourself http://en.wikipedia.org/wiki/Component-oriented_programming http://en.wikipedia.org/wiki/Service-oriented_architecture http://www.martinfowler.com/articles/injection.html http://www.codeproject.com/KB/aspnet/IOCDI.aspx http://msdn.microsoft.com/en-us/magazine/cc163739.aspx http://msdn.microsoft.com/en-us/library/ff650320.aspx http://msdn.microsoft.com/en-us/library/aa973811.aspx http://msdn.microsoft.com/en-us/library/ff647976.aspx http://msdn.microsoft.com/en-us/library/cc707845.aspx http://msdn.microsoft.com/en-us/library/bb833022.aspx http://unity.codeplex.com/ Lego (trademarked in capitals as LEGO)
Please fill out the feedback, and… www.speakerrate.com/theoj … thanks for you attention! And visit and support the www.sandiegodotnet.com

Clean Code Part II - Dependency Injection at SoCal Code Camp