ASP.NET MVC, направляющий на основе значений хранилища данных

Как был бы Вы заниматься этой проблемой:

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

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

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

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

Таким образом, как Вы сделали бы это в ASP.NET MVC или что будет Вы предлагать быть самым выполнимым способом сделать это?

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

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

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

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

  3. Я думал о наличии конфигурации отношения между itemType и значениями маршрута (контроллер, действие, значения по умолчанию). Установка Defaults может быть хитрой, так как значения по умолчанию должны быть десериализованы от строки конфигурации в объект (который может также быть сложным). Таким образом, я думал, возможно, даже о наличии настраиваемого отношения между 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 минут без ухудшающегося опыта приложения.

8
задан Peter Mortensen 22 April 2010 в 21:17
поделиться

2 ответа

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

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

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

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

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

.
3
ответ дан 5 December 2019 в 23:15
поделиться

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

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

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

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

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

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

.
2
ответ дан 5 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: