Refactoring: Dependency Injection

Nowy rok przyszedł, czas na porządki w kodzie aplikacji BoardGamesNook. Dostałam cenne uwagi dotyczące jakości kodu od pewnego znajomego Seniora. Dzisiaj skupię się na Dependency Injection (DI), czyli wstrzykiwanie zależności.

Wstrzykiwanie zależności

W skrócie: w każdym kontrolerze (i serwisie), zamiast korzystać z DI i wstrzykiwać obiekt interfejsu danego serwisu, tworzyłam nową instancję danego serwisu. Wyglądało to tak:

<br>
public class GamerController : Controller<br>
{<br>
   private readonly GamerService _gamerService = new GamerService(new GamerRepository());<br>
}<br>

zamiast

<br>
public class GamerController : Controller<br>
{<br>
    private readonly IGamerService _gamerService;<br>
public GamerController(IGamerService gamerService)<br>
    {<br>
        _gamerService = gamerService;<br>
    }<br>
}<br>

Odwrócenie zależności

Miałam wcześniej zdefiniowane interfejsy do każdego z serwisów – ale nie korzystałam z nich. Teraz dopiero okazały się przydatne – do odwrócenia sterowania (Inversion of Control, IoC). Jak pisał Paweł Łukasiewicz na swoim blogu:

„Jest to mechanizm, dzięki któremu moduły wyższego poziomu mogą zależeć od abstrakcji, a nie od konkretnej implementacji modułu niższego poziomu”.

W moim przypadku zamiast korzystać z serwisu GamerService, korzystam z interfejsu IGamerService.

Autofac

Dodatkowa rzecz, o której nie można zapomnieć, to skorzystanie z biblioteki, która umożliwia wstrzykiwanie zależności. Ja wybrałam Autofac. Musiałam odpowiednio zaktualizować metodę Application_Start() w pliku Global.asax.cs.

<br>
var builder = new ContainerBuilder();<br>
//register all services and repositories<br>
builder.RegisterType&lt;GamerService&gt;().As&lt;IGamerService&gt;();<br>
builder.RegisterType&lt;GamerRepository&gt;().As&lt;IGamerRepository&gt;();<br>
var container = builder.Build();<br>
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));<br>

Warto upewnić się, czy na pewno wszystkie typy zostały zarejestrowane, ponieważ w przeciwnym przypadku zobaczycie w przeglądarce błąd.

Cannot resolve parameter of constructor ‚Void .ctor’.

Przy okazji wstrzykiwania zależności dodatkowo zauważyłam, że 2 serwisy w ogóle nie były używane.

To był pierwszy krok do poprawy aplikacji. W przyszłości opiszę kolejne, np. skorzystanie z AutoMappera oraz Moq.


Podoba Ci się to, co tworzę? Chcesz dostawać informacje o:
– wydarzeniach, które organizuję lub wspieram (np. konferencje, meetupy, webinary)
– inicjatywach, które organizuję lub wspieram (np. GeekWeekWro, DevAdventCalendar)
– moich prelekcjach, kursach i szkoleniach
– wyróżnionych artykułach z mojego bloga

0% SPAMu, 100% informacji! Krótko i na temat.

3 uwagi do wpisu “Refactoring: Dependency Injection

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s