7

Я унаследовал некоторый код, который имеет класс AuthenticationManager со всеми статическими методами.Как вы используете рефакторинг статических классов для использования инъекции зависимостей?

Im вводя DI и хотел бы добавить конструктор, который взял зависимость UserController

UserController _userController; 

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

Теперь я получаю ошибку компиляции время как нестатическая переменная ссылается из статического метода. Какова была бы рекомендация вашей лучшей практики, чтобы заставить ее работать с минимальными изменениями этого класса и вызывающего кода?

Мы используем SimpleServiceLocator как контейнер IOC.

+0

Не пора ли обновиться до [Простой инжектор] (http://simpleinjector.codeplex.com)? Я прекратил разработку Simple Service Locator. – Steven

+0

Спасибо за подсказку - я не знал, что Simple Injector существует! Простой инжектор предоставляет дополнительную функциональность, которая затрагивает мой вопрос, или это просто хорошая вещь? –

+0

Он не затрагивает ваш вопрос, но простой инжектор работает быстрее, чище и имеет гораздо лучшую поддержку для добавления расширений (большинство описанных выше сценариев [здесь] (http://simpleinjector.codeplex.com/wikipage?title = Advanced-scenarios & referringTitle = Documentation) невозможно реализовать с помощью SSL). Вы можете прочитать о основных отличиях SI SSL (здесь) (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87). – Steven

ответ

9

Ну, это зависит от того, как часто класс используется во всем коде. Вероятно, вы захотите создать интерфейс IAuthenticationManager, который включает методы, которые соответствуют статическим методам, которые вы хотите заменить методами экземпляра. Затем вы можете создать класс AuthenticationManager, который реализует интерфейс, и принимает зависимость UserController через свой конструктор.

Затем вам необходимо будет заменить все статические методы-вызовы методами экземпляра. Вероятно, вы захотите ввести классы IAuthenticationManager в классы через конструктор или свойство. В случае необходимости вы также можете передать IAuthenticationManager методам (на сайтах) в качестве параметра.

К сожалению, замена статических методов требует довольно много рефакторинга. Это стоит усилий, хотя. Он открывает дверь для модульного тестирования.

Помните, что вы всегда можете реорганизовать один метод за раз, извлекая интерфейс для одного из статических методов. Сделайте каждый метод по одному, чтобы поэтапно подходить к вашему рефакторингу (другими словами, каждый метод получает свой собственный интерфейс).

Я бы порекомендовал взглянуть на эту книгу, если вы можете: Working Effectively With Legacy Code. Отличная книга, охватывающая всевозможные ситуации, подобные этой.