9
votes

I have a question regarding ServiceStack. Why are there empty Request Classes, why do we have to have a Request Class? For example:

[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() };
    }
}

If I don't pass an object with my request, my service fails?

Then I'm my Global.asax file, I have:

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

What if I have more than 1 service, in the example above I'm using TestService but what if I have one for Customers, Orders and Products? How do I handle multiple services?

1

1 Answers

12
votes

why do we have to have a Request Class?

ServiceStack is a message-based framework that embraces Martin Fowler's Remote Service Best Practices (i.e. Remote Facade, DTOs and Gateway) which utilizes a ServiceGateway to send coarse-grained Request DTOs which commonly returns a typed Response DTO (though services can return anything). Using a message-based design has many advantages and is what enables ServiceStack's typed end-to-end API.

E.g. you can re-use these types you defined your services with:

public class Test : IReturn<TestResponse> {}

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

On the client, which is what gives you a typed API without code-gen, e.g:

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

Note: you don't even need custom routes as by default ServiceStack's C# clients will fallback to use the pre-defined routes (enabled by default).

What if I have more than 1 service, in the example above I'm using TestService but what if I have one for Customers, Orders and Products? How do I handle multiple services?

In your AppHost base constructor you're passing in an assembly (i.e. NOT a single service):

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

This tells ServiceStack where to look for and wire-up all your services. You only need to do this once for each dll/assembly that your services are in.

ServiceStack's AppHosts also allows specifying multiple assemblies which you can use to wire-up services located in multiple assemblies, e.g:

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