ServiceStack - 空请求类?

时间:2013-01-22 14:53:02

标签: servicestack

我对ServiceStack有疑问。为什么有空的请求类,为什么我们必须有一个请求类?例如:

[Route("/test", "GET")]
public class Test
{

}

public class TestResponse
{
    public string Date { get; set; }
}

public class TestService : Service
{
    public object Get(Test test)
    {
        return new TestResponse { Date = DateTime.Now.ToString() };
    }
}

如果我没有通过我的请求传递对象,我的服务会失败吗?

然后我是我的Global.asax文件,我有:

public class AxDataAppHost : AppHostBase
{
    public AxDataAppHost() :
        base("AxData", typeof(TestService).Assembly)
    {
    }
}

如果我有多个服务,在上面的示例中我使用的是TestService,但如果我有一个CustomersOrdersProducts怎么办?我该如何处理多种服务?

1 个答案:

答案 0 :(得分:12)

为什么我们必须有一个请求类?

ServiceStack是一个基于消息的框架,它包含Martin Fowler's Remote Service Best Practices(即远程门面,DTO和网关),它利用ServiceGateway发送粗粒度的请求DTO,这些DTO通常返回一个类型化的响应DTO(尽管services can return anything })。使用基于消息的设计has many advantages,这是启用ServiceStack类型的端到端API的原因。

E.g。您可以通过以下方式重新使用您定义服务的这些类型:

public class Test : IReturn<TestResponse> {}

public class TestResponse
{
    public string Date { get; set; }
}

在客户端上,这就是为您提供没有代码生成的类型化API,例如:

var client = new JsonServiceClient(BaseUri);
TestResponse response = client.Get(new Test());

注意:您甚至不需要自定义路由,因为默认情况下ServiceStack的C#客户端将回退使用pre-defined routes(默认情况下启用)。

如果我有多个服务怎么办?在上面的示例中,我使用的是TestService,但如果我有一个用于客户,订单和产品的服务怎么办?如何处理多项服务?

在您的AppHost基础构造函数中,您传入程序集(即不是单个服务):

public AxDataAppHost() : base("AxData", typeof(TestService).Assembly) {}

这告诉ServiceStack在哪里查找并连接所有服务。您只需为服务所在的每个dll /程序集执行一次此操作。

ServiceStack的AppHosts还允许指定多个程序集,您可以使用这些程序集连接位于多个程序集中的服务,例如:

public AxDataAppHost() 
  : base("AxData", typeof(TestService).Assembly, typeof(ServiceInNewDll).Assembly) {}