Cut your Dependencies with Dependency Injection for East Bay.NET User Group

907 views

Published on

Dependency injection is a design patter with the potential to write cleaner code. Over the lifetime of a product, maintaining the product is actuall one - if the the most - expensive areas of the overall product costs. Writing clean code can significantly lower these costs. Writing clean code also makes you more efficient during the initial development time and results in a more stable code base.

In this talk, we will dive into the basics of Inversion of Control (IoC) and Dependency Injection (DI) to review different ways of achieving decoupling. We will explorer best practices, design, and anti-patterns.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
907
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
14
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Cut your Dependencies with Dependency Injection for East Bay.NET User Group

  1. 1. East Bay.NETCut your Dependencies Dependency Injection Berkeley, February 14th 2013
  2. 2. Theo Jungeblut• Engineering manager & lead by day at AppDynamics in San Francisco• Coder & software craftsman by night, house builder and soon to be dad• Architects decoupled solutions & crafts maintainable code to last• Worked in healthcare and factory automation, building mission critical applications, framework & platforms• Degree in Software Engineering and Network Communications theo@designitright.net• Enjoys cycling, running and eating www.designitright.net
  3. 3. Rate Session & Win a Shirthttp://www.speakerrate.com/theoj
  4. 4. Where to get the Slideshttp://www.slideshare.net/theojungeblut
  5. 5. 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
  6. 6. A cleanly layered Architecture UI UI Service Service Processor Processor Processor Resources Resources
  7. 7. What is the problem?
  8. 8. What is Clean Code?
  9. 9. Clean Code is maintainable Source code must be: • readable & well structured • extensible • testable
  10. 10. 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
  11. 11. What isDependency Injection?
  12. 12. Without Dependency Injection public class ExampleClass { private logger logger; public ExampleClass() { this.logger = new Logger(); this.logger.Log(“Constructor call”); } }
  13. 13. Without Dependency Injection public class ExampleClass { private logger logger; public ExampleClass() { this.logger = new Logger(); this.logger.Log(“Constructor call”); } }
  14. 14. 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”); } }
  15. 15. 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
  16. 16. The Adapter Pattern from Gang of Four, “Design Patterns”
  17. 17. What areDependencies ?
  18. 18. 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”
  19. 19. 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”
  20. 20. Lifetime a Jobfor the Container
  21. 21. “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
  22. 22. What the IoC-Container will do for youBuild 1. Register Clean Release up 2. Resolve up
  23. 23. Separation of Concern (SoC) probably by Edsger W. Dijkstra in 1974 • Focus on purpose of your code • Know only the contracts of theExecu You code dependencies te • No need to know implementations • No need to handle lifetime of the dependencies
  24. 24. The 3 Dimensions of DI1.Object Composition2.Object Lifetime3.Interception
  25. 25. Register - Composition Root • XML based Configuration • Code based Configuration • Convention based (Discovery)
  26. 26. ResolveResolve a single object request forexample by Constructor Injectionby resolving the needed objectgraph for this object.
  27. 27. ReleaseRelease objects from Containerwhen not needed anymore.
  28. 28. AntiPatterns
  29. 29. Control Freakhttp://www.freakingnews.com/The-Puppet-Master-will-play-Pics-102728.asp
  30. 30. Inversion of Control –Service Locator http://www.martinfowler.com/articles/injection.html// UNITY Exampleinternal static class Program{ private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm; private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); }}
  31. 31. Inversion of Control –Service Locator http://www.martinfowler.com/articles/injection.html// UNITY Exampleinternal static class Program{ private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm; private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); }}
  32. 32. 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; } } }
  33. 33. Property Injection+ Easy to understand- Hard to implement robust* Take if an good default exists- Limited in application otherwise
  34. 34. Method Injectionhttp://www.martinfowler.com/articles/injection.htmlpublic 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); }}
  35. 35. Method Injection• Needed for handling changing dependencies in method calls
  36. 36. 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.
  37. 37. Ambient Context• Avoids polluting an API with Cross Cutting Concerns• Only for Cross Cutting Concerns• Limited in application otherwise
  38. 38. InterceptionPublic 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.
  39. 39. 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 • Puzzle.Nfactory • Ninject • PicoContainer.NET • and more
  40. 40. The “Must Read”-Book(s) by Mark SeemannDependencyInjection is a set ofsoftware designprinciples andpatterns thatenable us todevelop looselycoupled code. http://www.manning.com/seemann/
  41. 41. Summary Clean Code - DIMaintainability 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!)
  42. 42. Q&A Downloads, Feedback & Comments: theo@designitright.net www.designitright.net www.speakerrate.com/theojGraphic by Nathan Sawaya courtesy of brickartist.com
  43. 43. 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/Dont_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/ Lego (trademarked in capitals as LEGO)
  44. 44. Blog, Rating, Slideswww.speakerrate.com/theojwww.slideshare.net/theojungeblut http://www.DesignItRight.net
  45. 45. Please fill out thefeedback, and…… thanks for you attention!

×