際際滷

際際滷Share a Scribd company logo
Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i DependencyInjectionMarcin Daczkowski, AIS.PLmarcin.daczkowski@ais.pl
Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i Dependency Injection
AgendaCharakterystykaZalety i wadyWariantyZastosowaniaPrzegld kontener坦wUnityArchitekturaPrzykady u甜ycia
Charakterystyka
Ka甜dy wzorzec okrela problem, kt坦ry wielokrotniewystpuje w naszym rodowisku, a nastpnie opisuje zasadniczcz姻看噛敬庄噛温稼庄温tego problemu.Christopher Alexander (1977)A Pattern Language: Towns, Buildings, Construction
Inversion of ControlWzorzec architektonicznyPrzeniesienie odpowiedzialnociR坦甜ne aspekty
Sterowanie
Determinowanie powizaDependency InjectionAutor - Martin FowlerRozwizuje ten sam problem, co wzorce kreacyjne:Fabryka AbstrakcyjnaMetoda Wytw坦rczaBudowniczyZgodnie z ide Inversion of ControlBob Martin - SOLID
意庄乙鞄岳-界看顎沿鉛庄稼乙岳敬看姻噛霞粥京遺顎甜霞敬温顎甜霞敬温
禽艶沿艶稼糸艶稼界霞鴛稼逮艶界岳庄看稼岳敬看姻噛霞粥京鴛遺顎甜霞敬温顎甜霞敬温
DependencyInjection + KontenertworzyABKontener 禽鴛鴛遺顎甜霞敬温顎甜霞敬温顎甜霞敬温
Service LocatortworzyABServiceLocatorICu甜ywau甜ywau甜ywa
Zalety i wady
Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i Dependency Injection
Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i Dependency Injection
Warianty
ConstructorInjectionnew B(new C());ICpublic B(     ) { }Property Injectionvar b = new B();b.C = new C();ICpublic      { set; }
InterfaceInjectionICvoidInjectC(     c)var b = new B();b.InjectC(new C());B : IInjectC
Zastosowania
Hosty aplikacyjneWindows FormsWPFASP.NET Web FormsASP.NET MVCWCF
BibliotekiPrywatne konteneryKontener wsp坦dzielony z hostemIntegracja poprzez mechanizmy rozszerze
Przegld kontener坦w
NinjectAutofacStructure MapUnityCastle WindsorSpring.NETWybrane 姻看噛敬庄噛温稼庄温
店r坦do: http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html
Unity
UnityObjectBuilder
悪看稼韓庄乙顎姻温界逮温粥或永粥岳姻霞恢顎岳霞或恢逮艶界岳京顎庄鉛糸艶姻意霞沿霞赫艶稼艶姻霞界噛稼艶晦庄韓艶岳庄馨艶珂温稼温乙艶姻壊意温恢鉛庄界艶S岳温岳庄界酷温界岳看姻霞
PolicyPolicyPolicyObjectBuilder 2.0StrategyStrategyStrategyLocatorLifetimecontainer
DEMO

More Related Content

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

Editor's Notes

  1. 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 dostpne 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; } }}
  2. W kolejnej wersji (2.0) Unity pochonie klasy ObjectBuildera (nie bdzie koniecznoci referencjonowania assembly ObjectBuildera).