c#-有关基于ServiceStack的服务中的类型命名的问题
作者:互联网
我开始使用ServiceStack来实现Web服务API.我正在尝试尽可能多地遵循示例和最佳实践,但是有时这并不那么容易(似乎许多示例尚未更新以遵循new API design).
我目前拥有的是这样的:
>名为MyApp.ServiceInterface的程序集,其中包含服务/方法的实现
>名为MyApp.ServiceModel的程序集,其中包含请求和响应类型以及DTO
在MyApp.ServiceModel程序集中,例如:
namespace MyApp.ServiceModel
{
public abstract class ResponseBase
{
public ResponseStatus ResponseStatus { get; set; } // for error handling
}
[Route("/products/{Id}")] // GET: products/123
[Route("/products")] // GET: products?Name=...
public class ProductRequest : IReturn<ProductResponse>
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ProductResponse : ResponseBase
{
public Types.Product Product { get; set; }
}
}
namespace MyApp.ServiceModel.Types
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
// ...
}
}
问题:
>我看到了如何命名请求类型的不同方法(例如,GetProduct,ProductRequest或仅是Product).推荐的方法是什么?
>命名是否某种程度上取决于服务是否为REST服务?
>将请求和响应类型放入单独的(子)命名空间(例如MyApp.ServiceModel.Requests和MyApp.ServiceModel.Responses)是一个好主意吗?
>为什么包含名为ServiceInterface的实现的程序集(不适合使用ServiceImplementation)?
解决方法:
API设计是主观的,因此没有推荐的方法.尽管我个人dislike appending ‘Request’ suffix确实是我的请求DTO,因为它实际上是您的Web服务合同.我还不喜欢在服务模型中使用继承来尝试对属性进行DRY处理,这会在您的Service Layer which is your most important contract中隐藏意图.
请求DTO的名称不会影响具有自定义路由的REST Apis,因为使用同一自定义路由的不同请求DTO不会在外部看到差异.尽管它在使用end-to-end typed clients时确实会影响表面积,因为它形成了键入的API的可见部分.
以下是一些答案,描述了我对如何设计服务API的偏好:
> Designing a REST-ful service with ServiceStack
> How to design a Message-Based API
DTO中的C#命名空间对您的API没有可见的影响.在ServiceStack请求DTO与服务的映射为1:1时,它们必须是唯一的,如果您为响应DTO附加“ Response”后缀,则它们也将最终也是唯一的.我的目标是确保所有DTO(操作和类型)都具有唯一的名称,因此它们的物理布局无关紧要.按照惯例,我现在想将操作DTO(即请求/响应)放在服务模型程序集的顶层,将请求/响应DTO放在同一C#.cs文件中,而所有其他“ DTO类型”放在类型文件夹,例如:
> /Products.cs(保存GetProduct和ProductResponse DTO)
> /Types/Product.cs
之所以称为“服务接口”,是因为它与“网关服务”模式相匹配,其中您的客户端称为“客户端网关”,而服务器称为“服务接口”.这里使用接口表示服务入口点,而不是C#接口.
标签:servicestack,c,net 来源: https://codeday.me/bug/20191123/2065311.html