Obiektowy model konfiguracji - implementacja
Poniższy rysunek przedstawia diagram klas tworzących Obiektowy model konfiguracji:
Rysunek 1. Implementacja obiektowego modelu konfiguracji
Configuration
Klasa Configuration
reprezentuje pojedynczą, kompletną konfigurację, czyli zbiór definicji komponentów tworzących drzewiaste struktury. Metoda getComponentDefinitions()
zwraca listę definicji, które są korzeniami w tych strukturach.
TODO: dodać diagram obiektowy przedstawiający przykładową hierarchiczną konfigurację
IComponentDefinition
IComponentDefinition
będący wspólnym interfejsem dla wszystkich definicji komponentów, definiuje metody opisujące pojedynczy komponent:
getName
- zwracająca nazwę komponentu,getType
- zwracająca klasę komponentu,isSingleton
- zwracającatrue
w przypadku, kiedy komponent jest reprezentowany przez obiekt będący singletonem.
Tworzenie nowych instancji komponentów umożliwia metoda createInstance
, która zwraca w pełni zainicjalizowany obiekt. Do rozstrzygania zależności od innych komponentów wykorzystywany jest obiekt typu IComponentInstanceProvider
ustawiany automatycznie przy tworzeniu obiektu definicji. Więcej na temat na stronie... TODO: uzupełnić!
ComponentDefinition
Klasa ComponentDefinition
opisuje komponent, który jest reprezentowany przez dowolny obiekt. Oprócz opisanych wcześniej elementów posiada pola:
constructorArguments
, czyli listę obiektówIValueProvider
, które zostaną wykorzystane do uzyskania odpowiednich wartości prostych lub referencji podczas wstrzykiwania przez konstruktorpropertyInitializers
, czyli mapę zawierającą powiązania pomiędzy nazwą właściwości komponentu a obiektemIPropertyInitializer
odpowiedzialnym za dostarczenie odpowiedniej referencji lub wartości prostej; mapa ta wykorzystywana jest podczas wstrzykiwania za pomocą adnotowanych metod lub pól
Definicje komponentu reprezentowanego przez kolekcję - ListDefinition, SetDefinition, MapDefinition
Definicje kolekcji zawierają natomiast kolekcje obiektów IValueProvider
, które posłużą do "wypełnienia" tworzonych kolekcji odpowiednimi instancjami.
ListDefinition
oraz SetDefinition
posiadają mapy elementów, gdzie kluczem jest obiekt typu IValueProvider
, a wartością dodatnia liczba wystąpień w kolekcji. Takie rozwiązanie umożliwia tworzenie wielu instancji tego samego typu w kolekcjach.
Definicja mapy posiada listę obiektów MapItem
, które składają się z klucza i wartości typu IValueProvider
każda.