문제

(로부터 StockTraderRibootStrapper.cs Prism V2 Stocktrader 예제 앱의 파일)

이것의 차이점은 무엇입니까?

ShellPresenter presenter = new ShellPresenter();

이:

ShellPresenter presenter = Container.Resolve<ShellPresenter>();
  • 두 번째 예는 컨테이너를 공장처럼 취급하는 것임을 이해합니다.
  • 그러나 예를 들어 매개 변수를 보내야한다면 "새로운 쉘 프리 센터 (1, true) 등과 동등한 것은 무엇입니까?
  • 그리고 컨테이너는 Shellpresenter에 대해 이야기해야하기 때문에 프로젝트 어딘가에 컨테이너에 등록 된 Shellpresenter 클래스가 예를 들어있는 곳을 찾을 것으로 예상했습니다.

이 같은:

Container.RegisterType<IShellPresenter, ShellPresenter>();

그러나 어디에도 발견되지 않았습니다. 그렇다면 컨테이너는 이러한 유형에 대해 어떻게 알게되므로. 자체 프로젝트에서 이것을 재건하고 "종속성 실패의 해결"오류를 얻습니다.,이 종속성을 어디에 등록해야합니까?

여기서 모든 방향/토론이 도움이 될 것입니다.

설명 할 수없는 답변 :

따라서 부트 스트랩퍼에서 쉘 자체를 등록 할 때 :

protected override void ConfigureContainer()
{
    Container.RegisterType<IShellView, Shell>();
    base.ConfigureContainer();
}

그런 다음 컨테이너가 쉘 프레 센터 유형을 해결할 수 있습니다. 그래서 어때요 쉘 프리 센터 등록 할 때 등록 된 유형 껍데기 유형?

놀라운 답변 :

좋아, 그래서 당신은 당신이 해결하려는 유형을 등록 할 필요가 없지만 당신은 당신이 해결하려는 유형의 생성자에게 전달 된 매개 변수 (인터페이스) 유형을 등록해야합니다., 즉, Ishellview 인터페이스를 Shellpresenter의 생성자에 주입하기 때문에 iShellPresenter 유형이 아닌 iShellview 유형을 등록해야했습니다.

public ShellPresenter(IShellView view) ...

유형을 해결하려고 노력하여 이것을 테스트했습니다 시험 장치:

Tester tester = Container.Resolve<Tester>();

내가 주입하는 한 SOMECLASS 생성자로 :

public Tester(ISomeClass someClass)

등록 할 때까지 해결되지 않은 종속성 오류가 발생합니다 SOMECLASS 컨테이너와 함께 :

Container.RegisterType<ISomeClass, SomeClass>();

그런 다음 작동합니다. 이것은 교육만큼 놀라운 일입니다. 가라 앉을 필요가 있습니다. 나는 커피를 마시고 잠시 동안 이것에 대해 생각할 것입니다.

누군가가 왜 그런지에 대해 자세히 설명 할 수 있다면, 그것은 대단히 감사 할 것입니다.

도움이 되었습니까?

해결책

당신은 기본 사항을 이해합니다.

생성자 인수가 필요한 유형을 해결하기위한 과부하가 있습니다. 또는 파라미터가없는 생성자가 있도록 항상 유형을 코딩 할 수 있습니다.

DI 컨테이너의 점은 소프트웨어를 다시 컴파일하지 않고 특정 인터페이스에 대해 해결되는 유형을 변경하도록 구성 할 수 있다는 것입니다. 공급자 구성을 위해 제공 한 코드 예제는 런타임에 변경할 수 없습니다. 그렇기 때문에 대부분의 종속성 인젝터를 사용하면 app.config/web.config/기타 외부 구성 파일에서 구성 할 수 있습니다. 이렇게하면 앱을 재구성하여 다시 컴파일하지 않고 다른 유형을 주입 할 수 있습니다. 이는 Unity와 같은 DI 프레임 워크의 진정한 힘입니다.

다른 팁

콘크리트 클래스를 해결하려고 시도하고이를 만족시키기 위해 인스턴스 또는 하위 클래스를 등록하지 않은 경우 Unity는 귀하를 위해 콘크리트 클래스의 인스턴스를 구성하여 그 의존성을 해결합니다.

따라서 ShellPresenter를 요청하고 등록하지 않았을 때 Unity는 Shellview를 매개 변수로 사용하여 New를 Up Up a ShellPresenter입니다.

글쎄, 나는 Untiy에 대해 대답 할 수 없지만 Castle Windsor의 경우 등록이 app.config/web.config 파일에있을 수 있습니다. 구성 XML에 매개 변수를 추가 할 수있는 기능도 있습니다.

이를 통해 응용 프로그램을 다시 컴파일하지 않고 객체의 구현 및 구성을 변경할 수 있습니다.

단일성에는 실제로 a가 있습니다 Container.RegisterType<TFrom, TTo>() 런타임에 유형을 등록하는 메소드 세트. XML 구성 파일을 사용하여 수행하는 것이 더 일반적이지만 어느 쪽이든 작동합니다.

흥미롭게도, 연합에는 없다 Container.Resolve<T>(params object[] parameters) -특정 생성자 파라미터 값을 갖는 유형을 해결하는 유형 메소드. Unity는 ObjectBuilder 위에 구축되어 객체 구성 및 Wireup을 수행하기위한 P & P 팀 라이브러리입니다 (IIRC는 원래 ObjectSpaces 용으로 작성되었지만 현재 크게 향상되었습니다). ObjectBuilder는 생성자를 포함하여 다양한 방식으로 종속성을 주입 할 수있는 기능을 제공하므로, 예를 들어, 분해 된 유형의 생성자에 의존하는 유형의 새 인스턴스를 전달할 수 있다고 말할 수 있습니다. 그러나 그 유형도 등록해야합니다. 등록 된 유형 (등록 된 인스턴스 / 싱글 톤 등)의 인스턴스를 전달할 수도 있습니다. 그러나 afaics는 단순히 그것을 통과 할 가치를 줄 방법이 없습니다.

나는 그렇게하는 것이 어느 정도까지 IOC의 철학에 위배 될 것이라고 생각합니다. 그래서 그들은 그 시설을 제공하지 않는 이유입니다. 컨테이너는 이론적으로 주어진 상황에서 완전한 객체 그래프를 제공 할 수 있어야하므로 매개 변수를 전달할 필요가 없으며 객체를 주입 가능한 객체 종속성 이외의 생성자 매개 변수에 의존 할 필요가 없습니다 (컨테이너가 해결합니다. 당신을 위해)는 나쁜 디자인으로 여겨집니다.

나는 Windsor, StructureMap 또는 다른 사람들에 대해 말할 수 없으며,이를 통해이를 수행 할 수 있습니다. 나는 Unity가 합리적으로 새로운 이후로 할 수있는 방법이 없다고 범주 적으로 말할 수는 없지만, 기본적으로 Unity를 기본적으로 지은 IIRC Chris Tavares는 때때로 여기서 어울릴 것입니다. 이것에 대답하십시오 :-)

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