编程语言
首页 > 编程语言> > c#-有关基于ServiceStack的服务中的类型命名的问题

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