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ącatruew 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 obiektemIPropertyInitializerodpowiedzialnym 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.
