ASP.NET MVC маршрутизация на основе значений хранилища данных - PullRequest
8 голосов
/ 23 декабря 2009

Как бы вы решили эту проблему:

У меня есть данные в моем хранилище данных. Каждый предмет имеет информацию о:

  • URL = произвольное количество первых сегментов маршрута, которые будут использоваться с запросами
  • некоторый тип элемента = отображение будет связано с этим типом (читать дальше)
  • title = используется, например, для навигации по моему приложению
  • и т.д.

Поскольку каждый элемент может иметь произвольное количество сегментов, я создал собственный маршрут, который позволяет мне обрабатывать такие запросы без использования маршрута по умолчанию и с одним параметром жадного маршрута.

Тип элемента фактически определяет, каким образом содержимое определенного элемента должно отображаться для клиента. Я думал о том, чтобы создать столько же контроллеров, чтобы в одном действии контроллера не было слишком много кода.

Итак, как бы вы сделали это в ASP.NET MVC или что бы вы предложили, было бы наиболее целесообразным способом сделать это?

Редактировать: еще несколько деталей

Мои товары хранятся в базе данных. Поскольку они могут иметь очень разные типы (не наследуемые), я подумал о создании такого же количества контроллеров. Но возникают вопросы:

  1. Как мне создавать эти контроллеры при каждом запросе, поскольку они связаны с некоторыми динамическими данными? Я мог бы создать свою собственную фабрику контроллеров или обработчик маршрута или, возможно, некоторые другие точки расширения, но какая из них была бы лучше?

  2. Я хочу использовать базовую функциональность MVC, например, Html.ActionLink(action, controller, linkText) или сделать свое собственное расширение, например Html.ActionLink(itemType, linkText), чтобы сделать его еще более гибким, поэтому ссылка Action должна создавать правильные маршруты на основе данных маршрута (потому что это что происходит в фоновом режиме - он проходит по маршрутам сверху вниз и видит, какой из них возвращает полученный URL).

  3. Я думал о конфигурации отношения между itemType и значениями маршрута (контроллер, действие, значения по умолчанию). Настройка по умолчанию может быть сложной, так как настройки по умолчанию должны быть десериализованы из строки конфигурации в объект (который также может быть сложным). Поэтому я подумал о том, что, возможно, даже имеется настраиваемое отношение между itemType и типом класса , которое реализует определенный интерфейс, как написано в примере ниже.

  4. Мои маршруты могут быть изменены (или добавлены некоторые новые) в хранилище данных. Но новые типы не должны быть добавлены. Конфигурация предоставит эти сценарии, потому что они будут связывать типы с маршрутами по умолчанию.

Пример

Определение интерфейса:

public interface IRouteDefaults
{
    object GetRouteDefaults();
}

Пример реализации интерфейса:

public class DefaultType : IRouteDefaults
{
    public object GetRouteDefaults()
    {
        return new {
            controller = "Default",
            action = "Show",
            itemComplex = new Person {
                Name = "John Doe",
                IsAdmin = true
            }
    }
}

Пример конфигурации:

<customRoutes>
    <route name="Cars" type="TypeEnum.Car" defaults="MyApp.Routing.Defaults.Car, MyApp.Routing" />
    <route name="Fruits" type="TypeEnum.Fruit" defaults="MyApp.Routing.Defaults.Fruit, MyApp.Routing" />
    <route name="Shoes" type="TypeEnum.Shoe" defaults="MyApp.Routing.Defaults.Shoe, MyApp.Routing" />
    ...
    <route name="Others" type="TypeEnum.Other" defaults="MyApp.Routing.Defaults.DefaultType, MyApp.Routing" />
</customRoutes>

Для устранения проблемы с производительностью я могу кэшировать свои элементы и работать с данными в памяти и избегать доступа к базе данных при каждом запросе. Эти предметы, как правило, не меняются слишком часто Я мог бы кэшировать их как 60 минут без ухудшения работы приложения.

Ответы [ 2 ]

3 голосов
/ 13 января 2010

Нет существенной проблемы с производительностью, если вы определяете сложный словарь маршрутизации или просто имеете одну общую запись маршрутизации и обрабатываете все случаи самостоятельно. Код есть код

Даже если ваши типы данных не наследуются, скорее всего, у вас есть общие шаблоны отображения. например,

  • Список заголовков и сводный текст
  • элемент отображения, с заголовком, изображением, описанием
  • и т.д.

Если вы можете разбить ваш сайт на конечное число шаблонов отображения, то вам нужно только сделать эти конечные контроллеры и представления

Вы предоставляете сервисный уровень, который выбирается параметром маршрутизации, а не использует шаблон объекта передачи данных (DTO), чтобы взять данные случая и переместить его в стандартную структуру данных для представления

2 голосов
/ 30 декабря 2009

Общая концепция, о которой вы говорите, не является чем-то необычным, и есть несколько вещей, которые следует учитывать:

  1. В тот момент, когда я слышу, что маршрутизация URL-адресов зависит от данных, поступающих из базы данных, первое, о чем я думаю, - это производительность. Один из способов устранить потенциальные проблемы с производительностью - использовать встроенный класс Route и иметь очень общий шаблон, такой как "somethingStatic/{*everythingElse}". Таким образом, если URL-адрес не начинается с «thingStatic », он сразу не сможет соответствовать, и маршрутизация будет продолжена до следующего маршрута. Тогда вы получите все интересные данные в качестве универсального параметра "everythingElse".

  2. Затем вы можете связать этот маршрут с пользовательским обработчиком маршрута, который происходит от MvcRouteHandler и переопределяет GetHttpHandler, чтобы перейти к базе данных, разобраться в значении "everythingElse" и, возможно, динамически определить, какой контроллер и действие должно быть использовано для обработки этого запроса. Вы можете получить / установить значения маршрутизации, набрав requestContext.RouteData.Values.

  3. Вопрос о том, использовать ли один контроллер и одно действие или много из одного или многих из каждого, является вопросом для себя. Вопрос сводится к тому, сколько у вас разных типов данных? Они в основном похожи (все они книги, но некоторые в твердом переплете, а некоторые в мягком переплете)? Совершенно разные (некоторые машины, некоторые книги, а некоторые дома)? Ответ на этот вопрос должен быть таким же, как если бы это был класс компьютерного программирования, и вы должны были с точки зрения ООП решить, есть ли у них базовый класс и собственные типы производных, или их можно легко представить с помощью один общий тип. Если это все разные типы, я бы порекомендовал разные контроллеры, особенно если каждый из них требует определенного набора действий. Например, для дома вы можете увидеть отчет об осмотре. Но для книги вы можете просмотреть первые пять страниц и прочитать рецензию на книгу. Эти предметы не имеют ничего общего: действия для одного никогда не будут использованы для другого.

  4. Проблема, описанная в # 3, может возникать и в обратном порядке: что если у вас есть 1000 различных типов объектов? Хотите 1000 разных контроллеров? Не имея больше информации, я бы сказал, что для этого сценария 1000 контроллеров - это слишком много.

Надеюсь, эти мысли помогут вам найти правильное решение. Если вы можете предоставить больше информации о некоторых конкретных сценариях, которые у вас есть (например, какие это объекты и какие действия могут к ним применяться), то ответ также можно уточнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...