gpt4 book ai didi

orchardcms - AttributeRouting - 在程序集中获取路由的方法

转载 作者:行者123 更新时间:2023-12-04 05:05:45 28 4
gpt4 key购买 nike

我想使用 AttributeRouting使用 Orchard CMS。为此,我需要实现 IRouteProvider使用返回 Orchard 列表的方法 RouteDescriptor s。

我需要一种获取路线列表的方法,以便可以执行以下操作:

   public IEnumerable<RouteDescriptor> GetRoutes()
{
return _routes ?? (_routes = MvcRouting.GetRoutes(GetType().Assembly).Select(route => new RouteDescriptor
{
...
}).ToArray());
}

此方法来自 MvcRouting 但我想使用功能更丰富的 AttributeRouting但找不到扫描当前程序集以查找路由属性的方法。需要一种 AttributeRouting 方法来返回我可以转换到 RouteDescriptor 列表中的路由列表s 但实际上并没有注册它们,而是将其留给 Orchard。
 public class RouteDescriptor {
public string Name { get; set; }
public int Priority { get; set; }
public System.Web.Routing.RouteBase Route { get; set; }
public System.Web.SessionState.SessionStateBehavior SessionState { get; set; }
}

如果我想直接注册路由(在非 Orchard 项目中),我会使用以下 AttributeRouting 扩展方法:
  routesCollection.MapAttributeRoutes(config =>
{
config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
}

但这不适用于其他 Orchard 模块。所以需要采取上面的方法。

你能想到什么办法吗?

最佳答案

正如 Bertrand 已经指出的,您需要的是对当前可用的 Controller 的简单反射(reflect)。类型。

  • 实现IRouteProvider就像你已经做过的那样。
  • 捕获所有Controller当前启用的模块导出的类型
    IExtensionManager _extensions;
    ShellBlueprint _shell;
    ...
    var types = _extensions
    .LoadFeatures(_extensions.EnabledFeatures(_shell.Descriptor))
    .SelectMany(feature => feature
    .ExportedTypes
    .Where(t => typeof(Controller).IsAssignableFrom(t)));
  • 循环上述每种类型的方法并选择那些定义了给定属性的方法。对于选择的每个方法,获取其名称(操作名称)、包含其声明类型(区域名称)的程序集名称以及属性数据(路由模式等)。
  • 有了上面的集合,您可以简单地循环它并返回 new RouteDescriptor{ ... }对于每个。
  • 关于orchardcms - AttributeRouting - 在程序集中获取路由的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15515863/

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