2

OrchardCMSでAttributeRoutingを使用したい。そのためにはIRouteProvider、Orchardのリストを返すメソッドを使用してを実装する必要がありますRouteDescriptor

次のようなことができるように、ルートリストを取得する方法が必要です。

   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モジュールではうまくいきません。したがって、上記のアプローチを取る必要があります。

あなたが考えることができる方法はありますか?

4

1 に答える 1

3

バートランドが既に述べたように、必要なのは現在利用可能な型に対する単純な反映です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 に答える