【问题标题】:Dynamically add route value parameter from database in Asp.Net Core在 Asp.Net Core 中从数据库中动态添加路由值参数
【发布时间】:2016-08-11 15:19:13
【问题描述】:

例如,我正在创建多租户应用程序,每个库只有一个数据库。

我想动态添加库名到路由,例如当用户试图获取所有书籍/Books/GetAllBooks时,我必须添加库名,可以从数据库中检索,例如:/LibraryName/Books/GetAllBooks,所以用户只能从他所属的图书馆获得所有书籍。

我该怎么办?实现我自己的 IRouter,我自己的模板路由,还有什么?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc multi-tenant entity-framework-core


    【解决方案1】:

    捷径

    id 添加到您的网址。看这个问题的网址:

    https://stackoverflow.com/questions/36718499/dynamically-add-route-value-parameter-from-database-in-asp-net-core

    您可以将最后一个路径段更改为任何内容:
    https://stackoverflow.com/questions/36718499/foo-bar 仍将您带到这里。

    没有 id

    实现IRouter。您将需要实现两种方法:

    1) async Task RouteAsync(RouteContext context) 解析传入的请求并将正确的“控制器”、“操作”和“id”值添加到context.RouteData 集合中。稍后,MVC 将使用此信息调用您的控制器。

    2) VirtualPathData GetVirtualPath(VirtualPathContext context) 为控制器+动作+id 值构建url(字符串),在context.Values 集合中提供。

    这可以帮助你:

    【讨论】:

    • 添加id 不是最简单的方法,因为您需要在每个请求中传递它,这太疯狂了。
    • 而且,我可以在我的自定义路由器中使用依赖注入吗?例如将ApplicationDbContext 添加到MyRouter 构造函数。
    • AFAIK, IRouters 在应用程序启动时创建。在 DbContext 上创建并保留单个实例不是一个好主意....RouteContextVirtualPathContext 都有 Context 属性,这是熟悉的 HttpContext,它有两个 IServiceProvider-s - ApplicationServicesRequestServices - 最好向他们询问您的 DbContext 实例。更好的是——创建一些缓存服务,将少量路由数据保存在内存中,并通过计时器或请求重新读取。
    • 好的,我可以访问应用程序中的每个服务似乎很好。
    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2019-09-29
    • 2014-02-23
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多