根据路线数据值进行Ninject注入

Rod*_*257 5 asp.net-mvc ninject inversion-of-control

我们有一个ASP.NET MVC应用程序,它具有许多不同的领域。在我们的服务层中,有2个区域使用相同的C#类,但是针对不同的基础数据。我希望这些服务根据路由数据中的值获得不同的依赖关系。

很难解释,我在解释我的班级/领域名称。为了显示: 通话逻辑

当“代码”位于路由数据中时,我想获得与不存在时注入的不同依赖关系。

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

这可能吗?

mip*_*e34 2

这对我有用(适用于标准路由配置"{controller}/{action}/{id}"

Ninject配置

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;
}
Run Code Online (Sandbox Code Playgroud)

它将使用

  • 路由的 ServiceA:/home/index/1、/home/index/2 等。
  • ServiceB 用于路由: / 、 /home/index 等。