II Konferencja Kół Naukowych
Transkrypt
II Konferencja Kół Naukowych
II Konferencja Kół Naukowych #1 / 12 Contexts and Dependency Injection Radosław Sokół [email protected] #2 / 12 II Konferencja Kół Naukowych Zależność ang. dependency class DziennikZdarzen { // ……… }; ● zależność jest zdefiniowana trwale ● nie istnieje możliwość zmiany implementacji klasy class SerwerAplikacji { private: DziennikZdarzen dziennik; }; DziennikZdarzen poza modyfikacją tekstu źródłowego programu ● utrudnione jest testowanie klasy mającej takie zależności #3 / 12 II Konferencja Kół Naukowych class DziennikZdarzen { // ……… }; class DziennikZdarzenImpl : public DziennikZdarzen { // ……… }; ● rozdzielenie interfejsu od implementacji: krok w dobrym kierunku class SerwerAplikacji { private: DziennikZdarzen *dziennik; public: void Ustaw(DziennikZdarzen *nowy) { dziennik = nowy; } }; ● ułatwione testowanie ● konieczność ręcznego rozwiązywania zależności ● narzut powtarzalnego kodu na każdą nową zależność #4 / 12 II Konferencja Kół Naukowych Wstrzykiwanie zależności ang. dependency injection Mechanizm umożliwiający automatyczne rozwiązywanie zależności na podstawie nazw klas i interfejsów oraz inicjalizowanie wartości pól obiektami zależnymi, czyli... wstrzykiwanie #5 / 12 II Konferencja Kół Naukowych public class DziennikZdarzen { // ……… } public class SerwerAplikacji { @Inject private DziennikZdarzen dziennik; } ● klasa implementująca funkcjonalność (spełniająca zależność) ● klasa zależna, wymagająca wstrzyknięcia zależności #6 / 12 II Konferencja Kół Naukowych public interface DziennikZdarzen { // ……… } public class DziennikZdarzenImpl implements DziennikZdarzen { // ……… } public class SerwerAplikacji { @Inject private DziennikZdarzen dziennik; } ● interfejs definiujący moduł funkcjonalny ● klasa implementująca funkcjonalność (spełniająca zależność) ● klasa zależna, wymagająca wstrzyknięcia zależności lecz niezależna od implementacji II Konferencja Kół Naukowych Wstrzykiwanie zależności odpowiedniej dla kontekstu ang. contexts and dependency injection Mechanizm umożliwiający automatyczne rozwiązywanie zależności na podstawie nazw klas i interfejsów oraz inicjalizowanie wartości pól obiektami zależnymi, z uwzględnieniem kontekstu istnienia obiektu zależnego oraz liczności instancji klasy spełniającej zależność. #7 / 12 #8 / 12 II Konferencja Kół Naukowych public interface Dziennik { void loguj(String wpis); } public interface IdSesji { UUID noweId(); } @ApplicationScoped public class DziennikImpl implements Dziennik { // ……… } @RequestScoped public class IdSesjiImpl implements IdSesji { // ……… } public class SesjaKlienta { @Inject private DziennikZdarzen dziennik; @Inject private IdSesji idSesji; } #9 / 12 II Konferencja Kół Naukowych Typowe konteksty aplikacji sesji singleton w ramach całej aplikacji singleton w ramach jednej sesji klienta żądania singleton w ramach pojedynczego żądania (np. aplikacji web) niezależny nowe instancje tworzone w każdym punkcie wstrzyknięcia zależności II Konferencja Kół Naukowych Zasada odwrócenia sterowania ang. inversion of control Standardowo tworzone aplikacje otrzymują sterowanie w punkcie wejścia (ang. entry point) i w razie potrzeby chwilowo wywołują podprogramy biblioteczne. Program napisany zgodnie z IoC jest realizowany głównie przez osnowę programistyczną (ang. framework), otrzymując sterowanie tylko w reakcji na pewne zdarzenia. Wstrzykiwanie zależności jest realizowane przez kontener i dotyczy tylko obiektów przez niego tworzonych, w ramach pracy w trybie IoC. #10 / 12 II Konferencja Kół Naukowych Co z C, C++ i aplikacjami Java SE? ● istnieją implementacje DI dla Java SE https://hk2.java.net/ ● istnieją gotowe biblioteki DI oraz CDI dla języków C i C++ ● istnieje możliwość stworzenia własnych osnów CDI dla C++ class Interface : public Injectable { // ………… }; class Implementation : public Realization<Interface,Implementation> { // ………… }; ApplicationScope::Instance().Register<Implementation>(); // ………… Inject<Interface> injected = ApplicationScope::Instance().Inject<Interface>(); #11 / 12 II Konferencja Kół Naukowych #12 / 12 Dziękuję