2013-08-13 5 views
3

내가 지금 몇 주 ...이 함께 켜고 내 머리를 건 드리는있다가 내가 currenlty있는 것은 이것이다 : *Service 클래스 Ninject : TransientScope에서 부모 개체를 SingletonScope에, 자식 개체를 가질 수 있습니까?

  • 이 모든 한 무리의 다른 *Repository 클래스에 따라
    • EF를 통해 해당 데이터베이스에 액세스하십시오.
    • 단위 테스트를 허용하려면 DbContext의 파생어가 리포지토리에 주입되어야합니다. (그래서이 상황을 처리하는 using을 사용할 수 없습니다)

    이 제대로 나는 InRequestScope() 또는 간단한 사용자 지정 범위 내 종속성 트리를 실행할 수 주입 된 EF 컨텍스트 처분 - InScope(c => new object()) 최상위 수준에와 다른 모든 수준에서는 InParentScope()입니다.

    이러한 두 가지 방법 모두 요청할 때마다 많은 개체를 만들고 처리 할 수 ​​있습니다. 또한 우리는 하나의 페이지 응용 프로그램에 대해 이야기하므로 쿼리의 95 % (50 개 정도)가 2 요청 중에 실행되므로 InRequestScope()은 좋은 생각이 아닌 것 같습니다. 또한 *Service 클래스는 상태를 유지하지 않으므로 InSingletonScope() 일 수 있으며 개체 생성량을 최소화 할 수 있습니다.

    [질문

    InSingletonScope()에 부모 *Service*Repository 수업을 어떻게 든 새로운 인스턴스가 액세스 할 때마다를 반환하고해서 Ninject를 사용하여 IDisposable을 존중하는 범위에서 EF DbContext를 주입 할 수 있습니까?

    개체가 생성되는 동안 종속성이 주입되지만 여전히 어떻게 든 관리 될 수 있다는 것을 알고 있습니까?

  • 답변

    4

    아니요, 불가능합니다. 당신이 그것에 대해 생각한다면, 당신은 왜 이해해야합니다.

    싱글 톤 개체는 응용 프로그램의 수명 동안 존재합니다. InRequestScope 객체는 요청 수명 동안 만 존재합니다. 싱글 톤 저장소는 영원히 살 것이며 종속성이기 때문에 DbContext에 대한 참조를 보유하게됩니다. 즉, 저장소에서 일부 메커니즘을 해제하지 않으면 dbcontext를 가비지 수집 할 수 없습니다.

    이러한 메커니즘을 제공하더라도 새로운 싱글 톤 리포지토리가 생성되지 않으므로 다음 요청에서 새 인스턴스를 다시 획득하는 다른 메커니즘을 가져야합니다 (따라서 생성자는 생성되지 않습니다). 따라서 의존성은 해결되지 않을 것이고 따라서 새로운 dbcontext에 대해 알 수 없을 것이다.

    그래서, 효과, 만들기는 InRequestScope 효과적으로 InRequestScope는 싱글, 또는 다른 객체가 단일 아래에서 배치됩니다 개체를 만들 수있는 단일 개체의 종속성을 반대하고 나쁜 될 수 있습니다 ..

    또, 나는 당신의 저장소가 DO에 있다는 사실에 대해 당신과 달랐다. 상태는 DbContext 자체입니다. 싱글 톤은 응용 프로그램 전체의 정적 인스턴스이므로 응용 프로그램을 사용하는 모든 사용자에게 동일한 인스턴스를 제공합니다. 즉, 동일한 DbContext를 제공 할 것입니다. 이는 사용자가 서로 쾅쾅 거리기 때문에 거대한 아니오입니다. DbContext 상태.

    서비스도 마찬가지입니다. 리포지토리가 있기 때문에 서비스도 마찬가지입니다. 방금 언급 한 것처럼 상태 기반 DbContexts가 있습니다.

    서비스, 저장소 및 DbContext를 모두 InRequestScope로 설정하면됩니다.

    이 접근 방식이 "각 요청 동안 많은 수의 개체를 만듭니다"라는 것을 이해하지 못합니다. 요점은 요청 당 각 객체 유형의 인스턴스 하나만 생성한다는 것입니다.

    +0

    컨텍스트를 주입하기 시작할 때만 상태의 문제가 방정식에 들어갑니다. 내 리포지토리가 단순히 사용중인 블록에서 컨텍스트를 새로 작성한다면 상태 문제는 없을 것입니다. 그리고 생성자 삽입을 통해 싱글 톤이 한 번 뿐인 의존성을 얻을 수 있다고 생각했습니다. 이런 종류의 시나리오가 Ninject에 친숙하지 않은 속성 및 호출 차단을 사용하여 가능할 수 있기를 바라고/꿈꿨습니다. 하지만 궁금한 것이 있습니다. –

    +0

    @juhan_h - 물론 수동으로 강제로 속성 주입을 할 수 있지만 속성은 상태가 유지되기 때문에 상태 문제도 해결되지 않습니다. 메소드가 호출 될 때 새로운 컨텍스트를 해결할 수는 있지만, 싱글 톤 상태의 다중 사용자 환경에서는 여전히 동시성 문제가 발생하기 때문에 차단을 사용하지 않습니다. 싱글 톤은 응용 프로그램 전체에서 공유되며 요청 전체 또는 사용자 범위가 아닌 공유됩니다. 싱글 톤에서 변경되는 모든 상태는 앱의 모든 사용자에게 영향을 미칩니다. –

    +0

    @juhan_h -하지만 당신은 실제로 이것을 overthinking하고 ... 과도하게 최적화하고 있습니다. 리포지토리를 InRequestScope()로 만들고 그걸로 끝내십시오. 그게 그곳에있는 것입니다. –

    관련 문제