Ninject与HttpContext.Current上的MVC4条件绑定

时间:2013-08-01 21:48:15

标签: asp.net-mvc asp.net-mvc-4 ninject ninject.web.mvc

我对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可能出错的任何方向都会非常感激。

谢谢

1 个答案:

答案 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);
相关问题