48
나는 새로운 웹 응용 프로그램에 Ninject에 사용하고

나에게 불분명 한 두 가지가 있습니다 :NInject : 커널에 대한 참고는 어디에 보관합니까?

  1. I가 커널 주변 (세션/응용 프로그램 변수)에 대한 참조를 보관할 필요가없는이 GC가 모든 인스턴스를 수집하지 않도록 보장 하시겠습니까? 예를 들어, .Using()을 지정하고 Kernel 객체가 수집되면 내 "싱글 톤"도 모두 수집되지는 않습니까?

  2. 커널 개체에 대한 참조를 유지해야하는 경우 WithArguments()에 전달 된 인수를 변경하거나 허용 할 수 없게하려면 어떻게해야합니까?

답변

15

이것은 IoC 컨테이너를 사용하기 시작할 때 일반적인 함정입니다. this related question을 참조하십시오. 간단히 말해서

: 당신이 정말 직접 컨테이너를 invocate해야하는 경우 먼저 추출 고려,
    • 그건 나쁜 관행 (즉, 수행, 거기, 그것은 정말 아프다) 주위에 당신의 용기를 전달하는 주입 된 공장에 마지막으로 자원으로 사용할 때 컨테이너에 대한 정적 게이트웨이 사용을 고려하십시오.
  • +0

    컨테이너를 전달하고 싶지 않지만 Application 변수에 숨길 수 있습니까? 내 문제는 내가 새로운 StandardKernel (새로운 CustomModule())을 할 때마다 나는 모든 것의 새로운 인스턴스를 얻는다는 것이다. –

    +0

    앱당 하나의 StandardKernel 만 있으면됩니다. 여러 모듈을로드해야하는 경우 kernel.Load (new MyModule()); kernel.Load (new AnotherModule()); etc –

    +0

    좋습니다. 내가해야 할 일은 WithArguments()에서 인수를 변경할 때마다 형식을 요청할 때마다 ...이 작업을 수행 할 수있는 방법이 있습니까? 궁극적으로 내가하려고하는 것은 OnePerSessionBehavior를 구현하고 바인딩이 각 세션에 대한 현재 인수를 주입하기를 원합니다. –

    29

    커널을 지나가고 싶지는 않습니다. 일반적으로 웹 응용 프로그램에서는 HttpApplication의 정적 속성에 커널을 저장합니다. 커널에 대한 참조가 필요한 경우 IKernel 유형의 종속성 (생성자 인수 또는 특성을 통해)을 노출 할 수 있으며 Ninject는 유형을 활성화 한 커널에 대한 참조를 제공합니다.

    바인딩에서 WithArguments()를 사용하면 모든 활성화에 사용됩니다. IParameters를 사용하면 해당 활성화에 대해서만 사용됩니다. (그러나 활성화중인 서비스가 Singleton과 같이 재사용 가능한 동작을하는 경우 다른 IParameter를 전달하더라도 다시 활성화되지 않습니다.)

    +0

    정확히 내가 원하는 것 같은데 ...이 코드를 게시 할 수 있습니까? –

    +0

    @Nate : 완전히 관련이 없지만 CommonServiceLocator 어댑터에 대한 ETA가 있습니까?ninject2에 대한 실험 지점에 어댑터가있는 것을 볼 수 있습니다 ... –

    +0

    안녕하세요 @ 네이트, 당신은 소스 코드를 게시 할 수 있습니까? –

    -4

    Mark Seeman - 작성자 Manning Dependency Injection Suggust to Use 할리우드 원칙 전화하지 마라. (IOC 프레임 워크) 우리는 당신에게 전화 할 것이다. .. IOC 컨테이너는 응용 프로그램의 Composition root에 위치해야하며, 요청한대로 인스턴스화해야한다.

    .. 웹 응용 프로그램의 경우 Composition root는 Global.asax 파일이며 여기서 u는 시작 이벤트를 재정의 할 수 있습니다. 거기에서 구성 요소를 해결하기 위해 Ninject를 바인딩 할 수 있습니다.

    +0

    -1. 주로 대답이 너무 희미하고 모호한 표현으로되어 있기 때문입니다. 또한 _ "요청에 따라 인스턴스화해야합니다"_라는 부분은 실제로 어떤 것을 의미 할 수도 있고 지침으로 도움이되지 않을 수도 있습니다. 즉, 나는 "할리우드 원칙"에 대해 말한 내용과 DI 컨테이너에서 직접 가져와야하는 구성 루트 만 지원할 것이라고 확신합니다. – stakx

    +0

    이 답변은 링크의 내용을 반복하기 때문에 도움이되지 않습니다. Composition Root가 무엇인지 말하지 않았으므로 'IOC Container'라는 단어를 건너 가서 'Composition Root'라고 쓰면 같은 질문이됩니다 ... –

    관련 문제