【问题标题】:AttributeRouting - Method to get routes in assemblyAttributeRouting - 在程序集中获取路由的方法
【发布时间】:2013-03-20 05:12:57
【问题描述】:

我想在 Orchard CMS 中使用 AttributeRouting。为此,我需要实现一个IRouteProvider,该方法返回一个Orchard RouteDescriptors 列表。

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

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

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

你能想到什么办法?

【问题讨论】:

  • 你为什么要这样做?路由是公共资源,模块需要相互配合。您需要使用 Orchard 提供的路由 API。
  • 我依稀记得将一些项目移到 Orchard 并遇到问题,因为如果您使用多租户路由不能有名称。正如 Bertrand 所说,只需使用 Orchards 路由
  • @BertrandLeRoy 嗯,有这个项目是我从github.com/benjaminkeeping/Orchard.Routing 得到的想法,我不明白为什么我不能使用属性定义我的路线并且仍然让它与其他模块很好地配合。不像我想自己注册它们,我只想获取在这个特定模块中装饰我的控制器的路由属性列表,并将其传递给 Orchard 以实际注册它们。为什么这不能按设计工作?
  • @Hazza 我使用 AttributeRouting 中的子域路由功能构建了一个多租户非 Orchard 应用程序。对于这种情况,我不需要多租户,但这可能是使用子域路由attributerouting.net/#subdomains 的一个选项
  • 只是问。我不喜欢自己将路由放在控制器上,但如果这是您想要做的......但不确定您遇到了什么问题。看起来很简单的反射。当你说“这不会很好玩”时,那又如何?

标签: orchardcms orchardcms-1.6 attributerouting


【解决方案1】:

正如 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{ ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多