2017-11-02 6 views
3

사과 전에이 질문에 대한 답변을 받았다면이 주제에 대한 검색을 통해 내 작업과 직접 관련이없는 다양한 주제로 이어질 수있었습니다.DI의 생성자에 대한 템플리트 리팩토링

현재 Ninject를 사용하여 생성자 삽입을 지원하기 위해 내부 코드베이스에서 많은 양의 생성자를 리팩터링하는 목표를 달성해야합니다. 현재, 우리는 게터 속성, 전 등 KernelInstance.Get<T>의 경우 많은 양의가 있습니다

IRequiredService => StaticKernelReference.Get<IRequiredService>(); 
StaticKernelReference는 Ninject에 StandardKernel의 정적 인스턴스 (I이뿐만 아니라 안티 패턴을 고려 알고에 대한 참조입니다

이 리팩토링은 Ninject 인스턴스에 대한 모든 정적 참조를 제거하는 목표 중 하나입니다.

명백히 반 패턴으로 간주되는이 접근 방식을 피하면서이 접근법을 이러한 접근 방식으로 리팩토링하고 싶습니다.

public class ClassWithDependencies { 
    readonly IRequiredSevice _requiredService; 
    public ClassWithDependencies(IRequiredService requiredService){ 
    _requiredService = requiredService; 
    } 
} 

제 질문은 정말 두 가지입니다. 그러나 두 가지 질문에 도움을 주시면 대단히 감사하겠습니다.

  1. 은 이러한 종속성의 생성자 주입을 할 수있는 이상적인 방법 제공하는 위의 예이다 (SO 및 다른 예를 나타내는 내 연구를하지만 잘못된 결론을 한 경우 I는 입력을 부탁드립니다). 나는이 접근법이 기존의 개선이라고 확신하지만, 이상적인 것이 아니라면이 특정 부분에 두 번째 리팩토링 패스를 할 필요가 없다. 대부분의 경우 이것들은 선택적인 의존성 (그리고 생성자 주입 패턴을 사용하는 이유)이 아니며 속성 주입을위한 [Inject] 데코레이터를 알고 있습니다.

  2. 나는 이와 같은 대규모 리팩터링을 염두에두고 있기 때문에 resharper로이 질문에 태그를 붙였다. 생성자 매개 변수를 추가하는 좋은 방법이 있습니까? 그리고 생성자의 읽기 전용 개인 변수에 대한 할당을 자동 생성하고 클래스에 필드를 추가하는 코드 스 니펫/템플릿이 있습니까? 이 작업을 수동으로 수행 할 수는 있지만,이 패턴을 적어도 수백 개 이상 사용하기 때문에 매우 지루하고 시간이 많이 걸릴 것으로 예상됩니다.

+1

오른쪽 방향으로 단계. 파트 1에 답하기위한 몇 가지 독서 : http://deviq.com/explicit-dependencies-principle/ 2 부는 현재 부름을 받고있는 기술 부채의 결과입니다. – Nkosi

+0

개선 된 점을 듣고 기쁘게 생각합니다. 지루한 리팩터링 없이는이 문제를 해결할 방법이 없습니다. 의견을 보내 주셔서 감사합니다. – Miek

답변

3
  1. 예이 방법은 괜찮습니다. 생성자에 필요한 종속성을 주입하면이를 명시 적으로 볼 수 있습니다. 이제는 클래스의 종속성을 파악하기 위해 소스 코드를 검사하는 것 외에 다른 선택의 여지가 없습니다. 그들은 더 이상 경우가 아닌 생성자에 주입됩니다.

  2. 신속하게 현재 코드를 수정하려면 다음을 수행하십시오.

    IRequiredService SomeService => StaticKernelReference.Get<IRequiredService>(); 
    

    먼저 이름 뒤에 모든 물건을 삭제 :

    IRequiredService SomeService; 
    

    재산 private 필드 만들 것입니다 당신이 코드 라인을 가지고있다. 그런 다음 Alt 키를 누른 상태에서 "생성자에서 필드 초기화"리팩토링을 사용하십시오. 그런 다음이 있습니다 :

    IRequiredService Service; 
    public A(IRequiredService service) { 
        Service = service; 
    } 
    

    그런 다음 계속 다시 입력 Alt 키와 "읽기 전용 필드를 만들"(당신이 당신의 private 필드의 이름을 방법에 따라 달라집니다) "_service에 이름 바꾸기"고도를 입력합니다.

    readonly IRequiredService _service; 
    public A(IRequiredService service) { 
        _service = service; 
    } 
    
+0

환상적입니다. 파트 2에 대한 귀하의 대답은 정확하게 제가 기대했던 것입니다. 이것은 막 나에게 수동 노력의 톤을 저장 하고이 과정을 조금 덜 고통스러운해야합니다, 감사합니다! 접근 방식을 듣는 것이 좋기 때문에 적절합니다. 당신의 대답은 많이 감사합니다. – Miek