Mam interfejs o nazwie IContext
. W tym celu tak naprawdę nie ma znaczenia, co robi, oprócz następujących czynności:
T GetService<T>();
Metoda ta polega na sprawdzeniu bieżącego kontenera DI aplikacji i próbie rozwiązania zależności. Myślę, że dość standardowy.
W mojej aplikacji ASP.NET MVC mój konstruktor wygląda tak.
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
Więc zamiast dodawania wielu parametrów konstruktora dla każdej usługi (bo to będzie naprawdę denerwujące i czasochłonne dla programistów Rozszerzenie stosowania) Używam tej metody, aby uzyskać usług.
Teraz jest źle . Jednak w tej chwili usprawiedliwiam to w mojej głowie - mogę to wyśmiewać .
Mogę. IContext
Testowanie kontrolera nie będzie trudne . W każdym razie musiałbym:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
Ale jak powiedziałem, wydaje się to złe. Wszelkie myśli / nadużycia są mile widziane.
public SomeClass(Context c)
. Ten kod jest dość jasny, prawda? To stwierdza, that SomeClass
zależy od Context
. Err, ale czekaj, to nie! Zależy tylko od zależności, X
którą uzyskuje z kontekstu. Oznacza to, że za każdym razem, gdy wprowadzasz zmiany Context
, może się zepsuć SomeObject
, nawet jeśli zmieniłeś tylko Context
s Y
. Ale tak, wiesz, że tylko zmienione Y
nie X
, więc SomeClass
jest w porządku. Ale pisanie dobrego kodu nie polega na tym , co wiesz, ale na tym, co nowy pracownik wie, kiedy patrzy na twój kod po raz pierwszy.