Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i DependencyInjection<br />Marcin ...
Agenda<br />Charakterystyka<br />Zalety i wady<br />Warianty<br />Zastosowania<br />Przegląd kontenerów<br />Unity<br />Ar...
Charakterystyka<br />
Każdy wzorzec określa problem, <br />który wielokrotniewystępuje w naszym środowisku, <br />a następnie opisuje zasadniczą...
Inversion of Control<br />Wzorzec architektoniczny<br />Przeniesienie odpowiedzialności<br /><ul><li>Różne aspekty
Sterowanie
Determinowanie powiązań</li></li></ul><li>Dependency Injection<br />Autor - Martin Fowler<br />Rozwiązuje ten sam problem,...
Tight-coupling<br />tworzy<br />A<br />B<br />C<br />używa<br />używa<br />
DependencyInjection<br />tworzy<br />A<br />B<br />IC<br />używa<br />używa<br />
DependencyInjection + Kontener<br />tworzy<br />A<br />B<br />Kontener DI<br />IC<br />używa<br />używa<br />używa<br />
Service Locator<br />tworzy<br />A<br />B<br />Service<br />Locator<br />IC<br />używa<br />używa<br />używa<br />
Zalety i wady<br />
Warianty<br />
ConstructorInjection<br />new B(new C());<br />IC<br />public B(     ) { }<br /><ul><li>Property Injection</li></ul>var b ...
InterfaceInjection<br />IC<br />voidInjectC(     c)<br />var b = new B();<br />b.InjectC(new C());<br />B : IInjectC<br />
Zastosowania<br />
Hosty aplikacyjne<br />Windows Forms<br />WPF<br />ASP.NET Web Forms<br />ASP.NET MVC<br />WCF<br />…<br />
Biblioteki<br />Prywatne kontenery<br />Kontener współdzielony z hostem<br />Integracja poprzez mechanizmy rozszerzeń<br />
Przegląd kontenerów<br />
Ninject<br />Autofac<br />Structure Map<br />Unity<br />Castle Windsor<br />Spring.NET<br />Wybrane rozwiązania<br />
Źródło: http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html<br />
Unity<br />
Unity<br />ObjectBuilder<br />
Konfiguracja<br />AOP<br />Atrybuty<br />ObjectBuilder<br />Typy<br />Generyczne<br />Lifetime<br />Managers<br />Tablice<...
Policy<br />Policy<br />Policy<br />ObjectBuilder 2.0<br />Strategy<br />Strategy<br />Strategy<br />…<br />…<br />Locator...
DEMO<br />
Upcoming SlideShare
Loading in …5
×

Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektowe Inversion Of Control i Dependency Injection

1,864 views

Published on

Originally presented on IT Academic Day 2008 (Faculty of Mathematics and Computer Science, NCU, Torun)

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

  • Be the first to like this

No Downloads
Views
Total views
1,864
On SlideShare
0
From Embeds
0
Number of Embeds
24
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Kilka luźnych pomysłów realizacji injekcji dla komponentów1) Automatyczna rejestracja dla ładowanych assemblies z komponentamiPodczas inicjalizacji aplikacji hosta:AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(OnCurrentDomainAssemblyLoad);static void OnCurrentDomainAssemblyLoad(object sender, AssemblyLoadEventArgs args){ IEnumerable<Type> types = args.LoadedAssembly.GetTypes() .Where(t => typeof(IContainerConfigurator).IsAssignableFrom(t)); foreach (Type t in types) { var configurator = Activator.CreateInstance(t) as IContainerConfigurator; var container = Application["container"] as IUnityContainer; var childContainer = container.CreateChildContainer(); configurator.Configure(childContainer) }}2) Warstwa fabryk oprartych o wsparcie dla hierarchicznych kontenerów dostępne m.in. w Unity. LogicFactory(){ CreateOrderProcessor() { using (var ctx = new CurrentContainerScope()) // if current container exists in TLS, creates subcontainer within it if not creates new container { if (!ctx.HasMappingDefined<IOrderDao>) { ctx.Register<IOrderDao, SqlOrderDao>(); } if (!ctx.HasMappingDefined<IOrderProcessor>) { ctx.Register<IOrderProcessor, AudiOrderProcessor>(); } return ctx.Resolve<IOrderProcessor>(); // dzieki temu mozemy uzywac AOP itp. } } CreateEngine(EngineType type) { using (var ctx = new CurrentContainer()) // decorates the current container from TLS { if (!ctx.HasMappingDefined<IOrderDao>) { ctx.Register<IOrderDao, SqlOrderDao>(); } var result = new Engine(type); ctx.BuildUp(result); return result; } }}
  • W kolejnej wersji (2.0) Unity „pochłonie” klasy ObjectBuildera (nie będzie konieczności referencjonowania assembly ObjectBuildera).
  • Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektowe Inversion Of Control i Dependency Injection

    1. 1. Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i DependencyInjection<br />Marcin Daczkowski, AIS.PL<br />marcin.daczkowski@ais.pl<br />
    2. 2.
    3. 3. Agenda<br />Charakterystyka<br />Zalety i wady<br />Warianty<br />Zastosowania<br />Przegląd kontenerów<br />Unity<br />Architektura<br />Przykłady użycia<br />
    4. 4. Charakterystyka<br />
    5. 5. Każdy wzorzec określa problem, <br />który wielokrotniewystępuje w naszym środowisku, <br />a następnie opisuje zasadniczączęśćrozwiązaniatego problemu.<br />Christopher Alexander (1977)<br />A Pattern Language: Towns, Buildings, Construction<br />
    6. 6. Inversion of Control<br />Wzorzec architektoniczny<br />Przeniesienie odpowiedzialności<br /><ul><li>Różne aspekty
    7. 7. Sterowanie
    8. 8. Determinowanie powiązań</li></li></ul><li>Dependency Injection<br />Autor - Martin Fowler<br />Rozwiązuje ten sam problem, co wzorce kreacyjne:<br />Fabryka Abstrakcyjna<br />Metoda Wytwórcza<br />Budowniczy<br />Zgodnie z ideą Inversion of Control<br />Bob Martin - SOLID <br />
    9. 9. Tight-coupling<br />tworzy<br />A<br />B<br />C<br />używa<br />używa<br />
    10. 10. DependencyInjection<br />tworzy<br />A<br />B<br />IC<br />używa<br />używa<br />
    11. 11. DependencyInjection + Kontener<br />tworzy<br />A<br />B<br />Kontener DI<br />IC<br />używa<br />używa<br />używa<br />
    12. 12. Service Locator<br />tworzy<br />A<br />B<br />Service<br />Locator<br />IC<br />używa<br />używa<br />używa<br />
    13. 13. Zalety i wady<br />
    14. 14.
    15. 15.
    16. 16. Warianty<br />
    17. 17. ConstructorInjection<br />new B(new C());<br />IC<br />public B( ) { }<br /><ul><li>Property Injection</li></ul>var b = new B();<br />b.C = new C();<br />IC<br />public { set; }<br />
    18. 18. InterfaceInjection<br />IC<br />voidInjectC( c)<br />var b = new B();<br />b.InjectC(new C());<br />B : IInjectC<br />
    19. 19. Zastosowania<br />
    20. 20. Hosty aplikacyjne<br />Windows Forms<br />WPF<br />ASP.NET Web Forms<br />ASP.NET MVC<br />WCF<br />…<br />
    21. 21. Biblioteki<br />Prywatne kontenery<br />Kontener współdzielony z hostem<br />Integracja poprzez mechanizmy rozszerzeń<br />
    22. 22. Przegląd kontenerów<br />
    23. 23. Ninject<br />Autofac<br />Structure Map<br />Unity<br />Castle Windsor<br />Spring.NET<br />Wybrane rozwiązania<br />
    24. 24. Źródło: http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html<br />
    25. 25. Unity<br />
    26. 26. Unity<br />ObjectBuilder<br />
    27. 27. Konfiguracja<br />AOP<br />Atrybuty<br />ObjectBuilder<br />Typy<br />Generyczne<br />Lifetime<br />Managers<br />Tablice<br />…<br />StaticFactory<br />
    28. 28. Policy<br />Policy<br />Policy<br />ObjectBuilder 2.0<br />Strategy<br />Strategy<br />Strategy<br />…<br />…<br />Locator<br />Lifetimecontainer<br />
    29. 29. DEMO<br />
    30. 30. Pytania?<br />

    ×