1

我不太确定天气 DTO 应该是 POCO,或者它可以依赖于任何技术。我在想,最好将它们保留为 POCO,以支持松耦合并确保它适用于任何技术。

从服务堆栈文档中提到:

用于在 ServiceStack 中定义 Web 服务的请求和响应 DTO 是标准的 POCO,而实现只需要从可测试且无依赖的 IService 继承即可。作为将 DTO 保存在单独的无依赖项 .dll 中的一个好处,您可以在提供强类型 API 的 C#/.NET 客户端中重用它们,而无需任何代码生成。此外,您的 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 依赖于技术,最好保持它们的清洁和技术独立。

我的理解可能完全错误。

4

1 回答 1

3

添加到 DTO 的任何元数据属性都存储在依赖项和 impl-free ServiceStack.Interfaces项目中。注释 DTO 的好处是可供C# 客户端使用,这些客户端能够重用新 API中的自定义路由属性并使用漂亮的 url 而不是回退预定义路由调用服务。

如本答案所示,IReturn<T>接口标记允许更简洁的类型化 API 调用。

您不需要使用属性,因为您可以使用 ServiceStack 的内置 fluent API 来定义自定义路由,例如:

public void Configure(Container container)
{
    Routes
      .Add<Todos>("/todos")
      .Add<Todos>("/todos/{Id}")
      .Add<Todo>("/todos", "POST")
      .Add<Todo>("/todos/{Id}", "PUT");
}
于 2013-05-01T13:04:48.263 回答