2. Kdo sem?
• Programski arhitekt
• 10+ let izkušenj (C#, Java...)
• http://www.linkedin.com/in/avodovnik
• @avodovnik
• http://lab.studiopesec.com
3. Kdo je Studio Pešec?
• digital production company
• visoko-performančne, skalabilne (spletne)
aplikacije
• Razvoj po meri
• Svetovanje
• Marketing
4. Job.ru
• 350.000+ unikatnih
obiskovalcev na dan
• ASP.NET & MySQL
• 9 strežnikov
5. CentrSource
• ASP.NET 4 & MSSQL
• Kanada, Madžarska, Slo
venija
• 120.000 unikatnih
obiskovalcev + tiskan
katalog
• Oglaševalska platforma
za direktni marketing
6. Viva.si
• ASP.NET MVC &
MySQL
• Netko
• 6000 dnevno
unikatnih
uporabnikov
• Zdravstvena skupnost
7. MojeDelo.com
• Vodilni zaposlitveni
portal v Sloveniji
• ASP.NET 4.0 in SQL
Azure
• 35.000 dnevno
unikatnih
obiskovalcev
• Windows Azure
8. Agenda
• Odvisnosti v aplikaciji
• Načrtovalski vzorci
• Dependency Injection 101
• Primeri dobrih ogrodji
• Realnost: moja aplikacija in jaz
9. 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...)
11. In?
• Več-nivojska arhitektura je logična ločitev
• Koda je vseeno tesno povezana in odvisna
}
– Stranka 1: MySQL
– Stranka 2: MSSQL
Različne verzije za vse?
– Stranka 3: Azure SQL
– Stranka N: Oracle? („$!“#?!=@„!%“!!“)
14. Tesna sklopljenost
• Sword in Samurai sta sklopljena
• Ne moremo zamenjati oziroma dodati orožja
brez spreminjanja Samurai razreda
• Vpeljemo prvi nivo abstrakcije: interface
23. 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?
31. Dependency injection
• Inversion of Control = preveč generičen pojem
• Hollywood Principle
– Don’t call us, we’ll call you
• Martin Fowler predlaga: Dependency Injection
32. 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
33. Dependency Injection
• Rešitev: IoC Container
• Ninject
• Spring Framework
• Unity
• StructureMap
• Castle Windsor
35. IoC container
1. Get<Samurai>()
2. Obstaja mapping?
3. Reflection nad Samurai razredom
1. 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>()
36. 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)
46. DI & MVC3 = match made in heaven
• MVC3 je predstavil nov interface:
IDependencyResolver
• DependencyResolver.SetResolver(new
UnityDependencyResolver(container));
54. Kdaj uporabiti DI?
• DI = dobra ideja skoraj vedno
• Vprašanje: ročno ali samodejno?
55. 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 Deklerativnost: večina pravil je
klicev (a->b->c) deklerativnih, eno mesto za opis pravil,
eno mesto za spremembo teh pravil
Tudi razvijalci, ki ne razumejo DI lahko Manj tipkanja: ne rabimo se ukvarjat s
sodelujejo na projektu. pisanjem Factory razredov, ipd.
Pomaga pri testiranju! Zelo.
56. Povzetek
• Dependency Injection
• Bolj specifičen termin kot Inversion of Control
• IoC container rešuje mnogo problemov
• Razklopljenost modulov/servisov