2016-06-24 1 views
0

현재 culture를 기반으로 Ninject 바인딩을 사용하여 DbContext에 대한 연결 문자열을 전환 할 수 있다면 누구나 조언 해 주실 수 있습니까? 현재 (비 작동) 대구는 다음과 같습니다. NInject를 사용할 때 culture에 따라 연결 문자열을 바꿈

private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     try 
     { 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 
     catch 
     { 
      kernel.Dispose(); 
      throw; 
     } 
    } 

    private static string GetCultureBasedConnectionString() 
    { 
     string culture = "de-DE"; // TODO Replce with Thread.CurrentThread.CurrentCulture.Name 
     string cultureBasedConnectionString = ConnectionStringHelper.GetConnectionStringWithCulture(culture); 
     return cultureBasedConnectionString; 
    } 

    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<ApplicationDb>().To<ApplicationDb>() 
      .InRequestScope() 
      .WithConstructorArgument("connectionString", context => GetCultureBasedConnectionString()); 
     . 
     . 
     . 
    } 

여기 예를 들어, Ninject - dynamically specifying a connection string based on a sub domain를 기반으로하지만, 내가 그 그래서 여기에 읽고 ... 응용 프로그램이 시작될 때를 제외하고 각 요청에 대한 내 GetCultureBasedConnectionString() 방법

를 통해 호출하지 않습니다 NInjects Rebind() 메소드를 사용하면 좋지 않습니다.

This SO thread도 올바른 방향으로 나를 데려 오지 못했습니다.

답변

1

예 예상되는 동작을 설명합니다. 바인딩 코드는 Bind - 형식을 검색 할 때마다 호출 할 때 실행됩니다. ToMethod에 지정된 Func/Method는 바인딩이 적용될 때마다 실행됩니다. ConnectionStringGetter() 제거하여

kernel.Bind<ApplicationDb>().To<ApplicationDb>() 
     .InRequestScope() 
     .WithConstructorArgument(
      "connectionStringGetter", 
      context => GetCultureBasedConnectionString()); 

과 : 난 당신이 당신의 코드를 단순화 수 있다고 생각하지만

.

0

약간의 변화가 내 GetCultureBasedConnectionString() 방법으로 다시 호출이는 HttpRequest를 이제 나를 위해 일하게 나타나는, 만든 때까지 GetCultureBasedConnectionString() 방법의 실행을 연기 할 것 같다 ... 예상 behviour 저거 Func<string>를 사용 하는가?

private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     try 
     { 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 
     catch 
     { 
      kernel.Dispose(); 
      throw; 
     } 
    } 

    private static string GetCultureBasedConnectionString() 
    { 
     string culture = Thread.CurrentThread.CurrentCulture.Name; 
     string cultureBasedConnectionString = ConnectionStringHelper.GetConnectionStringWithCulture(culture); 
     return cultureBasedConnectionString; 
    } 

    private static Func<string> ConnectionStringGetter() 
    { 
     var function = new Func<string>(GetCultureBasedConnectionString); 
     return function; 
    } 

    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<ApplicationDb>().To<ApplicationDb>() 
      .InRequestScope() 
      .WithConstructorArgument("connectionStringGetter", context => ConnectionStringGetter()); 
관련 문제