Wstrzykiwanie zależności z Lazy

Wstrzykiwanie zależności z wykorzystaniem kontenerów jest bardzo wygodne, ale też niesie z sobą trochę problemów. Jednym z tych problemów jest ilość oraz moment tworzenia obiektów. W tym wpisie pokaże ten problem oraz zaproponuje swoje rozwiązanie: wstrzykiwanie zależności z Lazy.

Problem

Poniżej jest przedstawiona dość standardowy kawałek kodu aplikacji ASP.NET MVC, w której jest wykorzystane wstrzykiwanie zależności przez konstruktor w formie interfejsów.

Jak widać na kodzie powyżej. Kontroler w konstruktorze otrzymuje zależność do logiki biznesowej. Logika biznesowa następnie posiada zależność do repozytorium oraz walidatora, gdzie repozytorium posiada jeszcze zależność do DataContext z entity framework.

Domyślnie kontenery działają w ten sposób, że przed utworzeniem instancji jakieś klasy, tworzą instancje klasy zależnej i tak dalej. Czyli w naszym przykładzie przed utworzeniem instancji kontrolera utworzone zostaną instancje logiki biznesowej, walidatora, repozytorium oraz kontekst entity framework. To wszystko zostanie utworzone za każdym razem, nie zależnie, czy obiekty będą używane, czy nie.

W niektórych sytuacjach takie zachowanie jest niepożądane. Wystarczy spojrzeć na akcję Create z kontrolera, która wyświetla tylko formularz, nie korzystając w logiki biznesowej. W tej sytuacji tworzenie tych wszystkich obiektów jest zbędne i niepotrzebnie odciąża działania aplikacji – w tym przypadku serwera www, który mógłby obsłużyć dużo większy ruch.

Widziałem jedną aplikacji WPF, która podczas startu (łącznie około 2,5 minuty) tworzyła instancje wszystkich widoków, nawet tych, których użytkownik w ogóle nie mógł widzieć z racji uprawnień. Użycie obiektów Lazy, o których niżej spowodowało, że start aplikacji skrócił się do około 30 sekund.

Na potwierdzenie poniżej znajduje się log z testowej aplikacji, który wyświetla informacje o tworzonych obiektach przez kontener (użyłem Autofac) oraz wywołaniach samych metod.

Darmowy kurs Visual Studio

Pracując z setkami programistów zauważyłem, że większość osób nie pracuje efektywnie w Visual Studio. W skrajnych przypadkach korzystali z kopiowania z wykorzystaniem menu Edit. Wiem, że to dziwne, ale naprawdę niektórzy tak pracują. Dlatego postanowiłem stworzyć kurs Visual Studio, aby pomóc koleżankom i kolegom w efektywniejszej pracy.

Przygotowałem 20 lekcji email, w których pokaże Ci w jaki sposób pracować efektywnej i szybciej w Visual Studio. Poznasz dodatkich, bez których nie wyobrażam sobie pracy w tym IDE.

Po więcej informacji zapraszam na dedykowaną stronę kursu: Darmowy Kurs Visual Studio.

Quiz C#

Ostatnio przygotowałem również quiz C#, w którym możesz sprawdzić swoją wiedzę. Podejmiesz wyzwanie?

Wstrzykiwanie zależności z Lazy

Jednym z sposób rozwiązania powyższego problemu jest wstrzykiwanie zależności z Lazy, który jest wpierany przez większość kontenerów. Obiekty Lazy przechowuje informacje o tych jak utworzyć jakieś obiekt i tworzy go dopiero podczas pierwszego użycia. Gdy chcemy ręcznie skorzystać z Lazy wystarczy, że przekażemy delegat tworzący obiekt do konstruktora. Natomiast w przypadku Autofac nie musimy nic specjalnego robić po stronie konfiguracji samego kontenera.

Aby skorzystać z Lazy wystarczy tylko zmienić parametry w konstruktorze z IUserLogic na Lazy<IUserLogic>. Następnie korzystamy z właściwości Value obiektu Lazy, która udostępnia nam właściwy obiekt i tworzy go podczas pierwszego skorzystania z Value. W swoim kodzie nie korzystam bezpośrednio z obiektu Lazy, tylko opakowuje to prostą właściwością (co najlepiej widać na kodzie).

Poniżej zmieniony kod, który korzysta z wstrzykiwania zależności z Lazy:

Jak widać nie trzeba za dużo zmieniać kodu, aby skorzystać z obiektów Lazy.

Na logu widać, że obiekty są tworzony tylko te, które są używane oraz widać, że na przykład obiekt logiki jest tworzony już w trakcie wykonywania akcji. Pierwszy log jest z wyświetlenia samego formularza (czyli to samo co log wyżej), natomiast drugi log to próba zapisania formularza z błędem walidacji (nie ustawione FirstName).

Podsumowanie

Wstrzykiwanie zależości z Lazy potrawi zawiększyć wydajność aplikacji, poprzez nietworzenie obiektów, które nie są wykorzystywane. Dlatego warto korzystać z wstrzykiwania zależności z Lazy.

Zachęcam do zapoznania się z przykładem na github. Kod znajduje się w dwóch branch:

  • master – wersja bez Lazy
  • Lazy – wersja z Lazy

Kod zawiera też kilka różnych innych fajnych rzeczy, więc warto go pobrać i przejrzeć  🙂

2 thoughts on “Wstrzykiwanie zależności z Lazy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *