Kontener IoC jest zwykle przydatny do wstrzykiwania obiektu ze stanem; lub klas lub interfejsów, które mają więcej niż jedną implementację, nawet jeśli druga implementacja jest próbna do celów testowych. Jeśli żadna z nich nie jest prawdziwa, nic nie zyskujesz poprzez wstrzyknięcie.Najczęstszym idiomem w dzisiejszych czasach jest poprowadzenie twojej klasy przez interfejs, który zarówno realna, jak i fałszywa implementacja może zaimplementować.
1) Metody statyczne dla klas pomocniczych - Nie, te często nie są wstrzykiwane przez IoC. Zazwyczaj są to bezpaństwowe narzędzia.
Aby użyć bardzo prostego przykładu, nie potrzebujesz dwóch wersji narzędzia o nazwie StringUtils.Reverse()
. Potrzebujesz tylko jednego i możesz łatwo pisać testy wokół niego, ponieważ nie ma on stanu lub zależności, więc nie ma absolutnie żadnej korzyści z kpiny z niego. Przykład testu:
string reversedString = StringUtils.Reverse("input");
Assert.AreEqual("tupni", reversedString)
Jeśli narzędzie nie jest tak naprawdę bezpaństwowcem (np zależy HttpContext.Current), wówczas należy dokonać zależność wyraźny przez wstrzykiwanie go, a nie czyni narzędzie statyczne.
2) Singletons: Często tak, wstrzykiwane są pojedynczo. Ale dobrą rzeczą w IoC jest to, że mniej martwisz się o to, czy jest tylko jedno z czegoś, czy nie. Zyskasz elastyczność w instancji za pomocą IoC. Decyzja o tym, że dany typ jest pojedyncza lub nowa, za każdym razem staje się częścią konfiguracji kontenera IoC i nic więcej w kodzie nie musi się zmieniać.
Tak więc singleton-stop przestaje być osobnym problemem, który musi zostać zakodowany w klasie (a klasy mające wiele obaw, gdy nie muszą, są złe) i stają się przedmiotem kontentu IoC. Nie kodujesz klasy "jako singleton" z niczym specjalnym jak prywatny konstruktor i metodą public static GetInstance()
, po prostu kodujesz ją dla głównego problemu, podczas gdy konfiguracja kontenera IoC określa, czy jest to singleton czy nie, czy gdzieś pomiędzy, jak jedna instancja na wątek.
3) Klasy statyczne - są naturalnym domem dla metod statycznych. Rozważ zastosowanie metod rozszerzania metod statycznych w stosownych przypadkach. Nie możesz wstrzykiwać tych klas, ponieważ nie możesz ich utworzyć. Używanie klas statycznych powoduje, że kod proceduralny nie jest obiektowy. Nie jest to zła rzecz dla małych metod pomocniczych, ale jeśli większość kodu jest taka, to nie korzystasz z potężnych funkcji OO platformy .Net.
dzięki Bryan - Czy to oznacza, że może zaistnieć więcej problemów związanych z konstruowaniem przez IOC rzeczy (np. Rejestratora) za każdym razem? Również dla klas typu utils, zastanawiam się czy to spowoduje, że refaktoryzacja stanie się trudniejsza, gdy będziesz refaktoryzować swoje funkcje pomocnicze wśród swoich klas pomocniczych? (Używam sam ReSharper) - dziękuję – Greg
Większość kontenerów IoC pozwala na pewien zakres. Rozumiem przez to, czy wskazujesz, czy obiekt jest tworzony za każdym razem (fabryka), tworzony raz na kontekst (jednostka pracy), lub raz na aplikację (singleton). Oznacza to, że można zarejestrować rejestrator tak, aby był tworzony tylko jeden raz. –
Ostatecznie chcesz wyeliminować klasy narzędziowe. Każda metoda na każdej z tych klas ma takie same problemy z sprzężeniem, jak powyższa metoda 'HttpUtils.DoStuff'. Z tego powodu nie chcesz wymagać, aby * dowolny * kod zależał bezpośrednio od "statycznych" członków. Zamiast tego, weź treść 'HttpUtils.DoStuff', umieść ją za' IDoesStuff' i usuń metodę całkowicie z 'HttpUtils'. Teraz każda klasa, która mogła nazwać metodę statyczną, może zamiast tego zaakceptować 'IDoesStuff' w swoim konstruktorze. Viola: nie ma potrzeby używania klasy narzędziowej! –