IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET) www.dotnetcollege.cz



Podobné dokumenty
Jak na IoC/DI kontejnery

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Další vlastnosti Springu Moduly Springu. Spring Framework. Pavel Mička. Pavel Mička Spring Framework 1/18

Základy Guice Vazby Scopes. Google Guice. základní seznámení s frameworkem Google Guice

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

Studentská tvůrčí a odborná činnost STOČ Petr Čápek

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Návrhové vzory Tvorba objektů

Dědění, polymorfismus

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

24. listopadu 2013, Brno Připravil: David Procházka

Spring Framework Handout

UJO Framework. revoluční architektura beans. verze

Quo vadis programování? Automatizace vyhodnocování studentských úloh

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Více o konstruktorech a destruktorech

Spring framework 2.0. Roman Pichlík CZJUG

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

RMI Remote Method Invocation

Programování II. Návrh programu I 2018/19

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

RMI - Distribuované objekty v Javě

Návrhové vzory OMO, LS 2014/2015

Objektové programování

GWT pro pokročilé. MoroSystems, s.r.o. Pavel Klobása. Senior Java Developer.

[ASP].NET Core Demystified. Miroslav Holec. Konzultant a lektor [ASP].NET Core.

Jazyk C# (seminář 6)

Tvorba informačních systémů

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

1. Programování proti rozhraní

Vývoj multiplatformní aplikace v Qt

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Generické programování

Komponenty v.net. Obsah přednášky

Seminář Java II p.1/43

NPRG031 Programování II 1 / :25:46

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB161 Programování v jazyce C++ Přednáška 8

NMIN201 Objektově orientované programování 1 / :36:09

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

TÉMATICKÝ OKRUH Softwarové inženýrství

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

, Brno Připravil: David Procházka Návrhové vzory

PB161 Programování v jazyce C++ Přednáška 7

Snadný vývoj webových aplikací s Nette. Lukáš Jelínek

PB161 Programování v jazyce C++ Přednáška 7

Testovací metoda. Testovací metoda. public class SimpleTest {

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Remote Method Invocation RMI

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Principy objektového návrhu. Přednáška 8, LS 2013/2014

20. Projekt Domácí mediotéka

C# &.NET. Cvičení Mgr. Filip Krijt.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

NOVINKY V JEE EJB 3.1. Zdeněk Troníček Fakulta informačních technologií ČVUT v Praze

Chování konstruktorů a destruktorů při dědění

Programátorská příručka

Návrhové vzory Design Patterns

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

Abstraktní třída a rozhraní

Zpracoval:

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

PB161 Programování v jazyce C++ Přednáška 8

Kód, který se nebude často měnit

Dědičnost (inheritance)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Jazyk C# (seminář 3)

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

PB161 Základy OOP. Tomáš Brukner

Funkční objekty v C++.

Programování v C++ 2, 4. cvičení

Podpora aplikační logiky v J2EE aplikačních rámcích

7.5 Diagram tříd pokročilé techniky

Principy objektově orientovaného programování

Michal Podzimek

IRAE 07/08 Přednáška č. 1

C# - OOP (object oriented programming)

Programování v C++ VI

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Připojení k eduroam.cz: Nastavení síťových komponent Meraki a konfigurace ISE

Jazyk C++ I. Šablony 2

Programování v Javě I. Únor 2009

7.5 Diagram tříd pokročilé techniky

návrhový vzor Singleton.

Virtuální metody - polymorfizmus

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

PREPROCESOR POKRAČOVÁNÍ

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

ASP.NET Web API. Tomáš Herceg Microsoft MVP (ASP.NET)

Seznámení s prostředím dot.net Framework

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Transkript:

IoC/DI Tomáš Herceg Microsoft MVP (ASP.NET) www.dotnetcollege.cz

SOLID 5 pravidel pro testovatelný kód Na netestovatelném kódu se IoC/DI používá špatně

SOLID Single Responsibility Principle Každá třída má jen jednu odpovědnost Neznamená to, že má jen jednu metodu! Spíš aby každá třída měla jen jeden důvod ke změně. Open / Closed Principle Otevřenost pro rozšíření, uzavřenost pro změny Navrhujme rozhraní tak, aby nebyla omezující (abychom snadno mohli přidávat a rozšiřovat), ale abychom je nemuseli již měnit

SOLID Liskov Substitution Principle Instanci lze nahradit instancí poděděné třídy Rozhodně ne toto: Podědíme List<string> Rušení metod vyhozením NotSupportedException Změna chování oproti původní třídě Interface Segregation Principle De facto SRP pro rozhraní Nedělat jedno velké rozhraní s 30 metodami, použít více malých rozhraní s jasně definovanými odpovědnostmi

SOLID Dependency Inversion Principle Třídy mají své závislosti deklarovat navenek a nechat si je naplnit zvenčí Třída NewsletterService si nemá vytvářet instanci třídy Mailer

Co je IoC/DI Inversion of Control Třídy o sobě neví, komunikují přes rozhraní Starají se jen o své věci Třídy, které potřebuje, si nevytváří sama Výhoda: krabičky s přesně danou odpovědností Kdykoliv je lze nahradit za jinou implementaci A to i na úrovni konfigurace aplikace Pozor: nemluvíme o třídách, které jen drží data

Co je IoC/DI Otázka: Jak tyto krabičky propojit? public interface INewsletterService { void SendNewsletters(string customergroup); } public interface IMailerService { void SendMail(string to, string subject, string body); }

Co je IoC/DI Závislosti public class NewsletterService : INewsletterService { private IMailerService mailer; public NewsletterService(IMailerService mailer) { this.mailer = mailer; } }...

Co je IoC/DI Druhy závislostí Constructor Dependency Závislost je předána jako parametr konstruktoru Property Dependency Závislost je držena ve vlastnosti třídy Kontejner Sada pravidel INewsletterService NewsletterService container.resolve<inewsletterservice> Service Locator pattern

Co je IoC/DI Dependency Injection Kontejner umí vyřešit závislosti za nás Pomocí reflection zjistí, co třída potřebuje public class NewsletterService : INewsletterService { private IMailerService mailer; public NewsletterService(IMailerService mailer) { this.mailer = mailer; } }...

Co je IoC/DI Constructor Injection Property Injection container.resolve<inewsletterservice> INewsletterService je implementováno třídou NewsletterService, vytvoříme ji Ta ke svému vzniku potřebuje IMailerService container.resolve<imailerservice> IMailerService je implementována třídou MailerService, vytvoříme ji

Funkce kontejneru 1. Řešení závislostí tříd, vytváření instancí 2. Správa lifetime instancí Singleton, Transient (vždy nová instance), PerThread, PerWebRequest, vlastní 3. Interception AOP proxy třída - obalení metod na rozhraní nějakým kódem Logování, exception handling, kontrola oprávnění

Oblíbené kontejnery Unity Castle Windsor Spring.NET StructureMap Autofac Ninject

Jak použít kontejner Bootstrapper Při startu aplikace Vytvoření instance kontejneru Nastavení pravidel pro kontejner Volitelně: resolve objektu(ů) Konzolová, okenní aplikace Funkce Main Webová aplikace Global.asax Služba OnStart

Castle Windsor Registrace po jednom container.register( Component.For<rozhraní>().Instance(objekt) ); container.register( Component.For<rozhraní>().ImplementedBy<třída>() ); container.register( Component.For<rozhraní>().UsingFactoryMethod(funkce) );

Castle Windsor Registrace dle konvence container.register( Classes.FromAssemblyContaining<typ>().BasedOn<třída>() ); Registrace v XML http://stw.castleproject.org/windsor.xml-registration-reference.ashx

Installer Třída s registracemi, které patří k sobě public class DataAccessInstaller : IWindsorInstaller { public void Install(IWindsorContainer container, IConfigurationStore store) { container.register( ); } } Instalace v bootstrapperu container.install(new DataAccessInstaller());

Lifestyle Kontejner řídí životnost komponent Respektuje IDisposable Transient každý Resolve = nová instance Singleton PerThread PerWebRequest vlastní

Lifestyle Kontejner si drží reference na všechny objekty, které vytvořil (dá se změnit) Automaticky volá Dispose PerThread, PerWebRequest zřejmé Singleton zaniká s kontejnerem Transient problém

Transient a Dispose Správně bychom měli volat expicitně container.release(instance) Většinou ale není třeba Transient zaniká ve chvíli, kdy zaniká rodičovský objekt Případně můžeme místo injektování Transient objektu injektovat factory, která umí zavolat container.release

Best Practices Registrace rozdělte do installerů Resolve volat jen v bootstrapperu Nedělejte kontejner jako statickou proměnnou a nepoužívejte jej jako Service Locator Skrýváte tím závislosti, které třídy mají Ani kontejner neinjektujte do tříd

Factories Když potřebujeme vytvářet instance za běhu? Vlastní továrna injektujeme IMailerFactory Implicitní továrna Injektujeme Func<typ> typ je zaregistrován v kontejneru v bootstrapperu zapneme volálním container.addfacility<typedfactoryfacility>() Lazy inicializace Injektujeme Lazy<typ> Container.Register( Component.For<ILazyComponentLoader>().ImplementedBy<LazyOfTComponentLoader>() )

Interception Automatické vygenerování proxy třídy Obalení metod nějakým kódem Metody rozhraní Virtuální metody ve třídě container.register( Classes.FromAssemblyContaining<FacadeBase>().BasedOn<FacadeBase>().Configure(c => c.interceptors(typeof(facadecallinterceptor))).lifestyleperwebrequest() );

Interception Využití Logování Exception handling Kontrola oprávnění... public class TraceInterceptor : IInterceptor { } public void Intercept(IInvocation invocation) { log.append("entering " + invocation.method.name) invocation.proceed(); log.append("leaving " + invocation.method.name) }