SlideShare uma empresa Scribd logo
1 de 36
MS FEST 2012




DI v .NET bez pověr, iluzí a
  frikulínského nadšení
            René Stein
       http://renestein.net
   http://twitter.com/renestein
Na této přednášce nebude pomlouváno
Metro (ani kdyby se jmenovalo Modern UI)!
Pracujeme se závislostmi - v
        aplikacích




• A rovnou se na takovou aplikaci
  podíváme (bez pomoci Karla
  Nešpora)
Každý problém se závislostmi
              vyřeší on!
        Náš chrabrý Singleton!



   Bůh je stejně jako singleton vždy jen
jeden. Skeptická poznámka: dokud nejsou
        oba minimálně trojjediní.
Singleton v aplikaci
• Ukázka singletonu
• Ukázka komplikovanějšího singletonu
  složeného z dalších singletonů –
  SimpleServiceHolder.
Singleton(y)
Poskytuje globální přístupový bod k
  jedné instanci.
Ale:
• Skryté závislosti v kódu aplikace.
• Malá kontrola nad životním cyklem
  singletonu (jen ta „lazy“ inicializace).
• Problémy se singletony ve
  vícevláknovém prostředí.
• Problémy se singletony v unit
  testech.
Repozitář služeb
• Vulgo „service locator“
• Nabízí „služby všeho druhu“
• Redukuje větší množství singletonů
  v aplikaci na jeden singleton
Repozitář služeb - nevýhody
Objekt, který ve svém rozhraní slibuje víc, než
může splnit.


Ve svém rozhraní nabízí všechny služby na světě
(a možná i mimo něj).

Závislosti třídy nepoznáme z jejího
rozhraní, protože komunikace s repozitářem
služeb je utopena v privátní implementaci třídy.
Repozitář služeb – nevýhody II
Nepřehledný kód
  SimpleServiceRepository.Instance.GetSer
  vice<X> - to je všudypřítomná náhrada
  za volání konstruktoru - new X().
SimpleServiceRepository.Instance.GetServic
  e< ….>
• Všechny knihovny většinou
  závisí na knihovně s
  SimpleServiceRepository.
Repozitář služeb – nevýhody
             III
• Nikdy se nemůžete spolehnout na
  to, že služba je repozitáři
  registrována.
• Víte, co je „Ambient context“?
var errService =
   SimpleServiceRepository.Instance.GetService<IWorkflowE
   rrorInfoProviderEx>(); - na jiném místě
if(errService != null)
{
          errService.PublishError(….);
}
Dependency injection
  Odstranění skrytých   Odstranění těsných
       závislostí       vazeb mezi objekty




   (Snadné) mapování     Spolupráce objektů s
       abstrakcí na       přesně vymezenou
      implementaci        odpovědností (SRP)
Injektování přes
             konstruktor
var myOrderService = new OrderService (myRepository);
class OrderService
{
   public OrderService(IRepository<Order> repository)
   {
       if(repository == null)
       {
            throw ….;
        }
       m_repository = repository;
   }
….
}
Injektujeme přes konstruktor

   Předávání závislostí, bez
   kterých instance nemůže
   existovat
Injektujeme přes vlastnost
public class ExportService
{
    public ExportService()
     {
         ConfigService = new DefaultConfigService();
     }
      public IConfigService ConfigService
      {
            get;
            set;
     }
     public void ExportData
      {
          ….
        ConfigService.GetValue(…);
     }
}
Kdy injektovat přes
          vlastnost?
Když je závislost nepovinná. Ale pozor
na NullReferenceException při
používání závislosti!


Když máte smysluplnou výchozí
implementaci (i Null object) => ve třídě
se ale svážeme s další konkrétní třídou
(new (konkrétní) ZavislostX())
Pozor na problémy s
automatickým injektováním
  závislostí přes vlastnosti
                        //ViewModelBase
interface IViewModel
  {                     [DoNotWire]
    IView CurrentView   public IView
    {                   CurrentView
      get;                {
    }                       get;
  }                         set;
                          }
Injektování přes argument
         metody
public void RunTransition
   (IWorkflowContext context)
{
  if(context == null)
         {
            throw ….;
          }
 …
context.ApplyTransitionRules(currentState,
   this);
Kdy injektovat přes
    argument metody

Při každém volání metody potřebujeme
odlišný objekt

Předávaný objekt většinou představuje
unikátní kontext jednoho volání metody

S tímto druhem závislostí nám DI
kontajner nepomůže
DI kontajner
DI kontajner si představme jako
nástroj, který nám zjednodušuje
vytváření objektových grafů.

Jako nástroj, pomocí kterého snadno
propojíme nezávislé části naší aplikace a
splníme jim jejich přání = dodáme jim
všechny jejich závislosti.
Co očekávat od DI
      kontajneru?
 SOLIDní           Správa životního cyklu
                        služeb, resp.
kompozice                komponent
 objektů           (Singleton, PerThread,
                   PerWebRequest, Transi
                            ent)




      Intercepce metod (skvělá
     podpora návrhového vzoru
             Decorator)
Použití DI kontajneru – 3 R
           Register
R =Registrace

      Jednorázová registrace abstrakcí
      na implementace (registrace
      komponent a služeb) v
      takzvaném „DI kompozičním
      centru “ (composition root) po
      startu aplikace.
R = registrace
• Preferujte konfiguraci v kódu.

m_container.Register(
 Component.For(typeof(IRepository<>))
 .ImplementedBy(typeof(DefaultEFRepository<>)));

• Registrace v XML konfiguračním souboru jen
  tehdy, když chcete přidávat „pluginy“.
Registrace v XML – Castle
Windsor („pluginy – pozdní
vazba “)
<components>
 <component
   id= "MyLogService"
   service=
  "CommonServices.ILogger, CommonServic
  es"
   type="DefaultServices.DbLogger, DefaultS
  ervices"
 </component>
</components>
R = Registrace - další
     doporučení

Preferujte hromadné
registrace s využitím
konvencí místo
explicitní registrace
každé služby
Registrace na základě
             jmenných konvencí
Predicate<Type> servicesCondition = type =>
  type.Name.Contains(PROVIDER_SUFFIX) ||
  type.Name.Contains(SERVICE_SUFFIX);
 m_container.Register(Classes.FromAssembly.
  Containing(typeof(INewObjectIdProvider<>))
          .Where(servicesCondition)
          .WithServiceDefaultInterfaces()
          .WithServiceSelf()
        .LifestyleSingleton());
Použití DI kontajneru – 3 R
          Resolve
R = Resolve
          Získání služby z DI
      kontajneru. Službu mohu
         ihned používat, její
          závislosti splnil DI
              kontajner

              ALE:
Princip neviditelnosti DI
               kontajneru
Nikdy nepodlehněte pokušení používat DI kontajner jako service
locator (repozitář služeb).



Metodu „Resolve“ na DI kontajneru volá jen „composition root“
a infrastrukturní objekty (ControllerFactory v ukázce).


Nikdy se ve svém aplikačním kódu nereferencujte DI kontajner.
K tomu vám dopomáhej zdravý vývojářský úsudek a vzor
Abstract Factory.
DI kontajner není service
                              locator!
public MainViewModel                public MainViewModel
(IWindsorContainer container)       (IViewFactory viewfactory)
{                                   {
  ….                                ….
}                                   }
var childView =                     var childView =
   container.Resolve<IChildView>;   viewfactory.Create<IChildView>();
Abstraktní továrna ve
      Windsor Castlu
• Castle dokáže typické abstraktní
  továrny generovat sám s využitím
  dynamické proxy.
m_container.AddFacility<TypedFactory
  Facility>();
m_container.Register(Component.For<I
  ViewFactory>().AsFactory<IViewFact
  ory>());
Použití DI kontajneru – 3 R
                  Release
• Cokoli vyzvednu „manuálně“ z DI kontajneru
   (Resolve) uvolním metodou Release.
public override void
   ReleaseController(IController controller)
{
    m_container.Release(controller);
    base.ReleaseController(controller);
  }
• Životní cyklus služeb řídí DI kontajner.
Mýty o dependency
injection (a IoC)
  DI je komplikovaná záležitost .(A já jsem duše
                    prostá )

     Nepíšu unit testy (!) => nepotřebuju DI

Kdo nepoužívá DI (nebo o ní alespoň nemluví) není
                  pravý vývojář

                DI == DI kontajner

 Říká se tomu DI kontajner, ale já vím, že je to jen
           vylepšená abstraktní továrna
Mýty o dependency
            injection
• V konstruktoru se mi budou množit
  argumenty => jednoduchý detektor
  porušení SRP.
public GodService
(IWorldBuilder worldbuilder,
IHelloWorld initWorldService,
IEdenService edenService,
IJesusChristSupport jesusSupportService
IApocalypseRunner apocalypseRunner)
• Víte, co jsou kompozitní služby?
DI kontajnery v .Net světě

Castle Windsor       Ninject                   Hiro




     Autofac       StructureMap          Unity




           ?MEF?                  Spring.NET
DI kontajnery – podobnosti
         a rozdíly

Svatou DI trojici Register/Resolve/Release
zvládne každý DI kontajner.



Pak má ale každý kontajner své unikátní
vlastnosti –Windsor Castle vyniká při intercepci
pomocí dynamické proxy nebo se s jeho pomocí
skvěle diagnostikují chyby při registraci služeb…
René Stein


• Vývoj aplikací, veřejné a inhouse kurzy
• http://www.renestein.net/nabidka.aspx


http://blog.renestein.net
http://twitter.com/renestein

Mais conteúdo relacionado

Semelhante a Dependency injection v .Net Frameworku

Entity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacíchEntity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacíchProfinit
 
Nette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerNette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerFilip Procházka
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariRoman Pichlík
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace Jan Hřídel
 
Spusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změny
Spusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změnySpusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změny
Spusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změnyMarketingArrowECS_CZ
 
vSphere automation workshop python
vSphere automation workshop pythonvSphere automation workshop python
vSphere automation workshop pythonVladan Laxa
 
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)Martin Hujer
 
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesČtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesCtvrtkoncz
 
Rozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCRozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCtopascz
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Kuba Břečka
 
MoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache WicketMoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache WicketTomáš Páral
 
Návrhové vzory v programování
Návrhové vzory v programováníNávrhové vzory v programování
Návrhové vzory v programováníTaste Medio
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware HoudinyCESNET
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbecDavid Grudl
 
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022PeckaDesign.cz
 
Doctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíDoctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíFilip Procházka
 

Semelhante a Dependency injection v .Net Frameworku (20)

Entity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacíchEntity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacích
 
Sexy infrastruktura
Sexy infrastrukturaSexy infrastruktura
Sexy infrastruktura
 
Nette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerNette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di container
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou Tvari
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace
 
Spusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změny
Spusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změnySpusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změny
Spusťte si existující VMware infrastrukturu v Cloudu bez jakékoliv změny
 
vSphere automation workshop python
vSphere automation workshop pythonvSphere automation workshop python
vSphere automation workshop python
 
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
 
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & MicrosevicesČtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
Čtvrtkon #71 - Jan Kaštánek - Java & Docker & Microsevices
 
Rozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCRozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVC
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]
 
MoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache WicketMoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache Wicket
 
Návrhové vzory v programování
Návrhové vzory v programováníNávrhové vzory v programování
Návrhové vzory v programování
 
Úvod do OOP
Úvod do OOPÚvod do OOP
Úvod do OOP
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware Houdiny
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbec
 
App Engine Kick Start
App Engine Kick StartApp Engine Kick Start
App Engine Kick Start
 
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
 
CDS Invenio v NTK (Jindřich Dolanský)
CDS Invenio v NTK (Jindřich Dolanský)CDS Invenio v NTK (Jindřich Dolanský)
CDS Invenio v NTK (Jindřich Dolanský)
 
Doctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíDoctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačí
 

Dependency injection v .Net Frameworku

  • 1. MS FEST 2012 DI v .NET bez pověr, iluzí a frikulínského nadšení René Stein http://renestein.net http://twitter.com/renestein
  • 2. Na této přednášce nebude pomlouváno Metro (ani kdyby se jmenovalo Modern UI)!
  • 3. Pracujeme se závislostmi - v aplikacích • A rovnou se na takovou aplikaci podíváme (bez pomoci Karla Nešpora)
  • 4. Každý problém se závislostmi vyřeší on! Náš chrabrý Singleton! Bůh je stejně jako singleton vždy jen jeden. Skeptická poznámka: dokud nejsou oba minimálně trojjediní.
  • 5. Singleton v aplikaci • Ukázka singletonu • Ukázka komplikovanějšího singletonu složeného z dalších singletonů – SimpleServiceHolder.
  • 6. Singleton(y) Poskytuje globální přístupový bod k jedné instanci. Ale: • Skryté závislosti v kódu aplikace. • Malá kontrola nad životním cyklem singletonu (jen ta „lazy“ inicializace). • Problémy se singletony ve vícevláknovém prostředí. • Problémy se singletony v unit testech.
  • 7. Repozitář služeb • Vulgo „service locator“ • Nabízí „služby všeho druhu“ • Redukuje větší množství singletonů v aplikaci na jeden singleton
  • 8. Repozitář služeb - nevýhody Objekt, který ve svém rozhraní slibuje víc, než může splnit. Ve svém rozhraní nabízí všechny služby na světě (a možná i mimo něj). Závislosti třídy nepoznáme z jejího rozhraní, protože komunikace s repozitářem služeb je utopena v privátní implementaci třídy.
  • 9. Repozitář služeb – nevýhody II Nepřehledný kód SimpleServiceRepository.Instance.GetSer vice<X> - to je všudypřítomná náhrada za volání konstruktoru - new X(). SimpleServiceRepository.Instance.GetServic e< ….> • Všechny knihovny většinou závisí na knihovně s SimpleServiceRepository.
  • 10. Repozitář služeb – nevýhody III • Nikdy se nemůžete spolehnout na to, že služba je repozitáři registrována. • Víte, co je „Ambient context“? var errService = SimpleServiceRepository.Instance.GetService<IWorkflowE rrorInfoProviderEx>(); - na jiném místě if(errService != null) { errService.PublishError(….); }
  • 11. Dependency injection Odstranění skrytých Odstranění těsných závislostí vazeb mezi objekty (Snadné) mapování Spolupráce objektů s abstrakcí na přesně vymezenou implementaci odpovědností (SRP)
  • 12. Injektování přes konstruktor var myOrderService = new OrderService (myRepository); class OrderService { public OrderService(IRepository<Order> repository) { if(repository == null) { throw ….; } m_repository = repository; } …. }
  • 13. Injektujeme přes konstruktor Předávání závislostí, bez kterých instance nemůže existovat
  • 14. Injektujeme přes vlastnost public class ExportService { public ExportService() { ConfigService = new DefaultConfigService(); } public IConfigService ConfigService { get; set; } public void ExportData { …. ConfigService.GetValue(…); } }
  • 15. Kdy injektovat přes vlastnost? Když je závislost nepovinná. Ale pozor na NullReferenceException při používání závislosti! Když máte smysluplnou výchozí implementaci (i Null object) => ve třídě se ale svážeme s další konkrétní třídou (new (konkrétní) ZavislostX())
  • 16. Pozor na problémy s automatickým injektováním závislostí přes vlastnosti //ViewModelBase interface IViewModel { [DoNotWire] IView CurrentView public IView { CurrentView get; { } get; } set; }
  • 17. Injektování přes argument metody public void RunTransition (IWorkflowContext context) { if(context == null) { throw ….; } … context.ApplyTransitionRules(currentState, this);
  • 18. Kdy injektovat přes argument metody Při každém volání metody potřebujeme odlišný objekt Předávaný objekt většinou představuje unikátní kontext jednoho volání metody S tímto druhem závislostí nám DI kontajner nepomůže
  • 19. DI kontajner DI kontajner si představme jako nástroj, který nám zjednodušuje vytváření objektových grafů. Jako nástroj, pomocí kterého snadno propojíme nezávislé části naší aplikace a splníme jim jejich přání = dodáme jim všechny jejich závislosti.
  • 20. Co očekávat od DI kontajneru? SOLIDní Správa životního cyklu služeb, resp. kompozice komponent objektů (Singleton, PerThread, PerWebRequest, Transi ent) Intercepce metod (skvělá podpora návrhového vzoru Decorator)
  • 21. Použití DI kontajneru – 3 R Register R =Registrace Jednorázová registrace abstrakcí na implementace (registrace komponent a služeb) v takzvaném „DI kompozičním centru “ (composition root) po startu aplikace.
  • 22. R = registrace • Preferujte konfiguraci v kódu. m_container.Register( Component.For(typeof(IRepository<>)) .ImplementedBy(typeof(DefaultEFRepository<>))); • Registrace v XML konfiguračním souboru jen tehdy, když chcete přidávat „pluginy“.
  • 23. Registrace v XML – Castle Windsor („pluginy – pozdní vazba “) <components> <component id= "MyLogService" service= "CommonServices.ILogger, CommonServic es" type="DefaultServices.DbLogger, DefaultS ervices" </component> </components>
  • 24. R = Registrace - další doporučení Preferujte hromadné registrace s využitím konvencí místo explicitní registrace každé služby
  • 25. Registrace na základě jmenných konvencí Predicate<Type> servicesCondition = type => type.Name.Contains(PROVIDER_SUFFIX) || type.Name.Contains(SERVICE_SUFFIX); m_container.Register(Classes.FromAssembly. Containing(typeof(INewObjectIdProvider<>)) .Where(servicesCondition) .WithServiceDefaultInterfaces() .WithServiceSelf() .LifestyleSingleton());
  • 26. Použití DI kontajneru – 3 R Resolve R = Resolve Získání služby z DI kontajneru. Službu mohu ihned používat, její závislosti splnil DI kontajner ALE:
  • 27. Princip neviditelnosti DI kontajneru Nikdy nepodlehněte pokušení používat DI kontajner jako service locator (repozitář služeb). Metodu „Resolve“ na DI kontajneru volá jen „composition root“ a infrastrukturní objekty (ControllerFactory v ukázce). Nikdy se ve svém aplikačním kódu nereferencujte DI kontajner. K tomu vám dopomáhej zdravý vývojářský úsudek a vzor Abstract Factory.
  • 28. DI kontajner není service locator! public MainViewModel public MainViewModel (IWindsorContainer container) (IViewFactory viewfactory) { { …. …. } } var childView = var childView = container.Resolve<IChildView>; viewfactory.Create<IChildView>();
  • 29. Abstraktní továrna ve Windsor Castlu • Castle dokáže typické abstraktní továrny generovat sám s využitím dynamické proxy. m_container.AddFacility<TypedFactory Facility>(); m_container.Register(Component.For<I ViewFactory>().AsFactory<IViewFact ory>());
  • 30. Použití DI kontajneru – 3 R Release • Cokoli vyzvednu „manuálně“ z DI kontajneru (Resolve) uvolním metodou Release. public override void ReleaseController(IController controller) { m_container.Release(controller); base.ReleaseController(controller); } • Životní cyklus služeb řídí DI kontajner.
  • 31. Mýty o dependency injection (a IoC) DI je komplikovaná záležitost .(A já jsem duše prostá ) Nepíšu unit testy (!) => nepotřebuju DI Kdo nepoužívá DI (nebo o ní alespoň nemluví) není pravý vývojář DI == DI kontajner Říká se tomu DI kontajner, ale já vím, že je to jen vylepšená abstraktní továrna
  • 32. Mýty o dependency injection • V konstruktoru se mi budou množit argumenty => jednoduchý detektor porušení SRP. public GodService (IWorldBuilder worldbuilder, IHelloWorld initWorldService, IEdenService edenService, IJesusChristSupport jesusSupportService IApocalypseRunner apocalypseRunner) • Víte, co jsou kompozitní služby?
  • 33. DI kontajnery v .Net světě Castle Windsor Ninject Hiro Autofac StructureMap Unity ?MEF? Spring.NET
  • 34. DI kontajnery – podobnosti a rozdíly Svatou DI trojici Register/Resolve/Release zvládne každý DI kontajner. Pak má ale každý kontajner své unikátní vlastnosti –Windsor Castle vyniká při intercepci pomocí dynamické proxy nebo se s jeho pomocí skvěle diagnostikují chyby při registraci služeb…
  • 35.
  • 36. René Stein • Vývoj aplikací, veřejné a inhouse kurzy • http://www.renestein.net/nabidka.aspx http://blog.renestein.net http://twitter.com/renestein