Как бы вы решили эту проблему:
У меня есть данные в моем хранилище данных. Каждый предмет имеет информацию о:
- URL = произвольное количество первых сегментов маршрута, которые будут использоваться с запросами
- некоторый тип элемента = отображение будет связано с этим типом (читать дальше)
- title = используется, например, для навигации по моему приложению
- и т.д.
Поскольку каждый элемент может иметь произвольное количество сегментов, я создал собственный маршрут, который позволяет мне обрабатывать такие запросы без использования маршрута по умолчанию и с одним параметром жадного маршрута.
Тип элемента фактически определяет, каким образом содержимое определенного элемента должно отображаться для клиента. Я думал о том, чтобы создать столько же контроллеров, чтобы в одном действии контроллера не было слишком много кода.
Итак, как бы вы сделали это в ASP.NET MVC или что бы вы предложили, было бы наиболее целесообразным способом сделать это?
Редактировать: еще несколько деталей
Мои товары хранятся в базе данных. Поскольку они могут иметь очень разные типы (не наследуемые), я подумал о создании такого же количества контроллеров. Но возникают вопросы:
Как мне создавать эти контроллеры при каждом запросе, поскольку они связаны с некоторыми динамическими данными? Я мог бы создать свою собственную фабрику контроллеров или обработчик маршрута или, возможно, некоторые другие точки расширения, но какая из них была бы лучше?
Я хочу использовать базовую функциональность MVC, например, Html.ActionLink(action, controller, linkText)
или сделать свое собственное расширение, например Html.ActionLink(itemType, linkText)
, чтобы сделать его еще более гибким, поэтому ссылка Action должна создавать правильные маршруты на основе данных маршрута (потому что это что происходит в фоновом режиме - он проходит по маршрутам сверху вниз и видит, какой из них возвращает полученный URL).
Я думал о конфигурации отношения между itemType и значениями маршрута (контроллер, действие, значения по умолчанию). Настройка по умолчанию может быть сложной, так как настройки по умолчанию должны быть десериализованы из строки конфигурации в объект (который также может быть сложным). Поэтому я подумал о том, что, возможно, даже имеется настраиваемое отношение между itemType и типом класса , которое реализует определенный интерфейс, как написано в примере ниже.
Мои маршруты могут быть изменены (или добавлены некоторые новые) в хранилище данных. Но новые типы не должны быть добавлены. Конфигурация предоставит эти сценарии, потому что они будут связывать типы с маршрутами по умолчанию.
Пример
Определение интерфейса:
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 минут без ухудшения работы приложения.