문제

의존성 주입은 좋은 것 같습니다. 일반적으로 종속성을 요구하는 방법에 주입되어야합니까, 아니면 클래스의 회의자에 주입되어야합니까?

동일한 종속성을 주입하는 두 가지 방법을 보여 주려면 아래 샘플을 참조하십시오.

//Inject the dependency into the methods that require ImportantClass
Class Something {

    public Something()
    {
         //empty
    }

    public void A() 
    {
         //do something without x
    }

    public void B(ImportantClass x)
    {
         //do something with x
    }

    public void C(ImportantClass x)
    {
         //do something with x
    }
}

//Inject the dependency into the constructor once
Class Something {
    private ImportantClass _x
    public Something(ImportantClass x)
    {
         this._x = x;
    }

    public void A() 
    {
         //do something without x
    }

    public void B()
    {
         //do something with this._x
    }

    public void C()
    {
         //do something with this._x
    }

}
도움이 되었습니까?

해결책

생성자 주입의 주요 이점은 필드를 최종적으로 표시 할 수 있다는 것입니다. 예를 들어:

class Foo {
    private final Bar _bar;

    Foo(Bar bar) {
        _bar=bar;
    }
}

다음 페이지에는 Pro와 Con의 훌륭한 목록이 있습니다. 모범 사례:

방법 주입

  • +는 현장 주입이 아닙니다
  • + 이상한 가장자리 케이스에 적합한 유일한 것

생성자 주입

  • + 필드는 최종적 일 수 있습니다!
  • + 주입은 건너 뛸 수 없었습니다
  • + 한 눈에 의존성을 쉽게 볼 수 있습니다
  • + 건축 아이디어가 전부입니다.
  • - 선택적 주사가 없습니다
  • - DI 라이브러리가 인스턴스화를 할 수없는 경우 쓸모가 없습니다
  • - 서브 클래스는 슈퍼 클래스에 필요한 주입을 "알아야"해야합니다.
  • - 매개 변수 중 하나에만 "관리"하는 테스트에 덜 편리합니다.

다른 팁

각 메소드에서 종속성을 주입하지 않으면 각 발신자가 종속성을 알거나 검색하도록합니다.

또한 툴링 관점에서 생성자 주입을 훨씬 쉽게 수행하거나 쉽게 수행 할 수있는 많은 프레임 워크 (적어도 .NET에서)가 있습니다. 이것은 결정을 흔들지 않아야하지만 훨씬 더 매력적입니다.

행운을 빕니다.

방법 중에 주사하는 경우 콘크리트 의존성과 동작 추상화를 구별하지 않는 것보다. 이것은 큰 아니오 :). 당신은 추상화에 의존하여 클래스 종속성의 종속성과 결합되지 않습니다. . .

당신의 생성자는 당신의 콘크리트 클래스가 당신이 해당 의존성과 결합하지 않는 것보다 당신의 콘크리트 클래스를 지원하는 어떤 인터페이스에도 존재하지 않기 때문에. 그러나 방법 호출에는 해당 문제가 있습니다.

다음은이 기술에 대한 좋은 기사입니다.

http://chrisdonnan.com/blog/2007/05/20/conquest-through-extreme-composition-glue-part-2/

또 다른 방법은 종속성을위한 세터를 사용하는 것입니다. 때때로 이것은 생성자 주입과 결합됩니다. 인스턴스를 재현하지 않고 나중에 사용중인 구현을 변경하려는 경우 유용 할 수 있습니다.

public interface IFoo
{
   void Do();
}

public class DefaultFoo : IFoo
{
   public void Do()
   {
   }
}

public class UsesFoo
{
   private IFoo foo;
   public IFoo Foo
   {
       set { this.foo = value; }
   }

   public UsesFoo()
   {
      this.Foo = new DefaultFoo();
   }

   public UsesFoo( IFoo foo )
   {
      this.Foo = foo;
   }

   public void DoFoo()
   {
      this.Foo.Do();
   }
}

미친 밥 리 가능할 때마다 생성자 주입을 사용한다고 말합니다. 인스턴스화를 제어 할 수없는 경우에만 메소드 주입을 사용하십시오 (서블릿에서와 같이).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top