Ninject - 基于子域动态指定连接字符串

时间:2011-08-11 11:21:28

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

我正在尝试使用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中设置)始终为null,因为WebActivator在application_start之前运行。

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

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

由于

1 个答案:

答案 0 :(得分:4)

您应该像这样使用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的另一个注意事项。由于线程安全问题,我不建议使用它。您应该使用_context属性标记私有静态字段[ThreadStatic],或者只是在任何地方使用HttpContext.Current作为更好的选择。