3

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

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

我的代码如下:

我的注射:

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

我的全球.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 中指定在需要MvcApplication.GetConnectionStringName()a时而IUnitOfWork不是在应用程序启动时调用?

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

谢谢

4

1 回答 1

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在任何地方使用。

于 2011-08-11T11:41:35.973 回答