7

Odziedziczyłem kod, który ma klasę AuthenticationManager ze wszystkimi statycznymi metodami.W jaki sposób można refaktoryzować klasy statyczne w celu użycia iniekcji zależności?

Im wprowadzenie DI i chciał dodać konstruktora, które miały zależność UserController

UserController _userController; 

public AuthenticationManager(UserController userCont) 
{ 
    _userController = userCont; 
} 

Teraz Im uzyskiwanie błąd czasu kompilacji jako zmienna niestatyczny odwołuje z metody statycznej. Jaka byłaby Twoja rekomendacja najlepszej praktyki, aby to zadziałało z minimalnymi zmianami tej klasy i kodu wywołującego?

Używamy SimpleServiceLocator jako kontenera IOC.

+0

Czy nie czas na uaktualnienie do [Simple Injector] (http://simpleinjector.codeplex.com)? Przestałem tworzyć prostego lokalizatora usług. – Steven

+0

Dzięki za cynk - nie wiedziałem, że istnieje Simple Injector! Czy Simple Injector zapewnia dodatkową funkcjonalność, która rozwiązuje moje pytanie, czy jest to po prostu dobra rzecz? –

+0

To nie odpowiada na twoje pytanie, ale Simple Injector jest szybszy, czystszy i ma znacznie lepszą obsługę dodawania rozszerzeń (większość opisanych tutaj zaawansowanych scenariuszy [tutaj] (http://simpleinjector.codeplex.com/wikipage?title = Advanced-scenarios & referringTitle = Documentation) nie są możliwe do wdrożenia z SSL). Możesz przeczytać o podstawowych różnicach SI SSL [tutaj] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87). – Steven

Odpowiedz

9

To zależy od tego, jak często klasa jest używana w całym kodzie. Prawdopodobnie będziesz chciał utworzyć interfejs IAuthenticationManager, który zawiera metody, które pasują do metod statycznych, które chcesz zastąpić metodami instancji. Następnie można utworzyć klasę AuthenticationManager implementującą interfejs i akceptującą zależność UserController za pośrednictwem jej konstruktora.

Następnie należy zastąpić wszystkie statyczne metody wywoływania metodami instancji. Prawdopodobnie będziesz chciał wprowadzić IAuthenticationManager do klas za pośrednictwem konstruktora lub właściwości. Jeśli zajdzie taka potrzeba, można również przekazać IAuthenticationManager do metod (w witrynach wywołań) jako parametr.

Niestety zastąpienie metod statycznych wymaga sporo refaktoryzacji. Warto jednak. Otwiera drzwi do testów jednostkowych.

Należy pamiętać, że zawsze można refaktoryzować jedną metodę naraz, wyodrębniając interfejs dla jednej ze statycznych metod. Wykonuj każdą metodę pojedynczo, aby zastosować stopniowe podejście do refaktoryzacji (innymi słowy, każda metoda otrzymuje swój własny interfejs).

Polecam, patrząc na tę książkę, jeśli możesz: Working Effectively With Legacy Code. Świetna książka, która obejmuje wszystkie sytuacje, takie jak ta.