0

現在のカルチャに基づいて、Ninject バインディングを使用して DbContext の接続文字列を切り替えることができるかどうか、誰にでもアドバイスできますか? 私の現在の(動作していない)タラは以下の通りです。

    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 - サブドメインに基づいて接続文字列を動的に指定するGetCultureBasedConnectionString()例に基づいていますが、アプリケーションの起動時を除いて、リクエストごとにメソッドを呼び出すことはありません...

ここで読んだので、NInjects Rebind() メソッドを使用するのは良くありません。

この SO スレッドも、私を正しい方向に導きませんでした。

4

2 に答える 2

0

Func<string>私のメソッドにコールバックする a を使用するためのわずかな変更により、HttpRequest が作成されるまでメソッドGetCultureBasedConnectionString()の実行が延期されるように見えますが、これは今では機能しているように見えます...GetCultureBasedConnectionString()

    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());
于 2016-06-24T10:48:05.363 に答える