BoardGamesNook · C# · Programowanie

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:

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

zamiast

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

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.

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

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.

3 myśli na temat “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 Google+

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

Zdjęcie z Twittera

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

Zdjęcie na Facebooku

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

Connecting to %s