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

1

是的,您正在描述预期的行为。绑定代码在您调用时执行,Bind而不是每次检索类型时执行。ToMethod每次应用绑定时都会执行中指定的 Func/Method 。

尽管我相信您可以将代码简化为:

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

从而摆脱ConnectionStringGetter().

于 2016-06-24T15:11:41.097 回答
0

使用 aFunc<string>回调我的GetCultureBasedConnectionString()方法的细微变化,这似乎将GetCultureBasedConnectionString()方法的执行推迟到发出 HttpRequest 之前,这现在似乎对我有用......这是预期的行为吗?

    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 回答