servicestack,C#,.net,servicestack" /> servicestack,C#,.net,servicestack" />

C# 关于基于ServiceStack的服务中类型命名的问题

C# 关于基于ServiceStack的服务中类型命名的问题,c#,.net,servicestack,C#,.net,servicestack,我开始使用ServiceStack来实现web服务API。我试图尽可能多地遵循示例和最佳实践,但有时这并不是那么容易(似乎许多示例尚未更新以遵循这些示例) 我现在拥有的是这样的东西: 名为MyApp.ServiceInterface的程序集,包含服务/方法的实现 名为MyApp.ServiceModel的程序集,包含请求和响应类型以及DTO 在MyApp.ServiceModel程序集中,我有如下示例: namespace MyApp.ServiceModel { public ab

我开始使用ServiceStack来实现web服务API。我试图尽可能多地遵循示例和最佳实践,但有时这并不是那么容易(似乎许多示例尚未更新以遵循这些示例)

我现在拥有的是这样的东西:

  • 名为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; }
        // ...
    }
}
名称空间MyApp.ServiceModel
{
公共抽象类响应库
{
用于错误处理的公共ResponseStatus ResponseStatus{get;set;}//
}
[Route(“/products/{Id}”)]///GET:products/123
[Route(“/products”)]//获取:产品?名称=。。。
公共类ProductRequest:IReturn
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共类ProductResponse:ResponseBase
{
公共类型。产品产品{get;set;}
}
}
命名空间MyApp.ServiceModel.Types
{
公共类产品
{
公共int Id{get;set;}
公共字符串名称{get;set;}
// ...
}
}
问题:

  • 我见过如何命名请求类型的不同方法(例如,
    GetProduct
    ProductRequest
    或只是
    Product
    )。推荐的方法是什么
  • 命名是否以某种方式取决于服务是否为REST服务
  • 将请求和响应类型放入单独的(子)名称空间(例如,
    MyApp.ServiceModel.Requests
    MyApp.ServiceModel.Responses
    )是一个好主意吗
  • 为什么包含名为
    ServiceInterface
    的实现的程序集(难道
    serviceemplementation
    不适合吗)

    • API设计是主观的,因此没有推荐的方法。虽然我个人对我的要求DTOs,因为它有效地为您的Web服务合同。我也不喜欢在服务模型中使用继承来尝试干燥属性,这会隐藏您的意图

      请求DTO的名称不会影响具有自定义路由的REST API,因为使用相同自定义路由的不同请求DTO之间没有外部可见的差异。尽管它在使用时确实会影响表面积,因为它是类型化API的可见部分

      以下是一些答案,它们描述了我对如何设计服务API的偏好:

      DTO中的C#名称空间对API没有明显影响。在ServiceStack中,请求DTO与您的服务映射为1:1,因此它们必须是唯一的,如果您为响应DTO添加“Response”后缀,它们也将是唯一的。我的目标是确保所有DTO(包括操作和类型)的名称都是唯一的,这样无论它们的物理布局是什么都不重要。作为惯例,我现在喜欢将我的操作DTO(即请求/响应)放在服务模型组件的顶层,请求/响应DTO放在同一个C#.cs文件中,而所有其他“DTO类型”放在类型文件夹中,例如:

      • /Products.cs(包含GetProduct和ProductResponse DTO)
      • /类型/Product.cs

      它被称为服务接口,因为它与网关服务模式相匹配,即客户端被称为客户端网关,而服务器被称为服务接口。这里使用的
      接口
      是指服务入口点,而不是C#接口。

      非常感谢!我将不得不阅读和消化所有这些信息,然后可能会提出一些其他问题。一些评论和后续问题:我使用的是端到端类型的客户端-这就是为什么我关心DTO的干净命名。我想我会选择GetProduct/GetProducts、ProductResponse/ProductsResponse和Types.Product。部分混乱是由“错误处理”wiki页面引起的,该页面说要使用GetProduct/GetProductResponse,并且响应应该具有ResponseStatus属性(这就是我引入响应基类的原因)。该页面是否应该更新?还有,创建响应类的基本原理是什么(为什么不简单地返回产品或列表?很抱歉,这不适合继续讨论。我是否应该将其发布到邮件列表/google组?@M4N,如果您希望支持SOAP端点(或能够控制用于错误响应的DTO)您应该继续使用
      Response
      后缀。在不阅读API文档的情况下,能够推断响应DTO也是一个很好的惯例-尽管使用
      IReturn
      标记请求DTO现在是一种更好、更类型化/明确的方法。随着nd仍然将异常封送到类型化客户端(使用通用的ErrorResponse DTO)。@M4N任何新的和/或更具体的问题都应作为StackOverflow的新问题提问。