【问题标题】:Is it possible to define routes on model/DTO in ASP.NET Web API (similar to ServiceStack)?是否可以在 ASP.NET Web API(类似于 ServiceStack)中定义模型/DTO 上的路由?
【发布时间】:2016-06-02 19:55:21
【问题描述】:

ServiceStack 的一个特性是我非常喜欢它对 DTO 的关注。您根据 DTO 定义路由,并定义接受 DTO 而不是控制器的服务。但是,我也想迁移到 ASP.NET Core。现在它是开源的,我可以看到一种使 DTO 风格的方法工作的方法(使用不同的控制器解析器)。有没有人做过这样的事情?

【问题讨论】:

  • 我猜你可以通过基于路由中间件实现自己的中间件来做到这一点

标签: c# asp.net asp.net-web-api asp.net-core


【解决方案1】:

它应该是相当直截了当的。您所做的只是根据 DTO 上的属性将路由添加到路由表。举个例子:

[Route("/page/{Id}")]
public class RoutesDemo
{
    ...
}

然后使用以下代码,您可以从 DTO 获取路由值。请注意,我以硬编码 DTO 为例,但您可能希望扫描程序集中的所有类型以查找特定属性以自动获取它们。

然后使用以下代码可以从 DTO 获取路由值:

var type = typeof(RoutesDemo);
var attribute = type.GetTypeInfo().GetCustomAttribute<RouteAttribute>();
if (attribute != null)
{
    // /page/{Id}
    var routeInfo = attribute.Template;
}

从这里您想将此路由数据添加到应用程序的路由表中,记录路由关联的类型,因此一旦路由匹配,您就可以从对象中提取数据(这是记录输入)。

ServiceStack 有一个很好的流畅界面来执行此操作(见下文),但概念完全相同。

Routes
    .Add<Hello>("/hello")
    .Add<Hello>("/hello/{Name}");

我希望这会有所帮助!

【讨论】:

  • 谢谢!我打算去自定义控制器解析器,并根据 DTO 的类型解析控制器。这种方法要简单得多。
【解决方案2】:

我认为您可以通过在应用程序启动时加载所有 DTO 并使用反射迭代它们及其属性。然后您可以修改路由表。听起来不是很困难。

【讨论】:

  • 谢谢,这是我要尝试的第一种方法。
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
相关资源
最近更新 更多