http://slideshare.net/CalebJenkins
“The single greatest thing that you can do to make your code more testable and healthy is to start taking a Dependency Injection approach to writing software” - Real World .NET, C# and Silverlight Wrox Press 2012 Caleb Jenkins
Super Spy (saves the world) Dr. Evil (bad guy)
public class DoubleOSuperSpy { public void StopDrEvilWithSpyWatch() { // Stop Dr. Evil } }
but what if we wanted to rescue the queen use our spy car stop nuclear attack,
?
?
?
public class DoubleOSuperSpy { public void StopDrEvilWithSpyWatch() { // Stop Dr. Evil } public void StopDrEvilWithSpyCar() { } public void SaveQueenWithSecretCrocodile() { } // Etc... }
public interface ISecretAgent { void RunMission(ISecretMission Mission); } public interface ISpyGadget { void UseGadget(string Target); } public interface ISecretMission { } public class SpyWatch : ISpyGadget public class StopDrEvilMission : ISecretMission public class DoubleOSuperSpy : ISecretAgent
public class DoubleOSuperSpy : ISecretAgent { private ISpyGadget spyWatch; private IMission stopDrEvil; public DoubleOSuperSpy() { spyWatch = new SpyWatch(); stopDrEvil = new StopDrEvilMission(); } public void RunMission() { spyWatch.UseTo(stopDrEvil); } } Separation of Concerns + Grouping of Features = Strategy Pattern
public class DoubleOSuperSpy : ISecretAgent { private ISpyGadget spyWatch; private IMission stopDrEvil; public DoubleOSuperSpy() { spyWatch = new SpyWatch(); stopDrEvil = new StopDrEvilMission(); } public void RunMission() { spyWatch.UseTo(stopDrEvil); } } Interfaces = Looser Coupling
public class Factory { public static ISecretAgent GetSecretAgent() { // Check config return new DoubleOSuperSpy(); } public static ISecretGadget GetSpyGadget() { // Check config return new SpyWatch(); } public static ISecretMission GetSecretMission() { // Check Config return new StopDrEvilMission(); } } A Factory
Factory Pattern
public class DoubleOSuperSpy : ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public void UseGadget() { gadget.UserGadget(mission); } } Abstract Factory Pattern = Abstraction of Creation + Polymorphism
public class DoubleOSuperSpy : ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public ISpyGadget Gadget { set { gadget = Value; } } public void SetMission(ISecretMission Mission) { mission = Mission; } public void UseGadget() { gadget.UseGadget(mission); } public void UseGadget(ISecretMission Mission) Factory Dependency Dependency Injection
public class DoubleOSuperSpy : ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public ISpyGadet Gadget { set { gadget = Value; } } public void SetMission(ISecretMission Mission) { mission = Mission; } public void UseWeapon(ISecretMission Mission) { gadget.UserGadget(Mission); } public void UseGadget()
public class DoubleOSuperSpy : ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public ISpyGadget Gadget { set { gadget = Value; } } public void SetMission(ISecretMission Mission) { mission = Mission; } public void RunMission() { gadget.UseGadget(mission); } public void RunMission (ISecretMission Mission) { gadget.UseGadget(Mission); }
public class DoubleOSuperSpy : ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; private DoubleOSuperSpy() { } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public void RunMission() { gadget.UseGadget(mission); } }
public class MyApplication { public void static Main() { ISecretAgent agent = Factory.GetSecretAgent(); ISpyGadget gadget = Factory.GetSpyGadget(); ISecretMission mission = Factory.GetSecretMission(); // Manual Dependency Injection agent.SetMission(mission); agent.SetGadget(gadget); agent.RunMissionMission(); } } Manual Dependency Injection
public class MyApplication { public void static Main() { ISpyGadget gadget = new SpyWatch(); ISecretMission mission = new StopDrEvilMission(); ISecretAgent agent = new DoubleOSuperSpy(gadget); agent.RunMission(mission); } } Manual Dependency Injection
Factory ISpyGadget ISecretMission ISecretAgent MyApplication Factory ISpyGadget ISecretMission
public class MyApplication { public void static Main() { ISecretAGent agent = Factory.GetSecretAgent(); ISpyGadget gadget = Factory.GetSpyGadget(); ISecretMission mission = Factory.GetSecretMission(); // Manual Dependency Injection agent.SetMission(mission); agent.SetSpyGadget(gadget); agent.RunMission(); } } Manual Dependency Injection
Manual Dependency Injection public class MyApplication { public void static Main() { ISecretAgent agent = (ISecretAgent) Context.GetInstance(“ISecretAgent”); } } Dependency Injection Frameworks
Manual Dependency Injection public class MyApplication { public void static Main() { ISecretAgent agent = (ISecretAgent) Context.GetInstance(“ISecretAgent”); } } Dependency Injection Frameworks public class MyApplication { public void static Main() { ISecretAgent agent = Context.GetInstance<ISecretAgent>(); } } Dependency Injection (with Generics)
castleproject.org springframework.net ninject.org unity.codeplex.com structuremap.github.io simpleinjector.org autofac.org
<factoryconfig type="Improving.ProviderFactory, ProviderFactory"> <factories> <factory interface=“ISpyGadget" assembly=“Acme.MI6" class=“LaserSpyWatch“ /> <factory interface=“ISecretAgent" assembly=“Acme.MI6" class=“DoubleOSuperSpy”> <params> <param name=“Name" value=“Bond, James” type="System.String"/> </params> </factory> <factory interface=“ISecretMission" assembly=“Acme.MI6" class=“StopDrEvilMission“ lifespan=“singleton”> </factory> </factories> </factoryconfig> Dependency Injection Configuration Concepts * Note: This is a conceptual configuration and not specific to any IoC / di framework. Some IoC’s don’t use config, like Ninject that relies on special [attributes] for mappings
public class DependencyConfigModule : StandardModule { public override void Load() { // Factory Bind<IFactory>().To<factory>().Using<SingletonBehavior>(); // Models Bind<ISecretAgent>().To<DoubleOSuperSpy>().Using<TransientBehavior>(); Bind<ISecretMission>().To<StopDrEvilMission>().Using<TransientBehavior>(); Bind<ISpyGadget>().To<LaserSpyWatch>().Using<TransientBehavior>(); } } Dependency Injection Configuration Concepts * Note: This is a conceptual configuration and not specific to any IoC / di framework. Some IoC’s don’t use config, like Ninject that relies on special [attributes] for mappings
public class DependencyConfigModule : StandardModule { public override void Load() { // Factory Bind<IFactory>().To<factory>().Using<SingletonBehavior>(); // Models Bind<ISecretAgent>().To<DoubleOSuperSpy>().Using<TransientBehavior>(); Bind<ISecretMission>().To<StopDrEvilMission>().Using<TransientBehavior>(); Bind<ISpyGadget>().To<LaserSpyWatch>().Using<TransientBehavior>(); } } <factoryconfig type="Improving.ProviderFactory, ProviderFactory"> <factories> <factory interface=“ISpyGadget" assembly=“Acme.MI6" class=“LaserSpyWatch“ /> <factory interface=“ISecretAgent" assembly=“Acme.MI6" class=“DoubleOSuperSpy”> <params> <param name=“Name" value=“Bond, James” type="System.String"/> </params> </factory> <factory interface=“ISecretMission" assembly=“Acme.MI6" class=“StopDrEvilMission“ lifespan=“singleton”> </factory> </factories> </factoryconfig> Dependency Injection Configuration Concepts Implementation Mapping Simple Property Injection Property Injection Constructor Injection Instantiation Model: Singelton Transient Pool * Note: This is a conceptual configuration and not specific to any IoC / di framework. Some IoC’s don’t use config, like Ninject that relies on special [attributes] for mappings Interceptors / Listeners Per Thread Generics
LET’S LOOK AT SOME CODE…
Interceptors and Listeners
Interceptors and Listeners
The mission has begun Dr. Evil has been stopped! It took :22 seconds! Interceptors and Listeners
Stop Dr. Evil Dynamic Proxy Security must be licensed to kill (007) Logging Bond is about to begin mission Interceptors and Listeners (AOP) Multi-Threading Invoke UI Thread
Longest running “complete stack” Windsor Container Dynamic Proxy Active Record (nHibernate) ASP.NET Mono Rail Visual Studio Tooling Well Established Community Integrates with ASP.NET MVC ASP.NET | Sharepoint Winforms | WPF | WCF | WF | Console Apps castleproject.org
springframework.net “Spring Framework” is THE way to do JAVA development Spring .NET is the .NET equivalent Nice bridge for Java Spring developers moving to .NET Interface 21
ninject.org DI “gateway drug” Light weight / super fast to configure DI (Integrates with Castle for IoC / AOP) .NET Silverlight Windows Mobile/Phone No XML Config (Fluent Config)
unity.codeplex.com github.com/unitycontainer/unity From Microsoft Integration with other Application Blocks Microsoft Support Now Maintained by the community (OSS)
castleproject.org springframework.net ninject.org unity.codeplex.com structuremap.github.io simpleinjector.org autofac.org
commonservicelocator.codeplex.com IMPLEMENTATION Castle Windsor Adapter Spring .NET Adapter Unity Adapter StructureMap Adapter Autofac Adapter MEF Adapter now on .NET Framework 4.0 LinFu Adapter Multi-target CSL binaries Service Locator Adapter Implementations
Common Service Locator commonservicelocator.codeplex.com
Common Service Locator commonservicelocator.codeplex.com
POOR MAN’S DIpublic class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } }
POOR MAN’S DIpublic class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } }
POOR MAN’S DIpublic class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public void SuperSpyLib () : this (new SuperAgent(), new SpyAgent(), new StopDrEvilMission()) { // Default Constructor – Poor Man’s DI }
POOR MAN’S DIpublic class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public void SuperSpyLib () : this (new SuperAgent(), new SpyAgent(), new StopDrEvilMission()) { // Default Constructor – Poor Man’s DI }
POOR MAN’S DIpublic class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public void SuperSpyLib () : this (new SuperAgent(), new SpyAgent(), new StopDrEvilMission()) { // Default Constructor – Poor Man’s DI }
developingUX.com speakerpedia.com/speakers/caleb-jenkins @calebjenkins
speakerpedia.com/prog rammers
developingUX.com speakerpedia.com/speakers/caleb-jenkins @calebjenkins

Code to DI For - Dependency Injection for Modern Applications

  • 4.
  • 6.
    “The single greatestthing that you can do to make your code more testable and healthy is to start taking a Dependency Injection approach to writing software” - Real World .NET, C# and Silverlight Wrox Press 2012 Caleb Jenkins
  • 10.
    Super Spy (saves theworld) Dr. Evil (bad guy)
  • 11.
    public class DoubleOSuperSpy { publicvoid StopDrEvilWithSpyWatch() { // Stop Dr. Evil } }
  • 12.
    but what ifwe wanted to rescue the queen use our spy car stop nuclear attack,
  • 13.
  • 14.
  • 15.
  • 16.
    public class DoubleOSuperSpy { publicvoid StopDrEvilWithSpyWatch() { // Stop Dr. Evil } public void StopDrEvilWithSpyCar() { } public void SaveQueenWithSecretCrocodile() { } // Etc... }
  • 18.
    public interface ISecretAgent { voidRunMission(ISecretMission Mission); } public interface ISpyGadget { void UseGadget(string Target); } public interface ISecretMission { } public class SpyWatch : ISpyGadget public class StopDrEvilMission : ISecretMission public class DoubleOSuperSpy : ISecretAgent
  • 19.
    public class DoubleOSuperSpy: ISecretAgent { private ISpyGadget spyWatch; private IMission stopDrEvil; public DoubleOSuperSpy() { spyWatch = new SpyWatch(); stopDrEvil = new StopDrEvilMission(); } public void RunMission() { spyWatch.UseTo(stopDrEvil); } } Separation of Concerns + Grouping of Features = Strategy Pattern
  • 20.
    public class DoubleOSuperSpy: ISecretAgent { private ISpyGadget spyWatch; private IMission stopDrEvil; public DoubleOSuperSpy() { spyWatch = new SpyWatch(); stopDrEvil = new StopDrEvilMission(); } public void RunMission() { spyWatch.UseTo(stopDrEvil); } } Interfaces = Looser Coupling
  • 21.
    public class Factory { publicstatic ISecretAgent GetSecretAgent() { // Check config return new DoubleOSuperSpy(); } public static ISecretGadget GetSpyGadget() { // Check config return new SpyWatch(); } public static ISecretMission GetSecretMission() { // Check Config return new StopDrEvilMission(); } } A Factory
  • 22.
  • 23.
    public class DoubleOSuperSpy: ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public void UseGadget() { gadget.UserGadget(mission); } } Abstract Factory Pattern = Abstraction of Creation + Polymorphism
  • 24.
    public class DoubleOSuperSpy: ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public ISpyGadget Gadget { set { gadget = Value; } } public void SetMission(ISecretMission Mission) { mission = Mission; } public void UseGadget() { gadget.UseGadget(mission); } public void UseGadget(ISecretMission Mission) Factory Dependency Dependency Injection
  • 25.
    public class DoubleOSuperSpy: ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public ISpyGadet Gadget { set { gadget = Value; } } public void SetMission(ISecretMission Mission) { mission = Mission; } public void UseWeapon(ISecretMission Mission) { gadget.UserGadget(Mission); } public void UseGadget()
  • 26.
    public class DoubleOSuperSpy: ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; public DoubleOSuperSpy() { gadget = Factory.GetSpyGadget(); mission = Factory.GetSecretMission(); } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public ISpyGadget Gadget { set { gadget = Value; } } public void SetMission(ISecretMission Mission) { mission = Mission; } public void RunMission() { gadget.UseGadget(mission); } public void RunMission (ISecretMission Mission) { gadget.UseGadget(Mission); }
  • 27.
    public class DoubleOSuperSpy: ISecretAgent { private ISpyGadget gadget; private ISecretMission mission; private DoubleOSuperSpy() { } public DoubleOSuperSpy (ISecretMission Mission, ISpyGadget Gadget) { mission = Mission; gadget = Gadget; } public void RunMission() { gadget.UseGadget(mission); } }
  • 28.
    public class MyApplication { publicvoid static Main() { ISecretAgent agent = Factory.GetSecretAgent(); ISpyGadget gadget = Factory.GetSpyGadget(); ISecretMission mission = Factory.GetSecretMission(); // Manual Dependency Injection agent.SetMission(mission); agent.SetGadget(gadget); agent.RunMissionMission(); } } Manual Dependency Injection
  • 29.
    public class MyApplication { publicvoid static Main() { ISpyGadget gadget = new SpyWatch(); ISecretMission mission = new StopDrEvilMission(); ISecretAgent agent = new DoubleOSuperSpy(gadget); agent.RunMission(mission); } } Manual Dependency Injection
  • 32.
  • 33.
    public class MyApplication { publicvoid static Main() { ISecretAGent agent = Factory.GetSecretAgent(); ISpyGadget gadget = Factory.GetSpyGadget(); ISecretMission mission = Factory.GetSecretMission(); // Manual Dependency Injection agent.SetMission(mission); agent.SetSpyGadget(gadget); agent.RunMission(); } } Manual Dependency Injection
  • 34.
    Manual Dependency Injection public classMyApplication { public void static Main() { ISecretAgent agent = (ISecretAgent) Context.GetInstance(“ISecretAgent”); } } Dependency Injection Frameworks
  • 35.
    Manual Dependency Injection public classMyApplication { public void static Main() { ISecretAgent agent = (ISecretAgent) Context.GetInstance(“ISecretAgent”); } } Dependency Injection Frameworks public class MyApplication { public void static Main() { ISecretAgent agent = Context.GetInstance<ISecretAgent>(); } } Dependency Injection (with Generics)
  • 36.
  • 37.
    <factoryconfig type="Improving.ProviderFactory, ProviderFactory"> <factories> <factoryinterface=“ISpyGadget" assembly=“Acme.MI6" class=“LaserSpyWatch“ /> <factory interface=“ISecretAgent" assembly=“Acme.MI6" class=“DoubleOSuperSpy”> <params> <param name=“Name" value=“Bond, James” type="System.String"/> </params> </factory> <factory interface=“ISecretMission" assembly=“Acme.MI6" class=“StopDrEvilMission“ lifespan=“singleton”> </factory> </factories> </factoryconfig> Dependency Injection Configuration Concepts * Note: This is a conceptual configuration and not specific to any IoC / di framework. Some IoC’s don’t use config, like Ninject that relies on special [attributes] for mappings
  • 38.
    public class DependencyConfigModule: StandardModule { public override void Load() { // Factory Bind<IFactory>().To<factory>().Using<SingletonBehavior>(); // Models Bind<ISecretAgent>().To<DoubleOSuperSpy>().Using<TransientBehavior>(); Bind<ISecretMission>().To<StopDrEvilMission>().Using<TransientBehavior>(); Bind<ISpyGadget>().To<LaserSpyWatch>().Using<TransientBehavior>(); } } Dependency Injection Configuration Concepts * Note: This is a conceptual configuration and not specific to any IoC / di framework. Some IoC’s don’t use config, like Ninject that relies on special [attributes] for mappings
  • 39.
    public class DependencyConfigModule: StandardModule { public override void Load() { // Factory Bind<IFactory>().To<factory>().Using<SingletonBehavior>(); // Models Bind<ISecretAgent>().To<DoubleOSuperSpy>().Using<TransientBehavior>(); Bind<ISecretMission>().To<StopDrEvilMission>().Using<TransientBehavior>(); Bind<ISpyGadget>().To<LaserSpyWatch>().Using<TransientBehavior>(); } } <factoryconfig type="Improving.ProviderFactory, ProviderFactory"> <factories> <factory interface=“ISpyGadget" assembly=“Acme.MI6" class=“LaserSpyWatch“ /> <factory interface=“ISecretAgent" assembly=“Acme.MI6" class=“DoubleOSuperSpy”> <params> <param name=“Name" value=“Bond, James” type="System.String"/> </params> </factory> <factory interface=“ISecretMission" assembly=“Acme.MI6" class=“StopDrEvilMission“ lifespan=“singleton”> </factory> </factories> </factoryconfig> Dependency Injection Configuration Concepts Implementation Mapping Simple Property Injection Property Injection Constructor Injection Instantiation Model: Singelton Transient Pool * Note: This is a conceptual configuration and not specific to any IoC / di framework. Some IoC’s don’t use config, like Ninject that relies on special [attributes] for mappings Interceptors / Listeners Per Thread Generics
  • 40.
  • 41.
  • 42.
  • 43.
    The mission hasbegun Dr. Evil has been stopped! It took :22 seconds! Interceptors and Listeners
  • 44.
    Stop Dr. Evil DynamicProxy Security must be licensed to kill (007) Logging Bond is about to begin mission Interceptors and Listeners (AOP) Multi-Threading Invoke UI Thread
  • 45.
    Longest running “completestack” Windsor Container Dynamic Proxy Active Record (nHibernate) ASP.NET Mono Rail Visual Studio Tooling Well Established Community Integrates with ASP.NET MVC ASP.NET | Sharepoint Winforms | WPF | WCF | WF | Console Apps castleproject.org
  • 46.
    springframework.net “Spring Framework” isTHE way to do JAVA development Spring .NET is the .NET equivalent Nice bridge for Java Spring developers moving to .NET Interface 21
  • 47.
    ninject.org DI “gateway drug” Lightweight / super fast to configure DI (Integrates with Castle for IoC / AOP) .NET Silverlight Windows Mobile/Phone No XML Config (Fluent Config)
  • 48.
    unity.codeplex.com github.com/unitycontainer/unity From Microsoft Integration withother Application Blocks Microsoft Support Now Maintained by the community (OSS)
  • 49.
  • 50.
    commonservicelocator.codeplex.com IMPLEMENTATION Castle Windsor Adapter Spring.NET Adapter Unity Adapter StructureMap Adapter Autofac Adapter MEF Adapter now on .NET Framework 4.0 LinFu Adapter Multi-target CSL binaries Service Locator Adapter Implementations
  • 51.
  • 52.
  • 53.
    POOR MAN’S DIpublicclass SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } }
  • 54.
    POOR MAN’S DIpublicclass SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } }
  • 55.
    POOR MAN’S DIpublicclass SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public void SuperSpyLib () : this (new SuperAgent(), new SpyAgent(), new StopDrEvilMission()) { // Default Constructor – Poor Man’s DI }
  • 56.
    POOR MAN’S DIpublicclass SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public void SuperSpyLib () : this (new SuperAgent(), new SpyAgent(), new StopDrEvilMission()) { // Default Constructor – Poor Man’s DI }
  • 57.
    POOR MAN’S DIpublicclass SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public class SuperSpyLib { private ISecretAgent agent; private ISpyGadget gadget; private ISecretMission mission; public void SuperSpyLib (ISecretAgent Agent, ISpyGadget Gadget, ISecretMission Mission) { agent = Agent; gadget = Gadget; mission = Mission; } } public void SuperSpyLib () : this (new SuperAgent(), new SpyAgent(), new StopDrEvilMission()) { // Default Constructor – Poor Man’s DI }
  • 64.
  • 65.
  • 67.

Editor's Notes