ServiceStack C#强类型客户端DTO

时间:2014-03-01 18:36:44

标签: c# .net visual-studio rest servicestack

此处:Recommended ServiceStack API Structure和此处:https://github.com/ServiceStack/ServiceStack/wiki/Physical-project-structure是有关如何为C#客户端构建项目以重用DTO的建议。

显然,这是通过包含DTO程序集的dll来完成的。我在网上搜索了一个例子,就是Hello World在ServiceStack中为C#客户端使用单独的程序集DTO。也许我应该能够自己解决这个问题,但到目前为止还没有证明这很容易。

几乎所有客户端描述都适用于通用和非类型JSON或其他非基于DTO的客户端。似乎没有人对像我这样的类型化C#客户端感兴趣(甚至我找到的ServiceStack文档)。所以我认为这是一个很好的问题,即使我最终弄明白了。

要清楚,我已构建并运行Hello World示例服务器。我还使用浏览器连接到服务器并与之交互。我还创建了一个可以调用

的客户端空项目

JsonServiceClient client = new JsonServiceClient(myURL);

然后我尝试复制我的DTO定义,没有汇编DLL,因为我没有。我得到ResponseStatus未定义。

显然有些东西缺失(似乎在ServiceStack.Interfaces.dll中定义),如果我可以创建DTO的dll,我认为它将解决所有引用。

任何人都可以深入了解如何为简单的Hello World创建DTO程序集吗?

编辑添加代码:

using ServiceStack.ServiceClient.Web;
namespace TestServiceStack
{
  class HelloClient
  {     public class HelloResponse
    {
      public string Result { get; set; }
      public ResponseStatus ResponseStatus { get; set; } //Where Exceptions get auto-serialized
    }

    //Request DTO
    public class Hello
    {
      public string Name { get; set; }
    }
    HelloResponse response = client.Get(new Hello { Name = "World!" });
  }
}

其中ResponceStatus未定义。

1 个答案:

答案 0 :(得分:0)

我能够通过添加:

找到缺失的符号ResponseStatus
using ServiceStack.ServiceInterface.ServiceModel;

这是构建的完整代码。请记住,我在此过程中发现了其他内容。一旦构建它然后失败,因为我在.NET 3.5环境中使用.NET 4.0环境中的DTO。但这是一个无关的问题。另请注意,此测试代码对响应没有任何作用,它只是使构建工作的一个示例。

using ServiceStack.ServiceClient;
using ServiceStack.ServiceInterface;
using ServiceStack.Text;
using ServiceStack.Service;
using ServiceStack.ServiceHost;
using ServiceStack.WebHost;
using ServiceStack;
using ServiceStack.ServiceClient.Web;
using RestTestRoot;  // This is the name of my DTO assembly.  You will need to insert your own here.
using ServiceStack.ServiceInterface.ServiceModel;

namespace WebApplicationRoot
{

    class HelloClient
    {
        JsonServiceClient hello_client;

        //Request DTO
        public class Hello
        {
            public string Name { get; set; }
        }

        //Response DTO
        public class HelloResponse
        {
            public string Result { get; set; }
            public ResponseStatus ResponseStatus { get; set; } //Where Exceptions get auto-serialized
        }
        //Can be called via any endpoint or format, see: http://mono.servicestack.net/ServiceStack.Hello/
        public class HelloService : Service
        {
            public object Any(Hello request)
            {
                return new HelloResponse { Result = "Hello, " + request.Name };
            }
        }

        //REST Resource 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; }
        }


        public HelloClient(){
        //        ServiceStack gateway = new ServiceStack.ClientGateway(
        //               location.protocol + "//" + location.host + '/ServiceStack.Examples.Host.Web/ServiceStack/');
            hello_client = new JsonServiceClient("http://tradetree2.dnsapi.info:8080/");
            hello_client.Get<HelloResponse>("/hello/MyTestWorld!");
        }
    }
}