我对Ninject不是很有经验,所以我在这里可能有一个完全错误的概念,但这就是我想要做的。我有一个多租户Web应用程序,并希望根据用于访问我网站的URL注入不同的类对象。
有些事情,虽然也许我可以在绑定中使用.When(),但你明白了:
private static void RegisterServices(IKernel kernel)
{
var currentTenant = TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower());
if (currentTenant.Foldername == "insideeu")
{ kernel.Bind<ICustomerRepository>().To<AXCustomerRepository>(); }
else
{ kernel.Bind<ICustomerRepository>().To<CustomerRepository>(); }
...
问题是此时HttpContext.Current为null。所以我的问题是如何在NinjectWebCommon.RegisterServices中获取HttpContext数据。我对Ninject可能出错的任何方向都会非常感激。
谢谢
答案 0 :(得分:5)
问题是你的绑定在编译时解决了;而你需要它在运行时解决每个请求。为此,请使用ToMethod
:
Bind<ICustomerRepository>().ToMethod(context =>
TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower()).Foldername == "insideeu"
? new AXCustomerRepository() : new CustomerRepository());
这意味着,每次调用ICustomerRepository
时,NInject将使用当前HttpContext
运行该方法,并实例化相应的实现。
请注意,您也可以使用Get
来解析类型而不是特定的构造函数:
Bind<ICustomerRepository>().ToMethod(context =>
TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower())
.Foldername == "insideeu" ?
context.Kernel.Get<AXCustomerRepository>() : context.Kernel.Get<CustomerRepository>()
as ICustomerRepository);