Jak na IoC/DI kontejnery

Podobné dokumenty
IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

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

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

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

CineStar Černý Most Praha

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

Spring Framework Handout

Jak testovat software v praxi

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

Návrhové vzory Tvorba objektů

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

Spring framework 2.0. Roman Pichlík CZJUG

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

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

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

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

UJO Framework. revoluční architektura beans. verze

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

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

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

Hiearchical MVC (Model-view-controller) vs. PAC (Presentation-abstraction-control)

Objektové programování

Dědění, polymorfismus

Návrhové vzory OMO, LS 2014/2015

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

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

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

Tvorba informačních systémů

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

Více o konstruktorech a destruktorech

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

1. Programování proti rozhraní

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

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

7.5 Diagram tříd pokročilé techniky

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

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

Jak testovat software v praxi. aneb šetříme svůj vlastní čas

Michal Podzimek

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

Funkční objekty v C++.

Úvod do Entity Frameworku

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

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.

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

MVVM pro desktop i web

WCF RIA Services. aneb jak na RIA aplikace v Silverlightu

7.5 Diagram tříd pokročilé techniky

Vyřešené teoretické otázky do OOP ( )

RMI Remote Method Invocation

Jazyk C# (seminář 6)

René Stein. Senior Software Architect

Vývoj multiplatformní aplikace v Qt

Diagnostika webových aplikací v Azure

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

Návrhové vzory Design Patterns

Zpracoval:

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

RMI - Distribuované objekty v Javě

Code Contracts. Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

1. Dědičnost a polymorfismus

PB161 Základy OOP. Tomáš Brukner

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

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

Základy objektové orientace I. Únor 2010

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

Programování v C++ VI

Kubernetes Azure Service Fabric

Seminář Java II p.1/43

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

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

Základy datových vazeb Silverlightu. Funkce Silverlightu 2. Podpora jazyků a technologie.net Framework

C# - OOP (object oriented programming)

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.

Microsoft ASP.NET 2.0/3.0 (advanced)

Generické programování

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

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

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

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

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

(Enterprise) JavaBeans. Lekce 7

Programátorská příručka

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

Remote Method Invocation RMI

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

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody

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

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

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

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

Observer. Klasifikace. Alias. Smysl. Potřeba sledování změn objektu a notifikace. Obdoba systému událostí (C#, Java) vlastními prostředky

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

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

Abstraktní třída a rozhraní

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

Transkript:

Jak na IoC/DI kontejnery aneb píšeme aplikace pořádně Tomáš Herceg Chief Software Architect @ Microsoft ASP.NET MVP http://www.herceg.cz, http://www.vbnet.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

SOLID DEMO Tomáš Herceg Chief Software Architect @ Microsoft ASP.NET MVP http://www.herceg.cz, http://www.vbnet.cz

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());

Práce s Castle.Windsor DEMO Tomáš Herceg Chief Software Architect @ Microsoft ASP.NET MVP http://www.herceg.cz, http://www.vbnet.cz

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>() )

Factories a lazy inicializace DEMO Tomáš Herceg Chief Software Architect @ Microsoft ASP.NET MVP http://www.herceg.cz, http://www.vbnet.cz

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) }

Vysvětlivky k finálnímu demu Jak učinit Entity Framework použitelným? Injektovat všude DbContext? NE Moc silná závislost - není jasné, která třída s kterou tabulkou pracuje Kdokoliv může dělat cokoliv Složité dotazy mají tendence se opakovat a hromadit - nepořádek Lze injektovat IQueryable a/nebo IEntitySet Nebo si nad tím napsat ještě Repository Pro účely testování lze nahradit implementací, která provádí operace in-memory

Vysvětlivky k finálnímu demu IRepository Add, Remove, FindById IQuery Abstrakce pro složitější dotazy s parametry, podpora stránkování atd. UnitOfWork Definuje, kde začíná a končí životnost DbContextu Něco jako TransactionScope, využívá IDisposable

Vysvětlivky k finálnímu demu UI fasády Volány z code behindu aplikace Univerzální, nezávislé na ASP.NET Mohou vyhazovat výjimky, jejich ošetření má na starosti vyšší vrstva UIException speciální výjimka s hláškou pro uživatele ASP.NET WebForms CodeBehind Volá metody z UI fasád Exception handling provádí Interceptor Kontrolu oprávnění provádí Interceptor

Vysvětlivky k finálnímu demu Injektování do code behind tříd Ve WebForms trochu problém, je nutno přepsat PageHandlerFactory Umí jen Property Injection (jen vlastnosti s atributem Inject) MVC má tohle řešeno jinak (lépe)

IoC/DI na složitější aplikaci DEMO Tomáš Herceg Chief Software Architect @ Microsoft ASP.NET MVP http://www.herceg.cz, http://www.vbnet.cz

Diskuse Q&A Tomáš Herceg Chief Software Architect @ Microsoft ASP.NET MVP http://www.herceg.cz, http://www.vbnet.cz