Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

ZTO DI Krzysztof Manuszewski. Kontenery DI Kod prehistoryczny Ograniczenia: Żeby zmienić klasy usług lub zmodyfikować zależności należy zmienić kod klasy.

Podobne prezentacje


Prezentacja na temat: "ZTO DI Krzysztof Manuszewski. Kontenery DI Kod prehistoryczny Ograniczenia: Żeby zmienić klasy usług lub zmodyfikować zależności należy zmienić kod klasy."— Zapis prezentacji:

1 ZTO DI 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 DI przypadek użycia public interface IService { } public class Application { private readonly IService service; public Application(IService service) { this.service = service; } } public class ServiceImpl : IService { } Application a = new Application(new ServiceImpl()); //Co z ew. parametrami ServiceImpl ?

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 ();

7 IoC - Przegląd rozwiązań Castle Unity Ninject Autofac StructureMap Spring.Net

8 DIC - Możliwości i różnice: Różne modele życia obiektów Automatyczna rejestracja klas/obiektów (np przez refleksję) Konfiguracja xml/programowa/skryptowa Introspekcja Kaskadowe rozwiązywanie zależności Wstrzykiwanie zależności przez konstruktor/właściwości Komunikowanie błedów (np zależności rekursywne, brak rozwiązania dla typu) Obsługa niezwiązanych generyków, list obiektów

9 Service Locator

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

11 Życie jest skomplikowane... Moduł B Moduł A Moduł C ServiceLocator UNITY Adapter GetInstance 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 ().RegisterInstance (new ConsoleLogger ()); Application application = container.Resolve (); ILogger loggerInstance = container.Resolve (); }

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 (); }

16 Unity – XML elementy konfiguracji …. Mappings Aliases are not obligatory

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) { … } } container. RegisterType ( new InjectionConstructor(typeof(ILogger) ) ) 1 2 3

19 Unity – wstrzykiwanie zależności przez właściwości public class SimpleService : IService { [Dependency] public ILogger Logger { get; set; } } container. RegisterType ( new InjectionProperty("Logger") ) 1 2 3

20 Unity – wstrzykiwanie zależności przez metody public class SimpleService : IService { [Dependency] public Init(Ilogger logger){ } } container. RegisterType ( new InjectionMethod("Init") ) 1 2 3

21 Unity – specjalizacja public class SimpleService : IService { [Dependency("UI")] public ILogger Logger { get; set; } } container. RegisterType ("UI", new InjectionConstructortypeof(ILogger) )

22 Zasoby CommonServiceLocator implementation: Auto rejestracja dla unity Automocking


Pobierz ppt "ZTO DI Krzysztof Manuszewski. Kontenery DI Kod prehistoryczny Ograniczenia: Żeby zmienić klasy usług lub zmodyfikować zależności należy zmienić kod klasy."

Podobne prezentacje


Reklamy Google