gpt4 book ai didi

c# - MVC 请求上的 Ninject 上下文绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 16:19:55 25 4
gpt4 key购买 nike

我在将服务注入(inject) ASP.NET MVC Controller 时遇到异常情况。 Controller 提供一个单独的操作来在页面上呈现侧边栏菜单,而注入(inject)到 Controller 中的服务是创建侧边栏内容的工厂。该 Action 用 [ChildActionOnly] 属性装饰:只有在渲染另一个 Action 时才能渲染侧边栏。

困难在于我想根据请求的页面(= Controller )注入(inject)侧边栏工厂抽象的不同实例。以前,我使用一种抽象工厂来做这件事,它有使用 Controller 名称字符串来确定要使用哪个具体工厂实现的不优雅的实现;我现在已将其移至适当的抽象工厂,因此需要将工厂类型的选择移至其他位置。

我的 Ninject 绑定(bind)目前非常简单地定义为:

Kernel.Bind<ISideBarFactory>().To<FooSideBarFactory>().InRequestScope();
Kernel.Bind<ISideBarFactory>().To<DefaultSideBarFactory>().InRequestScope();

当我添加更多 Controller 时,我将添加更多第一行的实例。我希望看到这个工作的方式是:

  • /foo/action 收到请求
    • Ninject 将 ISideBarFactory 绑定(bind)到 FooSideBarFactory 并注入(inject)到 SideBarController
  • /bar/action 收到请求
    • Ninject 将 ISideBarFactory 绑定(bind)到 BarSideBarFactory 并注入(inject)到 SideBarController
  • /baz/action 收到请求
    • 不存在BazSideBarFactory,因此Ninject将ISideBarFactory绑定(bind)到默认实现DefaultSideBarFactory,并注入(inject)SideBarController

我在 Contextual Binding 上查阅了 Ninject wiki 页面,这似乎是我原则上想要的,但我没有发现任何明显实现我的目标的记录。

最佳答案

您可以将读取路线数据与Contextual-Binding结合起来

绑定(bind)

// default binding - used if none of the conditions is met
kernel.Bind<IService>()
.To<DefaultService>()

kernel.Bind<IService>()
.To<BasicService>()
.When(x=> IsRouteValueDefined("controller", "Service"));

kernel.Bind<IService>()
.To<ExtraService>()
.When(x=> IsRouteValueDefined("controller", "ExtraService"));

IsRouteValueDefined() 方法

当定义路由键并指定 routeValue 等于路由键的路由值或为 null 时返回 true。

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().ToUpper() == routeValue.ToUpper();
}

关于c# - MVC 请求上的 Ninject 上下文绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com