Как вы реорганизуете статические классы, чтобы использовать внедрение зависимостей? - PullRequest
7 голосов
/ 23 декабря 2011

Я унаследовал некоторый код, который имеет класс AuthenticationManager со всеми статическими методами.

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

UserController _userController;

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

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

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

1 Ответ

9 голосов
/ 23 декабря 2011

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

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

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

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

Я бы порекомендовал взглянуть на эту книгу, если вы можете:1014 * Эффективно работает с устаревшим кодом .Отличная книга, которая охватывает все подобные ситуации.

...