了解服务栈中的请求生命周期和路由机制
Understanding the request lifecycle and routing mechanism in service stack
背景(你可能想跳过这一点,它在这里只是为了以防你需要上下文)
我从这样的问题中看到
ServiceStack CRUD Service routing Documentation 文档以一种奇怪的方式解释了一些东西,这些东西将我习惯的东西(WebApi 和基于控制器的路由)转化为面向消息的路由机制,要求我们定义请求、响应和服务 class 使用方法来处理每个请求。
我正在将现有代码库从 WebAPI + 基于 OData 的服务转换为服务堆栈,以确定这两种设计所需的差异/建模更改。
问题域
我目前提出的许多请求实际上不需要任何参数(简单的获取请求),但在这种情况下我不得不创建、实例化然后将 DTO 传递给服务方法,因为没有这样的DTO我无法定义路由
为什么?这令人困惑!
DTO、服务中的方法和请求的路由/处理之间的关系是什么,因为我目前在我现有的堆栈中有很多 "service" classes,它们基本上是...
public class FooService : CRUDService<Foo> { /* specifics for Foos */ }
public abstract class CRUDService<T> : ICRUDService<T>
{
public T GetById(object Id) { ... }
public IEnumerable<T> GetAll() { ... }
public T Add(T newT) { ... }
public T Update(T newVersion) { ... }
public bool Delete(object Id) { ... }
}
...我如何从 100 个左右的服务中得到它,使其成为一个功能性服务堆栈实现,因为目前我的理解是我不能将标量值传递给这些方法中的任何一个,我必须始终传递 DTO,请求 DTO 将定义它处理的路由,我必须为我的 API 可以执行的每个可能的操作设置不同的请求和响应 DTO。
这让我觉得我应该求助于 T4 模板来生成各种 DTO,这节省了我现在手动启动数百个基本为空的 DTO 的时间。
我的问题
归结为如何转换我的代码库?
也就是说,这道题的 "sub parts" 实际上是子题,例如:
- 此处的最佳做法是什么?
- 我是不是遗漏了什么,或者我是否有很多工作要做,主要是构建空样板 DTO?
- 服务堆栈如何连接所有这些东西?
有人告诉我它是 "better than the black box of OData / EF",但从表面上看,这似乎隐藏了大量的实现细节。除非我只是对设计理念中的某些东西感到困惑。
ServiceStack 中的每个服务都需要一个具体的请求 DTO,用于定义您的服务合同。
由于 ServiceStack 是一个基于消息的服务框架,Typed Request DTO 是 ServiceStack 如何工作的基础,"captures the Request" 服务被调用,它也被传递下来 through all ServiceStack filters,例如:
请求 DTO 也是能够从任何客户端调用服务所需的全部,包括 MQ Clients:
并且通过遵循 Physical Project Structure that ServiceStack Project templates are configured with where all DTOs are kept in a dependency/impl-free ServiceModel project that ServiceStack's .NET generic Service Clients 可以直接引用以启用端到端类型化 API 而无需代码生成,例如:
var response = client.Get(new MyRequest { ... });
作为 "message" 的 Request DTO 使用 POCO DTO 来定义其合同 better suited for versioning 因为它们可以在不破坏现有 类 的情况下进行扩展并且
由于 Request DTO 是您服务的定义和入口点,因此它也是 ServiceStack 的大多数其他功能的基础,不用说它很重要。
用于代码生成的 Sharp 脚本
如果您有太多 CRUD 服务,您希望为它们自动生成 DTO,我建议您查看 #Script which is a dynamic .NET Scripting language that defaults to a Template language mode that uses familiar JS syntax for expressions and the ideal handlebars syntax for blocks 的模板。
stand-alone Script Support includes Live Preview support whose instant feedback makes it highly productive and also includes built-in support for querying databases.
虽然 OrmLite 是代码优先的 ORM,但它确实包含 T4 support 用于初始生成数据模型。
AutoCRUD Preview
由于您希望生成大量 CRUD 服务,因此您可能需要查看 preview release of AutoCRUD that's now available on MyGet。
它在概念上与“自动查询”相同,您只需要为您的数据库 Table API 实现请求 DTO 定义,而 AutoQuery 会自动提供服务的实现。
背景(你可能想跳过这一点,它在这里只是为了以防你需要上下文)
我从这样的问题中看到 ServiceStack CRUD Service routing Documentation 文档以一种奇怪的方式解释了一些东西,这些东西将我习惯的东西(WebApi 和基于控制器的路由)转化为面向消息的路由机制,要求我们定义请求、响应和服务 class 使用方法来处理每个请求。
我正在将现有代码库从 WebAPI + 基于 OData 的服务转换为服务堆栈,以确定这两种设计所需的差异/建模更改。
问题域
我目前提出的许多请求实际上不需要任何参数(简单的获取请求),但在这种情况下我不得不创建、实例化然后将 DTO 传递给服务方法,因为没有这样的DTO我无法定义路由
为什么?这令人困惑!
DTO、服务中的方法和请求的路由/处理之间的关系是什么,因为我目前在我现有的堆栈中有很多 "service" classes,它们基本上是...
public class FooService : CRUDService<Foo> { /* specifics for Foos */ }
public abstract class CRUDService<T> : ICRUDService<T>
{
public T GetById(object Id) { ... }
public IEnumerable<T> GetAll() { ... }
public T Add(T newT) { ... }
public T Update(T newVersion) { ... }
public bool Delete(object Id) { ... }
}
...我如何从 100 个左右的服务中得到它,使其成为一个功能性服务堆栈实现,因为目前我的理解是我不能将标量值传递给这些方法中的任何一个,我必须始终传递 DTO,请求 DTO 将定义它处理的路由,我必须为我的 API 可以执行的每个可能的操作设置不同的请求和响应 DTO。
这让我觉得我应该求助于 T4 模板来生成各种 DTO,这节省了我现在手动启动数百个基本为空的 DTO 的时间。
我的问题
归结为如何转换我的代码库?
也就是说,这道题的 "sub parts" 实际上是子题,例如:
- 此处的最佳做法是什么?
- 我是不是遗漏了什么,或者我是否有很多工作要做,主要是构建空样板 DTO?
- 服务堆栈如何连接所有这些东西?
有人告诉我它是 "better than the black box of OData / EF",但从表面上看,这似乎隐藏了大量的实现细节。除非我只是对设计理念中的某些东西感到困惑。
ServiceStack 中的每个服务都需要一个具体的请求 DTO,用于定义您的服务合同。
由于 ServiceStack 是一个基于消息的服务框架,Typed Request DTO 是 ServiceStack 如何工作的基础,"captures the Request" 服务被调用,它也被传递下来 through all ServiceStack filters,例如:
请求 DTO 也是能够从任何客户端调用服务所需的全部,包括 MQ Clients:
并且通过遵循 Physical Project Structure that ServiceStack Project templates are configured with where all DTOs are kept in a dependency/impl-free ServiceModel project that ServiceStack's .NET generic Service Clients 可以直接引用以启用端到端类型化 API 而无需代码生成,例如:
var response = client.Get(new MyRequest { ... });
作为 "message" 的 Request DTO 使用 POCO DTO 来定义其合同 better suited for versioning 因为它们可以在不破坏现有 类 的情况下进行扩展并且 由于 Request DTO 是您服务的定义和入口点,因此它也是 ServiceStack 的大多数其他功能的基础,不用说它很重要。
用于代码生成的 Sharp 脚本
如果您有太多 CRUD 服务,您希望为它们自动生成 DTO,我建议您查看 #Script which is a dynamic .NET Scripting language that defaults to a Template language mode that uses familiar JS syntax for expressions and the ideal handlebars syntax for blocks 的模板。
stand-alone Script Support includes Live Preview support whose instant feedback makes it highly productive and also includes built-in support for querying databases.
虽然 OrmLite 是代码优先的 ORM,但它确实包含 T4 support 用于初始生成数据模型。
AutoCRUD Preview
由于您希望生成大量 CRUD 服务,因此您可能需要查看 preview release of AutoCRUD that's now available on MyGet。
它在概念上与“自动查询”相同,您只需要为您的数据库 Table API 实现请求 DTO 定义,而 AutoQuery 会自动提供服务的实现。