【问题标题】:Ninject - dynamically specifying a connection string based on a sub domainNinject - 基于子域动态指定连接字符串
【发布时间】:2011-08-11 11:21:28
【问题描述】:

我正在尝试使用 ninject 根据 url 动态指定连接字符串。

我正在使用使用 webActivator 的 ninject.mvc nuget 包。

我的代码如下:

我的注射:

kernel.Bind<IUnitOfWork>().To<UnitOfWork>()
  .WithConstructorArgument("connectionString", MvcApplication.GetConnectionStringName());

我的 global.asax

private static HttpContext _context;
public static string GetConnectionStringName() {
  var subDomain = String.Empty;

  if (_context != null) {
    subDomain = _context.Request.Url.SubDomain();
  }

  return String.Format("{0}ConnectionString", subDomain);
}

问题是 _context(在我的 Application_BeginRequest 中设置)始终为空,因为 WebActivator 在 application_start 之前运行。

是否可以在 ninject 中指定在需要 IUnitOfWork 而不是在应用程序启动时调用 MvcApplication.GetConnectionStringName()

对我正在做的事情有更好的方法吗?

谢谢

【问题讨论】:

    标签: asp.net-mvc dependency-injection ninject ninject.web.mvc


    【解决方案1】:

    你应该像这样使用 Ninject 绑定。​​

    kernel.Bind<IUnitOfWork>().To<UnitOfWork>()
      .WithConstructorArgument("connectionString", context => MvcApplication.GetConnectionStringName());
    

    注意这里的context 是Ninject 的IContext 类型,因此与HttpContext 无关。

    无论如何我认为你的方法适合这个。

    有时(尤其是当需要注入多个相关参数时)我更喜欢为配置创建一个接口和特定实现,并让它们通过像这样的标准绑定来注入。

    public interface IUnitOfWorkConfiguration {
        string ConnectionString { get; }
    }
    
    public class AppConfigUnitOfWorkConfiguration : IUnitOfWorkConfiguration {
        public string ConnectionString { get { ... } }
    }
    
    public class UnitOfWork {
        public UnitOfWork(IUnitOfWorkConfiguration configuration) {
        }
    }
    
    Bind<IUnitOfWorkConfiguration>().To<AppConfigUnitOfWorkConfiguration>();
    

    使用这种方法可以避免将参数名称指定为字符串文字。

    关于使用HttpContext 的更多注意事项。由于线程安全问题,我不建议以这种方式使用它。您应该使用[ThreadStatic] 属性标记您的私有静态字段_context,或者作为更好的选择,只需在任何地方使用HttpContext.Current

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2015-11-28
      • 2010-12-20
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多