inject your dependencies

58
Inject Your Dependencies Inversion of control Anže Vodovnik ([email protected])

Upload: studio-pesec

Post on 03-Jul-2015

1.837 views

Category:

Technology


4 download

DESCRIPTION

Anže Vodovnik gave a talk about dependency injection and why &where it's useful at SLODUG's first season 2011/2012 meeting.

TRANSCRIPT

Page 1: Inject your dependencies

Inject Your Dependencies Inversion of control

Anže Vodovnik ([email protected])

Page 2: Inject your dependencies

Kdo sem?

• Programski arhitekt

• 10+ let izkušenj (C#, Java...)

• http://www.linkedin.com/in/avodovnik

• @avodovnik

• http://lab.studiopesec.com

Page 3: Inject your dependencies

Kdo je Studio Pešec?

• digital production company

• visoko-performančne, skalabilne (spletne) aplikacije

• Razvoj po meri

• Svetovanje

• Marketing

Page 4: Inject your dependencies

Job.ru

• 350.000+ unikatnih obiskovalcev na dan

• ASP.NET & MySQL

• 9 strežnikov

Page 5: Inject your dependencies

CentrSource

• ASP.NET 4 & MSSQL

• Kanada, Madžarska, Slovenija

• 120.000 unikatnih obiskovalcev + tiskan katalog

• Oglaševalska platforma za direktni marketing

Page 6: Inject your dependencies

Viva.si

• ASP.NET MVC & MySQL

• Netko

• 6000 dnevno unikatnih uporabnikov

• Zdravstvena skupnost

Page 7: Inject your dependencies

MojeDelo.com

• Vodilni zaposlitveni portal v Sloveniji

• ASP.NET 4.0 in SQL Azure

• 35.000 dnevno unikatnih obiskovalcev

• Windows Azure

Page 8: Inject your dependencies

Agenda

• Odvisnosti v aplikaciji

• Načrtovalski vzorci

• Dependency Injection 101

• Primeri dobrih ogrodji

• Realnost: moja aplikacija in jaz

Page 9: Inject your dependencies

Odvisnosti v aplikaciji• Kaj je odvisnost?• Podatkovni nivo & baze

– MySQL, MSSQL, Azure

• Poslovni nivo• Zunanje storitve & komponente• .NET framework komponente

– File objekti – Web objekti (npr. HttpContext, Request...)

Page 10: Inject your dependencies

Odvisnosti: pogled z vrha

BazaDALPoslovna

logikaUI

Page 11: Inject your dependencies

In?

• Več-nivojska arhitektura je logična ločitev

• Koda je vseeno tesno povezana in odvisna– Stranka 1: MySQL

– Stranka 2: MSSQL

– Stranka 3: Azure SQL

– Stranka N: Oracle? („$!“#?!=@„!%“!!“)} Različne verzije za vse?

Page 12: Inject your dependencies

In? (cnt‘d)

• Težko izoliramo posamezno komponento

– Težje testiranje

– Težje prilagajanje

– Težje vzdrževanje

– Težje spreminjanje / nadgrajevanje

Page 13: Inject your dependencies
Page 14: Inject your dependencies

Tesna sklopljenost

• Sword in Samurai sta sklopljena

• Ne moremo zamenjati oziroma dodati orožja brez spreminjanja Samurai razreda

• Vpeljemo prvi nivo abstrakcije: interface

Page 15: Inject your dependencies

PROGRAMMING TO AN INTERFACEREŠITEV 1

Page 16: Inject your dependencies
Page 17: Inject your dependencies

Rešitev 1

• Še vedno statična odvisnost med Samurai in Sword razredom

• Logika (Attack) ni več neposredno odvisna od implementacije

Page 18: Inject your dependencies

FACTORY PATTERNREŠITEV 2

Page 19: Inject your dependencies
Page 20: Inject your dependencies

Rešitev 2

• Še vedno je tesno sklopljen

• Še vedno je statična povezava

Page 21: Inject your dependencies

SERVICE LOCATORREŠITEV 3

Page 22: Inject your dependencies
Page 23: Inject your dependencies

Rešitev 3+ Samurai ni več statično odvisen od Sword razreda

+ Večja razširljivost, testabilnost in reusability

- Odvisno od sekvence (Assembler, Samurai)

- Težavno postavljenje (test)

- Lookup problemi?

Page 24: Inject your dependencies

DEPENDENCY INJECTIONREŠITEV 4

Page 25: Inject your dependencies

INTERFACE INJECTIONDEPENDENCY INJECTION

Page 26: Inject your dependencies
Page 27: Inject your dependencies

SETTER INJECTIONDEPENDENCY INJECTION

Page 28: Inject your dependencies
Page 29: Inject your dependencies

CONSTRUCTOR INJECTIONDEPENDENCY INJECTION

Page 30: Inject your dependencies
Page 31: Inject your dependencies

Dependency injection

• Inversion of Control = preveč generičen pojem

• Hollywood Principle

– Don’t call us, we’ll call you

• Martin Fowler predlaga: Dependency Injection

Page 32: Inject your dependencies

Dependency Injection

• Instanciranje na roko?

• Kaj pa povezani razredi?– new Glock(new Ammo(15, 3));

• Boilerplate koda

• Težko upravljanje (N mnogo lokacij?)

• Upravljanje z življenjskim ciklom

Page 33: Inject your dependencies

Dependency Injection

• Rešitev: IoC Container

• Ninject

• Spring Framework

• Unity

• StructureMap

• Castle Windsor

Page 34: Inject your dependencies

IoC container

• Prevzame dolgočasen del kode

Page 35: Inject your dependencies

IoC container

1. Get<Samurai>()

2. Obstaja mapping?

3. Reflection nad Samurai razredom1. Najde popoln konstruktor (največ „resolvable“

odvisnosti ali [Inject] atribut)

2. Najde Setterje z [Inject] atributom

4. Instancira razred & odvisnosti 1. Za vsako odvisnost pokliče .Get<Dependency>()

Page 36: Inject your dependencies

IoC container• V ozadju uporablja System.Reflection.Emit.DynamicMethod

• Resolva se v delegat, koda je hitrejša

• Lahko uporabite reflection (v nekaterih primerih je to občutno hitrejše)

Page 37: Inject your dependencies

Dependency Injection 101

• Razrešitev

– Kontekstualna ([Named(„Weak“)]

– Multiple-bindings (IEnumerable<IWeapon>)

• Upravljanje z življenjskim ciklom

– Transient, Singleton, Thread, Request (Http)

Page 38: Inject your dependencies

Resolution: multiple bindings

Page 39: Inject your dependencies

Resolution: named bindings

Page 40: Inject your dependencies

Resolution: več opcij• Constraints:

– Imena

– Binding Meta-podatki

– Kontekst „tarče“

– predikati

Page 41: Inject your dependencies

Resolution: več opcij

Page 42: Inject your dependencies

Upravljanje z življenjskim ciklom

• Inversion of control? AHA!

• Instanciranje po potrebi

• Dispose po potrebi

• Enostaven nadzor & menjava– Singleton | per-request | per-thread | lasten

scope

• Privzeto: InTransientScope

Page 43: Inject your dependencies

Upravljanje z življenjskim ciklom

• Transient .InTransientScope()

• Singleton .InSingletonScope()

• Thread .InThreadScope()

• Request .InRequestScope()

• Custom .InScope(Func<object> o)

Page 44: Inject your dependencies

Moduli & nalaganje

• IKernel kernel = new StandardKernel(new WeaponsModule(useMeleeWeapons));

• Kernel.Load(„*.dll“);

Page 45: Inject your dependencies

NINJECT & MVC 3Kako zadevo uporabiti v resničnem življenju?

Page 46: Inject your dependencies

DI & MVC3 = match made in heaven

• MVC3 je predstavil nov interface: IDependencyResolver

• DependencyResolver.SetResolver(new UnityDependencyResolver(container));

Page 47: Inject your dependencies

Zakaj?

BazaDALPoslovna

logikaUI

Page 48: Inject your dependencies

Zakaj?

BazaDAL„Services“Controller

Page 49: Inject your dependencies

Zakaj?

Page 50: Inject your dependencies

Kako?

• NuGet!

• Ninject.MVC3

– Ninject

– WebActivator

Page 51: Inject your dependencies

Ninject & MVC3

„Assembler“

Page 52: Inject your dependencies

Ninject & MVC3

Page 53: Inject your dependencies

Ninject & MVC3

Page 54: Inject your dependencies

Kdaj uporabiti DI?

• DI = dobra ideja skoraj vedno

• Vprašanje: ročno ali samodejno?

Page 55: Inject your dependencies

Ročno ali samodejno?Ročni DI Samodejno (IoC container)

Enostavno, skoraj nič učenja Konsistentnost; za večje ekipe, velik +

Nič „črne magije“ – enostavno iskanje klicev (a->b->c)

Deklerativnost: večina pravil je deklerativnih, eno mesto za opis pravil, eno mesto za spremembo teh pravil

Tudi razvijalci, ki ne razumejo DI lahko sodelujejo na projektu.

Manj tipkanja: ne rabimo se ukvarjat s pisanjem Factory razredov, ipd.

Pomaga pri testiranju! Zelo.

Page 56: Inject your dependencies

Povzetek

• Dependency Injection

• Bolj specifičen termin kot Inversion of Control

• IoC container rešuje mnogo problemov

• Razklopljenost modulov/servisov

Page 57: Inject your dependencies

Viri• http://www.martinfowler.com/articles/injection.html

• http://lab.studiopesec.com

• http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code

• http://ninject.org

• MSDN: Design Patterns – Dependency Injection http://msdn.microsoft.com/en-us/magazine/cc163739.aspx

Page 58: Inject your dependencies

Vprašanja

• http://www.studiopesec.com

• @studiopesec

[email protected]