2016-06-24 24 views
0

Bitte kann jemand beraten, ob es möglich ist, Verbindungszeichenfolgen für einen DbContext mit Ninject Bindung, basierend auf Current Culture zu wechseln? Mein aktueller (nicht funktionierender) Kabeljau ist wie folgt.Switch Verbindungszeichenfolge basierend auf Kultur bei der Verwendung von NInject

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()); 
     . 
     . 
     . 
    } 

Dies wird hier auf das Beispiel basiert, Ninject - dynamically specifying a connection string based on a sub domain, aber es ruft nicht außer auf jede Anfrage an meine GetCultureBasedConnectionString() Verfahren durch, wenn die Anwendung startet ...

Ich habe hier gelesen, so dass Verwenden von NInjects Die Methode Rebind() ist nicht gut.

This SO thread brachte mich auch nicht in die richtige Richtung.

Antwort

1

Ja, Sie beschreiben das erwartete Verhalten. Der Bindungscode wird ausgeführt, wenn ... und wenn Sie Bind aufrufen - und nicht jedes Mal, wenn der Typ abgerufen wird. Die in ToMethod angegebene Funktion/Methode würde jedes Mal ausgeführt werden, wenn die Bindung angewendet wird.

Obwohl ich glaube, dass Sie Ihren Code vereinfachen:

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

und damit ConnectionStringGetter() loszuwerden.

0

Eine leichte Veränderung ein Func<string> zu verwenden, die zu meiner GetCultureBasedConnectionString() Methode ruft zurück und dies scheint die Ausführung des GetCultureBasedConnectionString() Verfahren aufzuschieben, bis die Httprequest gemacht wird, die jetzt für mich zu funktionieren scheint ... Ist das erwartete GERÄTEVERHALTEN?

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());