我不太确定dto是否应该是poco,或者它可以取决于任何技术。我在想,最好把它们作为poco来支持松耦合,并确保它可以与任何技术一起工作。
服务栈文档中提到:
中定义web服务的请求和响应DTOServiceStack是标准的POCO,而实现只需要从可测试且无依赖的IService继承。作为将DTO保存在独立的无依赖的。dll中的奖励,你可以在c#/中重用它们。. NET客户端提供没有任何代码生成的强类型API。还有你的DTO服务栈不会污染您的web服务使用任何额外的自定义构件或标记
但是如果你看到DTO的实际实现,它依赖于服务堆栈。
[Route("/todos")]
[Route("/todos/{Ids}")]
public class Todos : IReturn<List<Todo>>
{
public long[] Ids { get; set; }
public Todos(params long[] ids)
{
this.Ids = ids;
}
}
[Route("/todos", "POST")]
[Route("/todos/{Id}", "PUT")]
public class Todo : IReturn<Todo>
{
public long Id { get; set; }
public string Content { get; set; }
public int Order { get; set; }
public bool Done { get; set; }
}
我完全混淆了文档中提到的内容和实际实现的内容。为什么我们要让DTO依赖技术,最好让他们保持清洁和技术独立。
我的理解可能完全错了。
添加到DTO的任何元数据属性都存储在依赖和不含impl的ServiceStack中。接口的项目。注释dto的好处是c#客户端可以重用新API中的自定义路由属性,并使用漂亮的url调用服务,而不是使用回退的预定义路由。
IReturn<T>
接口标记允许更简洁的类型API调用,如本回答所示。
你不需要使用属性,因为你可以使用ServiceStack内置的流畅API来定义自定义路由,例如:
public void Configure(Container container)
{
Routes
.Add<Todos>("/todos")
.Add<Todos>("/todos/{Id}")
.Add<Todo>("/todos", "POST")
.Add<Todo>("/todos/{Id}", "PUT");
}