我正在尝试使用 ninject 根据 url 动态指定连接字符串。
我正在使用 ninject.mvc nuget 包,该包使用 webActivator。
我的代码如下:
我的注射:
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()
when a IUnitOfWork
是必需的而不是在应用程序启动时?
对于我正在做的事情有更好的方法吗?
Thanks
您应该像这样使用 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
到处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)