W aplikacjach web dość często wykorzystuje się plik global.asax na przykład do przechwytywania wszystkich niewyłapanych wcześniej błędów. Zalogowanie takiego błędu może wymagać referencji do mechanizmu logującego używanego w całej aplikacji. Przykład:
1: private ILogger _logger; 2: 3: void Application_Error(object sender, EventArgs e) 4: { 5: Exception error = CurrentContext.Server.GetLastError(); 6: _logger.Log(error); 7: }
W WCSF chcielibyśmy oczywiście, aby ILogger został wstrzyknięty przez DI. Dlatego zadeklarujemy go w sposób następujący:
1: private static ILogger _logger; 2: [ServiceDependency] 3: public ILogger Logger { set { _logger = value; } }
To jednak nie wystarczy – w tym przypadku musimy jawnie wymusić inicjalizację oznaczonych w ten sposób elementów. Korzystamy z ServiceDependency, więc wystarczy nam inicjalizacja jednokrotna. Do tego celu klasa bazowa aplikacji WCSF, czyli WebClientApplication, wystawia nam metodę Start(). Nadpiszemy ją i wywołamy proces wstrzykiwania zależności. Po kilku chwilach grzebania efektem jest poniższy kawałek kodu załatwiający całą inicjalizację klasy aplikacji:
1: protected override void Start() 2: { 3: base.Start(); 4: 5: CompositionContainer.BuildItem(this.PageBuilder, this.GetModuleContainer(CurrentContext).Locator, this); 6: }
Instrukcje podające nam odpowiednią implementację Loggera wykonają się tylko za pierwszym żądaniem, przy starcie aplikacji. Dlatego też wynik przypiszemy do statycznej zmiennej. Koniec końców o to właśnie nam chodzi. Od tej pory możemy już do woli korzystać z loggera tudzież innych serwisów w podobny sposób wykorzystywanych.