基于数据存储值的ASP.NET MVC路由

Rob*_*nik 8 database asp.net asp.net-mvc routing

你会如何解决这个问题:

我的数据存储中有数据.每个项目都有以下信息:

  • URL =将与请求一起使用的任意数量的第一个路径段
  • 某些项目类型=显示将与此类型相关(继续阅读)
  • title =例如在我的应用程序的导航中使用
  • 等等

由于每个项目可以有任意数量的段,我创建了一个自定义路由,允许我处理这些类型的请求,而不使用默认路由和一个贪婪的路由参数.

项目类型实际上将定义特定项目的内容应以何种方式显示给客户端.我正在考虑创建尽可能多的控制器,以便在单个控制器操作中没有太多代码.

那么你将如何在ASP.NET MVC中做到这一点,或者你会建议哪种方式最可行?

编辑:更多细节

我的项目存储在数据库中.由于它们可以有非常不同的类型(不可继承),我想创建尽可能多的控制器.但问题出现了:

  1. 我应该如何在每个请求上创建这些控制器,因为它们与某些动态数据相关?我可以创建自己的控制器工厂或路由处理程序或可能还有一些其他扩展点,但哪一个最好?

  2. 我想使用MVC基本功能来使用像Html.ActionLink(action, controller, linkText)或者使我自己的扩展Html.ActionLink(itemType, linkText)更加灵活,因此Action链接应该根据Route数据创建正确的路由(因为这是在后台发生的事情 - 它通过路径顶部down并查看哪一个返回结果URL).

  3. 我正在考虑在itemType路由值之间建立关系配置(控制器,操作,默认值).默认设置可能很棘手,因为默认值应该从配置字符串反序列化为对象(也可能很复杂).所以我想甚至可能在itemType类类型之间有一个可配置的关系,它实现了一个特定的接口,如下面的例子所示.

  4. 我的路由可以在数据存储中更改(或添加一些新路由).但不应添加新类型.配置将提供这些方案,因为它们将链接类型与路由默认值.

示例:

接口定义:

public interface IRouteDefaults
{
    object GetRouteDefaults();
}
Run Code Online (Sandbox Code Playgroud)

接口实现示例:

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

配置示例:

<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>
Run Code Online (Sandbox Code Playgroud)

为了解决性能问题,我可以缓存我的项目并使用内存数据,并避免在每次请求时访问数据库.这些项目往往不会经常变化.我可以将它们缓存60分钟,而不会降低应用程序体验.

TFD*_*TFD 3

如果您定义一个复杂的路由字典,或者只有一个通用路由条目并自己处理所有情况,则不会出现严重的性能问题。代码就是代码

即使您的数据类型不可继承,您也很可能具有通用的显示模式。例如

  • 标题和摘要文本列表
  • 项目显示,带有标题、图像、描述
  • ETC

如果您可以将站点分解为有限数量的显示模式,那么您只需要制作这些有限的控制器和视图

您提供一个由路由参数选择的服务层,而不是使用数据传输对象 (DTO) 模式来获取案例数据并将其移动到视图的标准数据结构中