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<GamerService>().As<IGamerService>();<br> builder.RegisterType<GamerRepository>().As<IGamerRepository>();<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.
Z ciekawości: co sprawiło, że wybrałaś Autofac a nie np. Ninject?
PolubieniePolubienie
Wybrałam Autofac z polecenia. Z tego co słyszałam Ninject jest bardziej popularny, ale mniej wydajny.
PolubieniePolubienie
Dołączam opis testów potwierdzających taką opinię http://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison
PolubieniePolubione przez 1 osoba