2013-08-08 4 views
0
내가 지금처럼 내 주요 객체로 내 사용자 개체를 삽입 할

:까지 때까지를 주입 사용자 정의 개체

public Principal(User user, IUserPermissions userPermissions) 
{ 
    /* user is the correct instance, that I passed via ConstructorArgument */ 
} 

까지

kernel.Get<IPrincipal>(new ConstructorArgument("user", user)); 

이 IPrincipal 생성자의 구체적인 구현 여기에는 문제가 없습니다. 사용자 개체가 잘 전달됩니다.

그러나 IUserPermissions는이 바로 객체를 수신하지 않습니다. 대신 ninject가 User의 새 인스턴스를 만듭니다. 여기 IUserPermissions 생성자의 구체적인 구현 :

public UserPermissions(User user, IDomainRoleValidator domainRoleValidator) 
{ 
    /* user is a fresh instance, **not** the one I passed via ConstructorArgument */ 
} 

가 어떻게이 'SETUSER'와 같은 새로운 방법을 추가 할 필요없이 작업 할 수 있습니까?

답변

0

바인딩의 범위를 지정해야합니다.

현재 기본 바인딩은 InTransientScope입니다. 즉, 요청 될 때마다 새 인스턴스를 제공합니다.

using Ninject.Web.Common; 

Bind<IPrincipal>().To<ConcreteInstanceHere>().InRequestScope(); 

또는 스레드 범위 :

당신은 (웹)의 요청에 따라 아마도 하나 .. 범위 그것을 다른 방법이 필요

Bind<IPrincipal>().To<ConcreteInstanceHere>().InThreadScope(); 

은이가 당신에게 동일한 인스턴스를 줄 것이다 그들의 각각의 범위.

+0

InRequestScope가 삭제되었습니다 (이유가 있다고 생각합니다). 그리고 InThreadScope는 여기에 적용되지 않습니다. – Sam7

+0

'InRequestScope'는'Ninject.Web.Common.dll'의 일부입니다. 'Ninject.dll'의 일부가 아닙니다. 어느 쪽이든 그 대답은 같습니다. 범위가 잘못되었습니다. 기본 범위는'InTransientScope'입니다. 이것은'kernel.Get '를 호출 할 때 새로운 인스턴스입니다. –

+0

나는 실제로 스코프없이 그것을하는 것을 선호 할 것이다. 내가 그 전화를 얻기위한 범위를 정의 할 수 없다면 ... – Sam7