2

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

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

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

此方法来自 MvcRouting 但我想使用功能更丰富的AttributeRouting但找不到扫描当前程序集以查找路由属性的方法。需要一种 AttributeRouting 方法来返回我可以投射到 s 列表中RouteDescriptor但实际上不注册它们的路由列表,将其留给 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 模块。所以需要采取上面的方法。

你能想到什么办法吗?

4

1 回答 1

3

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

  1. IRouteProvider像你已经做的那样实施。
  2. Controller获取当前启用的模块导出的所有类型

    IExtensionManager _extensions;
    ShellBlueprint _shell;
    ...
    var types = _extensions
                    .LoadFeatures(_extensions.EnabledFeatures(_shell.Descriptor))
                        .SelectMany(feature => feature
                            .ExportedTypes
                            .Where(t => typeof(Controller).IsAssignableFrom(t)));
    
  3. 循环上述每种类型的方法并选择那些定义了给定属性的方法。对于选择的每个方法,获取其名称(动作名称)、包含其声明类型(区域名称)的程序集名称以及属性数据(路由模式等)。

  4. 有了上面的集合,您可以简单地循环它并new RouteDescriptor{ ... }为每个集合返回。
于 2013-03-21T13:06:32.987 回答