2013-03-20 2 views
2

Я хочу использовать AttributeRouting с Orchard CMS. Для этого мне нужно реализовать IRouteProvider с помощью метода, который возвращает список Orchard RouteDescriptor s.AttributeRouting - метод получения маршрутов в сборке

Мне нужен способ, чтобы получить список маршрутов, так что я могу сделать что-то вроде этого:

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

Этот метод является от MvcRouting, но я хочу, чтобы использовать больше функции богатых AttributeRouting, но не может найти способ сканирования текущая сборка для атрибутов маршрутизации. Нужен способ для атрибутаRouting, чтобы вернуть список маршрутов, которые я могу проецировать, в список 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; } 
} 

Если бы я хотел, чтобы зарегистрировать маршруты непосредственно (в не-Орчард проекта) Я хотел бы использовать следующие AttributeRouting методы расширения:

routesCollection.MapAttributeRoutes(config => 
     { 
      config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly()); 
     } 

Но это не место хорошо с другими модулями Orchard , Поэтому нужно принять подход выше.

Как вы можете думать?

+0

Почему вы хотите это сделать? Маршруты - это общие ресурсы, а модули должны хорошо сочетаться друг с другом. Вам необходимо использовать API-интерфейсы маршрутизации, которые предоставляет Orchard. –

+0

Я смутно помню, как перенос некоторых проектов в сад и возникли проблемы, поскольку, если вы используете маршруты Multi-Tenancy, не может быть имен. Как сказал Бертран, просто используйте Orchards routing – Hazza

+0

@BertrandLeRoy Ну, есть этот проект, который я получил от https://github.com/benjaminkeeping/Orchard.Routing Я не понимаю, почему я не могу определить свои маршруты, используя атрибуты и по-прежнему хорошо играть с другими модулями. Не так, как будто я хочу зарегистрировать их самостоятельно, я просто хочу получить список атрибутов маршрута, которые украсят мои контроллеры в этом конкретном модуле и передают его в Orchard, чтобы фактически зарегистрировать их. Почему бы это не сделать по дизайну? – parliament

ответ

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{ ... } для каждого.
Смежные вопросы