1 / 22

ZTO DI

ZTO DI. Krzysztof Manuszewski. Kontenery DI. Kod prehistoryczny. Ograniczenia : Żeby zmienić klasy usług lub zmodyfikować zależności należy zmienić kod klasy zależnej Konkretna implementacja klas usługowych musi być dostępna w czasie kompilacji

aglaia
Download Presentation

ZTO DI

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ZTODI Krzysztof Manuszewski

  2. Kontenery DI

  3. Kod prehistoryczny Ograniczenia: • Żeby zmienić klasy usług lub zmodyfikować zależności należy zmienić kod klasy zależnej • Konkretna implementacja klas usługowych musi być dostępna w czasie kompilacji • Testowanie (jednostkowe?) klas jest trudne z powodu konieczności uwazględniania pot. Skomplikowanego zachowania klas usługowych • Klasy zawierają zduplikowany kod do tworzenia i zarzadzania serwisami.

  4. DI: Wstrzykiwanie zależności - budowniczy

  5. DIprzypadekużycia public interface IService { } public class Application { private readonlyIService service; public Application(IService service) { this.service = service; } } public class ServiceImpl : IService { } Application a = new Application(new ServiceImpl()); //Co z ew. parametramiServiceImpl ?

  6. IoC – z kontenerem DI IUnityContainer container = new UnityContainer(); //configuration UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); section.Containers.Default.Configure(container); … Application application = container.Resolve<Application>();

  7. IoC - Przeglądrozwiązań • Castle • Unity • Ninject • Autofac • StructureMap • Spring.Net

  8. DIC - Możliwościiróżnice: • Różnemodeleżyciaobiektów • Automatycznarejestracjaklas/obiektów (npprzezrefleksję) • Konfiguracja xml/programowa/skryptowa • Introspekcja • Kaskadowerozwiązywaniezależności • Wstrzykiwaniezależnościprzezkonstruktor/właściwości • Komunikowaniebłedów (npzależnościrekursywne, brakrozwiązaniadlatypu) • Obsługaniezwiązanychgeneryków, list obiektów

  9. Service Locator

  10. ServiceLocator UnityContainer container= new UnityContainer() ServiceLocator.SetLocatorProvider( () => new UnityServiceLocator(container) ); // container configuration container.configure….. ServiceLocator.Current.GetInstance<ILoger>() ServiceLocator.Current.GetInstance<IPresenter>("simple")

  11. Życie jest skomplikowane... ServiceLocator UNITY Adapter GetInstance ModułA ModułC ModułB Konfiguracja

  12. Unity Wstrzykiwanie zależności: • konstruktor • właściwości • metody Konfiguracja • Atrybuty • XML config • Programowa • Auto Registration Cykliczne referencje są raportowane jako Stack overflow ...

  13. Prosty kod public interface IService { … }; public interface ILogger { … }; public class ConsoleLogger{ public ConsoleLogger() { … } } public class SimpleService { public SimpleService(ILogger logger) { … } } public class Application { public Application(ILogger logger, IService service) { … } }

  14. Unity – konfiguracja programowa using (IUnityContainer container = new UnityContainer()) { container.RegisterType< IService, ServiceImpl>() .RegisterInstance< ILogger >(new ConsoleLogger ()); Application application = container.Resolve<Application>(); ILogger loggerInstance = container.Resolve<ILogger>(); }

  15. Unity – konfiguracja xml using (IUnityContainer container = new UnityContainer()) { UnityConfigurationSection config = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); if (config != null) config.Containers.Default.Configure(container); Application application = container.Resolve<Application>(); }

  16. Unity – XML elementy konfiguracji <unity> <typeAliases> <typeAlias alias="string" type="System.String, mscorlib" /> <typeAlias <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </typeAliases> <containers> <container> <types> …. </types> </container> </containers> </unity> Aliases are not obligatory <type type="ILogger“ mapTo="ConsoleLogger”> <lifetime type="singleton"/> </type> <type type="IService“ mapTo="SimpleService"/> Mappings

  17. Unity – wielokrotne konstruktory public class SimpleService : IService { public SimpleService(ILogger logger) { … } public SimpleService(String logFile) { … } } Unity domyślnie wybiera konstruktor z największa liczbą parametrów Jeżeli jest takich kilka rzucany jest wyjatek Jak określić który konstruktor ma być wybierany?

  18. Unity – wybór konstruktora public class SimpleService : IService { [InjectionConstructor] public SimpleService(ILogger logger) { … } public SimpleService(String logFile) { … } } 1 2 container. RegisterType< IService, ServiceImpl>(new InjectionConstructor(typeof(ILogger) ) ) <type type="IService" mapTo="SimpleService"> <typeConfig> <constructor> <param name=" logger" parameterType="ILogger" /> </constructor> </typeConfig> </type> 3

  19. Unity – wstrzykiwanie zależności przez właściwości public class SimpleService : IService { [Dependency] public ILogger Logger { get; set; } } 1 2 container. RegisterType< IService, ServiceImpl>(new InjectionProperty("Logger") ) <type type="IService" mapTo="SimpleService"> <typeConfig> <property name="Logger" propertyType="ILogger" /> </typeConfig> </type> 3

  20. Unity – wstrzykiwanie zależności przez metody public class SimpleService : IService { [Dependency] public Init(Ilogger logger){ } } 1 2 container. RegisterType< IService, ServiceImpl>(new InjectionMethod("Init") ) <type type="IService" mapTo="SimpleService"> <typeConfig> <Method name="Init” /> </typeConfig> </type> 3

  21. Unity – specjalizacja public class SimpleService : IService { [Dependency("UI")] public ILogger Logger { get; set; } } 1 2 container. RegisterType< Logger, ServiceImpl>("UI",new InjectionConstructortypeof(ILogger) ) <type name="UI" type="ILogger" mapTo="TraceSourceLogger"/> 3

  22. Zasoby • CommonServiceLocator implementation:http://www.codeplex.com/CommonServiceLocator • Auto rejestracja dla unityhttp://autoregistration.codeplex.com/ • Automocking

More Related