我正在尝试使用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
?
对我正在做的事情有没有更好的方法?
由于
答案 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
作为更好的选择。