Originally presented on IT Academic Day 2008 (Faculty of Mathematics and Computer Science, NCU, Torun)
1 of 29
More Related Content
Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i Dependency Injection
1. Tworzenie elastycznych aplikacji .NET w oparciu o wzorce projektoweInversion Of Control i DependencyInjectionMarcin Daczkowski, AIS.PLmarcin.daczkowski@ais.pl
5. 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
8. Determinowanie powizaDependency InjectionAutor - Martin FowlerRozwizuje ten sam problem, co wzorce kreacyjne:Fabryka AbstrakcyjnaMetoda Wytw坦rczaBudowniczyZgodnie z ide Inversion of ControlBob Martin - SOLID
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; } }}
W kolejnej wersji (2.0) Unity pochonie klasy ObjectBuildera (nie bdzie koniecznoci referencjonowania assembly ObjectBuildera).