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ę

Podobne dokumenty