ServiceStack - 空请求类?

Cal*_*ass 9 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() };
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class AxDataAppHost : AppHostBase
{
    public AxDataAppHost() :
        base("AxData", typeof(TestService).Assembly)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有超过1个服务的更多,在上面的例子中我使用的TestService,但如果我有什么一个Customers,Orders和Products?我该如何处理多项服务?

myt*_*thz 12

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

ServiceStack是一个基于消息的框架,包含Martin Fowler的远程服务最佳实践(即远程门面,DTO和网关),它利用ServiceGateway发送粗粒度的请求DTO,这些DTO通常返回一个类型化的响应DTO(尽管服务可以返回任何内容).使用基于消息的设计具有许多优点,并且是使用ServiceStack的类型化端到端API的原因.

例如,您可以使用以下方法重新使用这些类型:

public class Test : IReturn<TestResponse> {}

public class TestResponse
{
    public string Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

var client = new JsonServiceClient(BaseUri);
TestResponse response = client.Get(new Test());
Run Code Online (Sandbox Code Playgroud)

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

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

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

public AxDataAppHost() : base("AxData", typeof(TestService).Assembly) {}
Run Code Online (Sandbox Code Playgroud)

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

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

public AxDataAppHost() 
  : base("AxData", typeof(TestService).Assembly, typeof(ServiceInNewDll).Assembly) {}
Run Code Online (Sandbox Code Playgroud)

  • 好答案.我同意你引用的模式很重要,通过这种方式塑造服务会带来非常简洁的设计.但是,有时您只需要调用端点.我正在使用OAuth实现对第三方服务器的访问,而在ServiceStack中,我需要将我的请求和回调实现为具有两个空DTO的两个服务.这是正确的方法,还是有更好的方法? (2认同)