7

나는 모든 정적 메소드를 가진 클래스 AuthenticationManager를 가진 코드를 상속 받았다.의존성 주입을 사용하기 위해 정적 클래스를 어떻게 리팩토링합니까?

임 DI를 도입하고, 비 정적 변수는 정적 메서드에서 참조로 컴파일 타임 오류가 임 지금

UserController _userController; 

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

UserController

종속성을했다 생성자를 추가하고 싶었다. 이 클래스와 호출 코드에 대한 최소 변경 사항을 적용하려면이 방법을 사용하는 것이 좋습니다.

우리는 SimpleServiceLocator를 IOC 컨테이너로 사용하고 있습니다.

+0

[Simple Injector] (http://simpleinjector.codeplex.com)로 업그레이드하지 않겠습니까? Simple Service Locator 개발을 중단했습니다. – Steven

+0

팁 주셔서 감사합니다 - 나는 Simple Injector가 존재한다는 것을 몰랐다! Simple Injector는 내 질문에 대답하는 추가 기능을 제공합니까, 아니면 단지 좋은 일입니까? –

+0

질문에 대답하지 않지만 Simple Injector는 더 빠르고 깨끗하며 확장 기능을 추가로 지원합니다 (대부분의 고급 시나리오는 여기에서 설명합니다 (http://simpleinjector.codeplex.com/wikipage?title). = Advanced-scenario & referencedTitle = Documentation)은 SSL로 구현할 수 없습니다. 핵심 차이점 인 SSL [here] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87)을 읽을 수 있습니다. – Steven

답변

9

코드 전체에서 클래스가 사용되는 빈도에 따라 다릅니다. 인스턴스 메서드로 대체하려는 정적 메서드와 일치하는 메서드가 포함 된 IAuthenticationManager 인터페이스를 만드는 것이 좋습니다. 그런 다음 인터페이스를 구현하는 AuthenticationManager 클래스를 만들고 해당 생성자를 통해 UserController 종속성을 허용 할 수 있습니다.

그런 다음 모든 정적 메서드 호출 사이트를 인스턴스 메서드로 바꿔야합니다. 생성자 또는 속성을 통해 IAuthenticationManager을 클래스에 삽입하려고합니다. 필요한 경우 IAuthenticationManager을 호출 사이트의 매개 변수로 전달할 수도 있습니다.

불행히도 정적 메서드를 대체하는 것은 상당히 리팩토링을 필요로합니다. 그것은 노력의 가치가있다. 그것은 단위 테스트를위한 문을 엽니 다.

정적 메서드 중 하나의 인터페이스를 추출하여 한 번에 하나의 메서드를 리펙토링 할 수 있습니다. 한 번에 하나씩 각 메소드를 수행하여 리팩토링에 대한 단계별 접근 방식을 취하십시오. 즉, 각 메소드마다 고유 한 인터페이스가 제공됩니다.

Working Effectively With Legacy Code 수 있다면이 책을 살펴 보는 것이 좋습니다. 이 같은 모든 상황을 다루는 위대한 책.

관련 문제