Asp.net mvc 基于路由数据值的Ninject注入

Asp.net mvc 基于路由数据值的Ninject注入,asp.net-mvc,inversion-of-control,ninject,Asp.net Mvc,Inversion Of Control,Ninject,我们有一个ASP.NETMVC应用程序,它有许多不同的领域。有两个区域使用来自服务层的相同C#类,但针对不同的底层数据。我希望这些服务根据路由数据中的值获得不同的依赖关系 这很难解释,我正在解释我的班级/地区名称。举例说明: 当“代码”在路由数据中时,我希望在不存在的情况下注入不同的依赖项 我知道可以使用.When()方法进行条件绑定,但我不确定如何从中获取路由数据。我也可以根据调用它的区域来做,但是这在我的例子中并不可取(我认为我们可以在其他区域使用代码) 这可能吗?这对我很有效(它适用于标

我们有一个ASP.NETMVC应用程序,它有许多不同的领域。有两个区域使用来自服务层的相同C#类,但针对不同的底层数据。我希望这些服务根据路由数据中的值获得不同的依赖关系

这很难解释,我正在解释我的班级/地区名称。举例说明:

当“代码”在路由数据中时,我希望在不存在的情况下注入不同的依赖项

我知道可以使用.When()方法进行条件绑定,但我不确定如何从中获取路由数据。我也可以根据调用它的区域来做,但是这在我的例子中并不可取(我认为我们可以在其他区域使用代码)

这可能吗?

这对我很有效(它适用于标准路由配置
“{controller}/{action}/{id}”

n对象配置

protected override Ninject.IKernel CreateKernel()
{
    var kernel = new StandardKernel();
    kernel.Bind<IService>()
        .To<ServiceA>()
        .When(x => IsRouteValueDefined("id", null));
    kernel.Bind<IService>()
        .To<ServiceB>()
        .When(x => !IsRouteValueDefined("id",null));
    return kernel;
}
// just sample condition implementation
public static bool IsRouteValueDefined(string routeKey, string routeValue)
{
    var mvcHanlder = (MvcHandler)HttpContext.Current.Handler;
    var routeValues = mvcHanlder.RequestContext.RouteData.Values;
    var containsRouteKey = routeValues.ContainsKey(routeKey);
    if (routeValue == null)
        return containsRouteKey;
    return containsRouteKey && routeValues[routeKey].ToString() == routeValue;
}
protectedoverride Ninject.IKernel CreateKernel()
{
var kernel=新的标准内核();
kernel.Bind()
.至()
.When(x=>IsRouteValueDefined(“id”,null));
kernel.Bind()
.至()
.When(x=>!IsRouteValueDefined(“id”,null));
返回内核;
}
//只是示例条件实现
公共静态布尔值IsRouteValue已定义(字符串routeKey、字符串routeValue)
{
var MvcHandler=(MvcHandler)HttpContext.Current.Handler;
var routeValues=mvcHanlder.RequestContext.RouteData.Values;
var containsRouteKey=routeValues.ContainsKey(routeKey);
if(routeValue==null)
返回containsroutkey;
return containsRouteKey&&routeValue[routeKey].ToString()==routeValue;
}
它将使用

  • 路由的服务a:/home/index/1、/home/index/2等
  • 路由的服务B:/、/home/index等

这是一个很好的问题。是否提供了任何见解?嗯,这导致
无法将'System.Web.Http.WebHost.HttpControllerHandler'类型的对象强制转换为'System.Web.Mvc.MvcHandler'类型
这适用于ASP Mvc 2-您可以尝试通过调试器查看,您有什么类型的
处理程序
。可能它在ASP MVC的不同版本之间发生了变化。对于最新的MVC,您应该使用
System.Web.Routing.RouteTable.Routes.GetRouteData(新的HttpContextWrapper(HttpContext.Current))用于获取路线值。