2013-08-01 1 views
2

Ninject에 익숙하지 않아 완전히 개념이 잘못되었을 수도 있지만 이것이 내가 원하는 것입니다. 멀티 테넌트 웹 애플리케이션을 보유하고 있으며 내 사이트에 어떤 URL이 사용되었는지에 따라 다른 클래스 객체를 주입하려고합니다. 이의 라인을 따라HttpContext.Current에서 MVC4 조건부 바인딩을 사용하는 Ninject

뭔가, 어쩌면 내가 바인딩에() .When을 사용할 수 있습니다,하지만 당신은 아이디어를 얻을 수 있지만 :

private static void RegisterServices(IKernel kernel) 
    { 
     var currentTenant = TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower()); 
     if (currentTenant.Foldername == "insideeu") 
     { kernel.Bind<ICustomerRepository>().To<AXCustomerRepository>(); } 
     else 
     { kernel.Bind<ICustomerRepository>().To<CustomerRepository>(); } 
... 

문제는 HttpContext.Current이 시점에서 NULL임을입니다. 그래서 내 질문에 어떻게 NinjectWebCommon.RegisterServices HttpContext 데이터를 얻을 수 있습니다. Ninject에 잘못 될 수있는 방향에 대해서도 많은 도움이 될 것입니다.

당신에게

답변

5

감사 문제 당신이 여기에 바인딩 컴파일 타임에 해결이다; 반면에 모든 요청에 ​​대해 런타임에 해결할 필요가 있습니다. Ninject에 현재 HttpContext를 사용하는 방법을 실행,

Bind<ICustomerRepository>().ToMethod(context => 
    TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower()).Foldername == "insideeu" 
    ? new AXCustomerRepository() : new CustomerRepository()); 

이 때마다 ICustomerRepository이 요구되는 것을 의미하고 적절한 구현을 인스턴스화 이렇게하려면 ToMethod를 사용합니다. 당신은 또한 Get을 사용할 수 있습니다

참고 오히려 특정 생성자보다 유형에 해결하려면 다음 설명에 좋은 일

Bind<ICustomerRepository>().ToMethod(context => 
    TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower()) 
     .Foldername == "insideeu" ? 
      context.Kernel.Get<AXCustomerRepository>() : context.Kernel.Get<CustomerRepository>() 
    as ICustomerRepository); 
+0

, 감사합니다. 클래스 호출 인터페이스 (ICustomerRepository)에 대한 호출을 캐스팅해야했거나 암시 적 변환 오류가 발생했습니다. – Crob

+0

@Crob sweet, glad it help. 나는 후손을 위해 캐스트에서 편집했다. – McGarnagle

+0

안녕하세요, 저는 비슷한 것을하고 싶습니다. 동일한 리포지토리 및 작업 단위를 사용하지만 dbentext는 각 테넌트에 대해 다른 연결 문자열을 전달하는 임차인마다 만들어집니다. 이 연결 문자열은 별도의 인증 DB에서 가져옵니다. 그래서 내 질문에, 내가 그 모든 로그인 ninject registerservices()해야합니까? – Yashvit

관련 문제