C# 关于基于ServiceStack的服务中类型命名的问题
我开始使用ServiceStack来实现web服务API。我试图尽可能多地遵循示例和最佳实践,但有时这并不是那么容易(似乎许多示例尚未更新以遵循这些示例) 我现在拥有的是这样的东西:C# 关于基于ServiceStack的服务中类型命名的问题,c#,.net,servicestack,C#,.net,servicestack,我开始使用ServiceStack来实现web服务API。我试图尽可能多地遵循示例和最佳实践,但有时这并不是那么容易(似乎许多示例尚未更新以遵循这些示例) 我现在拥有的是这样的东西: 名为MyApp.ServiceInterface的程序集,包含服务/方法的实现 名为MyApp.ServiceModel的程序集,包含请求和响应类型以及DTO 在MyApp.ServiceModel程序集中,我有如下示例: namespace MyApp.ServiceModel { public ab
- 名为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
- /Products.cs(包含GetProduct和ProductResponse DTO)
- /类型/Product.cs
- API设计是主观的,因此没有推荐的方法。虽然我个人对我的要求DTOs,因为它有效地为您的Web服务合同。我也不喜欢在服务模型中使用继承来尝试干燥属性,这会隐藏您的意图
请求DTO的名称不会影响具有自定义路由的REST API,因为使用相同自定义路由的不同请求DTO之间没有外部可见的差异。尽管它在使用时确实会影响表面积,因为它是类型化API的可见部分
以下是一些答案,它们描述了我对如何设计服务API的偏好:
它被称为服务接口,因为它与网关服务模式相匹配,即客户端被称为客户端网关,而服务器被称为服务接口。这里使用的
接口
是指服务入口点,而不是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的新问题提问。