Języki programowania na platformie.net 2017/18 Instrukcja laboratoryjna nr.2 Kontener Unity Prowadzący: Tomasz Goluch Wersja: 2.0
I. Kontener Unity. Cel: Instalacja i konfiguracja kontenera Unity. Rejestracja i utworzenie instancji typu udostępniającego zdefiniowany interfejs. Utwórz nowy Console Application projekt (Visual C#). Zainstaluj pakiet Unity, za pomocą Nugeta (komenda: Install-Package <NazwaPakietu> {-Project <NazwaProjektu>}) W wyniku instalacji powinniśmy otrzymać następujące referencje: Dodaj interfejs ILogger oraz klasy: Logger i Worker: Utwórz kontener unity: Konfiguracja kontenera może odbywać się: w kodzie (imperatywnie) w XML (deklaratywnie) plik App.config.
Rejestracja typu udostępniającego interfejs (kod): UnityContainer::RegisterType<typ_interfejsu, typ_obiektu>([lifetimemgr], parametry) UnityContainer::RegisterType<typ_interfejsu, typ_obiektu>(nazwa, [lifetimemgr], parametry) Parametry opisują, jak wstrzykiwać zależności: new InjectionConstructor(parametry) poprzez konstruktor new InjectionMethod(nazwa_metody, parametry) poprzez metodę nazwa_metody new InjectionProperty(nazwa_property, wartość) poprzez property nazwa_property new ResolvedParameter<typ>([nazwa]) oznacza zbuduj odpowiedni obiekt typu typ new ResolvedArrayPrameter<typ>() utworzenie tablicy wszystkich możliwych obiektów (zob. ResolveAll) Zarejestruj klasę Logger udostępniającej interfejs ILogger: Tworzenie instancji: UnityContainer::Resolve<typ>([nazwa]) zwraca nowy obiekt, UnityContainer::ResolveAll<typ>() zwraca IEnumerable<typ> wszystkich NAZWANYCH typów, UnityContainer::BulidUp<typ>(obiekt [nazwa]) inicjuje podany obiekt. Utwórz nowy obiekt klasy Worker i zaobserwuj działanie metody Work: W cel rejestracji deklaratywnej (XML) dodaj do pliku konfiguracyjnego (App.config 1 ) referencję do projektu: Project Add Reference.NET System.Configuration Wczytanie konfiguracji: 1 W przypadku braku pliku konfiguracyjnego dodaj go do projektu: Project Add New Item Application Configuration File Add.
W pliku App.config dodaj nową sekcję Unity: Dodaj aliasy nazw (wewnątrz sekcji konfiguracyjnej unity): Dodaj rejestrację klasy Logger udostępniającej interfejs ILogger: II. Wstrzykiwanie zależności. Cel: Wstrzykiwanie zależności za pomocą: konstruktora, wartości i metody. Dodaj kod klasy NumLogger: Zarejestruj klasę NumLogger udostępniającej interfejs ILogger o nazwie numlog i wstrzykniętym konstruktorem:
Dodaj kod klasy MetWorker: Zarejestruj klasę MetWorker wraz ze wstrzyknięciem property: Utwórz nowy obiekt klasy MetWorker i zaobserwuj działanie metody Work: Konfiguracja w App.config, dodaj aliasy : Rejestracja klasy NumLogger udostępniającej interfejs ILogger o nazwie numlog i wstrzykniętym konstruktorem: Rejestracja klasy MetWorker wraz ze wstrzyknięciem property:
Dodaj kod klasy SetWorker: Rejestracja instancji: UnityContainer::RegisterInstance<typ_interfejsu>(obiekt, [lifetimemgr]) UnityContainer::RegisterInstance<typ_interfejsu>(nazwa, obiekt, [lifetimemgr]) Zarejestruj instancję typu ILogger: Konfiguracja obiektu tylko korzystającego z interfejsów: UnityContainer::RegisterType<typ>([nazwa], parametry) UnityContainer::Configure<InjectedMembers>().ConfigureInectionFor<typ>(paramet ry) Skonfiguruj obiekt typu SetWorker: Utwórz nowy obiekt klasy SetWorker i zaobserwuj działanie metody Work: Konfiguracja w App.config, dodaj alias : Rejestracja instancji typu ILogger: W celu zdefiniowania konwertera typów dodaj przestrzeń nazw:
oraz klasę konwertera: Konfiguracja obiektu typu SetWorker: Utwórz kolejny nowy obiekt klasy MetWorker i zaobserwuj działanie metody Work: Zarejestruj instancję typu MetWorker: Wstrzyknij do istniejącego obiektu w2 jako właściwość instancję typu ILogger przekazaną wcześniej do metody SetLogger instancji typu SetWorker. Zaobserwuj działanie metody Work: Konfiguracja w App.config, rejestracja instancji typu MetWorker: