【发布时间】:2010-12-29 12:02:37
【问题描述】:
你会如何解决这个问题:
我的数据存储中有数据。每个项目都有以下信息:
- URL = 将与请求一起使用的任意数量的第一路由段
- 某些项目类型 = 显示将与此类型相关(继续阅读)
- title = 用于例如在我的应用程序中导航
- 等
由于每个项目可以有任意数量的段,我创建了一个自定义路由,它允许我在不使用默认路由和单个贪婪路由参数的情况下处理这类请求。
项目类型实际上将定义特定项目的内容应该以何种方式显示给客户端。我正在考虑创建尽可能多的控制器,以便在单个控制器操作中没有太多代码。
那么您将如何在 ASP.NET MVC 中执行此操作,或者您认为最可行的方法是什么?
编辑:更多细节
我的项目存储在数据库中。因为它们可以有非常不同的类型(不可继承),所以我想创建尽可能多的控制器。但问题出现了:
我应该如何在每个请求上创建这些控制器,因为它们与一些动态数据相关?我可以创建自己的控制器工厂或路由处理程序,或者可能还有其他一些扩展点,但哪一个最好?
我想使用 MVC 基本功能,使用
Html.ActionLink(action, controller, linkText)之类的东西,或者制作我自己的扩展,例如Html.ActionLink(itemType, linkText)以使其更加灵活,因此 Action 链接应该根据 Route 数据创建正确的路由(因为那是后台发生了什么 - 它自上而下遍历路由,然后查看哪个路由返回结果 URL)。我正在考虑配置 itemType 和 路由值(控制器、操作、默认值)之间的关系。默认值设置可能很棘手,因为默认值应该从配置字符串反序列化为对象(这也可能很复杂)。所以我想甚至可能在 itemType 和 class type 之间有一个可配置的关系,它实现了一个特定的接口,如下例所示。
我的路线可以在数据存储中更改(或添加一些新路线)。但不应添加新类型。配置将提供这些场景,因为它们会将类型与路由默认值联系起来。
示例:
接口定义:
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 分钟。
【问题讨论】:
标签: asp.net asp.net-mvc database routing