2011-10-20 4 views
3

게으른 것으로 평가 된 매개 변수로 내 컨트롤러를 바인딩하고 싶습니다.MVC 3 ninject 바인드 지연 매개 변수

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     try 
     { 
      return controllerType == null 
         ? null 
         : (IController) _ninjectKernel.Get(controllerType); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

는 그리고 난 다음 바인딩이 있습니다

_ninjectKernel.Bind<IFilesRepository>().To<FilesManager>().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString()); 

문제는 람다 함수이다. 나는 Server.MapPath ("/")를 반환하고 싶지만 ... 나는 c 객체에 요청 문맥을 가지고 있지 않다. 나는 그것을 어떻게 보낼 수 있는가? 서버 변수가 현재 HttpContext에 관련되어 있기 때문에

답변

1

(당신이 경우 그 목적을 위해 별도의 인터페이스를 사용하여) FilesManager 클래스의 내부를 검색해야하지만 것 HttpContextBase을 해결할 수 있도록 컨테이너에 공급자를 등록 할 수 있어야합니다. 이렇게하면 IFilesRepository은 이제 인스턴스를 만들 때 공급자를 사용하여 컨테이너에 의해 주입되는 생성자 인수로 HttpContextBase을 사용할 수 있습니다.

(서비스를 해결하기 위해 대리자를 사용) 공급자를 등록하려면,

Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)); 

것은 IFilesRepository의 라이프 스타일이 가장 가능성이 "웹의 요청에 따라"생활 양식으로 변경해야합니다, 그러나주의 웹 요청 당 HttpContext.Current이 생성되므로 더 긴 라이프 스타일을 가진 IFilesRepository에있는 내용을 고수하고 싶지는 않습니다. 더 길어진 라이프 스타일을 가지고 IFilesRepository을 가질 수 있도록 "매핑 경로"기능을 추상화하고 싶을 수 있습니다.

0

당신은 내가 Ninject에 지나치게 익숙하지 않다

관련 문제