2009-07-24 7 views
5

Mam BaseController, którego używam do przechowywania moich zagadnień przekrojowych dla projektu MVC.asp.net mvc z ioc -> unikanie zupy konstruktorów z BaseController

Oznacza to jednak, że moja Kontroler posiada 3 zależnościami:

public BaseController (IUserService u, ITenantDetailsService t, ISiteConfiguration c) 

Efektem ubocznym jest to, że moi konstruktorów dla każdego sterownika pochodzącego są zalany parametrach:

public AccountController(ILocationService locationService, IAccountService accountService, IFormsAuthentication formsAuth, IMembershipService service, IUserService userService, ISiteConfiguration configuration) 
     : base(locationService,userService, configuration) 

jestem za pomocą IoC (Windsor), aby rozwiązać moje kontrolery, więc wiem, że mógłbym usunąć zależności konstruktora i pozwolić mu automatycznie połączyć właściwości publiczne.

Czy istnieje powód, aby nie robić tego innego niż maskowanie niektórych zależności?

public AccountController (IAccountService, IFormsAuthentication, IMembershipService) 

Podejście to wydaje się bardziej czytelne i daje jasny obraz zależności zależnych od tego konkretnego kontrolera.

Czy mam to wszystko źle i BaseController nie jest właściwym miejscem do przechowywania usług cięcia krzyżowego.

Myśli docenione.

Dzięki, Chris

Odpowiedz

1

Jednym z powodów mogę myśleć jest konwencja - wiele osób interpretuje seter zastrzyk jako nie wymagane uzależnienia i iniekcji konstruktora w miarę potrzeb. Mimo to - jest to tylko konwencja i nie powstrzymałby mnie przed wykorzystaniem w tym przykładzie właściwości autoprzewodowych.

Wstrzyknięcie zależności ma na celu uproszczenie pracy (przyznaję, że nie jest to najważniejszy powód używania DI, ale uważam, że jest to uzasadniony powód), nie utrudniajcie tego. Zastanów się, kiedy musisz dodać kolejną usługę "globalną". Musiałbyś przejść przez każdy kontroler w swoim projekcie i zmodyfikować konstruktora, który jest naprawdę, bardzo zły.

Wpadłem na inny pomysł, aby rozwiązać ten problem: stwórz obiekt kolekcjonerski, który przechowuje wszystkie "globalne" zależności, przekazuje je do konkretnych kontrolerów, a następnie przekazuje do bazy, która wymagałaby wymaganych zależności. Rozwiązałoby to problem z dodawaniem zależności i wyraźnie stwierdziłbyś, że konkretny kontroler przekazuje zależności do klasy bazowej. Nie podobało mi się to jednak, ponieważ nadal wymaga 2 klasy do zmiany ("Collector zależności" i BaseController), gdy dodaję nową, "globalną" zależność.

+0

Bardzo podoba mi się twoje podejście, ponieważ posiadanie jednej zależności jasno pokazuje, że magia nie jest po prostu wydarzeniem. – Chris