2011-03-30 3 views
3

다음은 시나리오입니다. WCF 서비스가 있는데이 서비스가 호출되면 다른 클래스 (Ninject를 통해 생성됨)의 인스턴스로 제어가 전달됩니다. 이 클래스에서는 Entity Framework 및 저장소와 관련된 작업을 수행해야합니다. 짧은 이야기를 짧게 자르기 위해 다음 바인딩을 선언했습니다.Ninject가 WCF에서 생성자 인수를 사용하여 새 인스턴스를 만들지 않습니다.

Bind<IGenericProductRepository>() 
    .To<GenericProductRepository>() 
    .WithConstructorArgument("context", new StagingDataContext()); 

내가이 저장소를 사용하고자 할 때 나는 다음을 가지고있다.

using (var genericProductRepository = IoC.Resolve<IGenericProductRepository>()) 

문제는 새로운 요청이 있다면이 방법은 동일한 요청에 여러 번 호출하는 경우 난 단지 내가라는 오류가 발생, genericProductRepository의 새로운 인스턴스를 얻을이며, 그 맥락합니다 (EF 컨텍스트) 이미 처리 된 같은 인스턴스를 다시 가져 오는 것 같습니다 때문에 using 문에 이미 배치 된 때문입니다. 다른 방법으로 설명하기 위해 Microsoft WCF 테스트 클라이언트를 사용하여 처음 호출 할 때 테스트 클라이언트를 다시 시작하지 않고 호출 버튼을 다시 누르면 (즉 동일한 요청) 코드가 올바르게 실행됩니다. 그러면이 오류가 발생합니다 이미 처분 중이다.

나는 Ninject와 함께 제공되는 다양한 "범위"를 가지고 놀려고했지만 명확하게 나는 뭔가를 놓치고 있습니다.

그래서 내 기본 질문은, 어떻게 그 라인을 때마다 동일한 저장소를 사용하여 새 저장소를 어떻게해야합니까? 도움을 주시면 대단히 감사하겠습니다. 저는 회사에서 Ninject를 채택하고 Spring을 중단하라고 촉구합니다.

답변

3

바인딩을 다시보십시오. Ninject에 대한 지식이 없어도 컨텍스트의 인스턴스는 바인딩이 정의 된 시점에 정확히 한 번만 만들어집니다. 그러나 원하는 것은 모든 결의안에 새로운 맥락이 있습니다. WithConstructorArgument를 사용하지 않고 Ninject가 인스턴스를 생성하게함으로써 최고가됩니다. 따라서 컨텍스트 유형에 대한 추가 바인딩을 정의해야합니다. https://github.com/ninject/ninject.extensions.wcf

당신은 제거 할 수 그 방법이 어떤 이유로 할 수없는 경우 당신은

WithConstructorArgument("context", ctx => new StagingDataContext()) 

또한 WithConstructorArgument의 게으른 버전을 사용해야합니다, 당신은 Ninject에 대한 WCF 확장을 시도 할 수도 있습니다 ServiceLocator는 사용법과 비슷합니다.

관련 문제