Brandon
Brandon

Reputation: 14196

Can I use ServiceStack routes with method parameters instead of a DTO class for every request?

I love the capability of ASP.NET MVC controllers, in terms of being able to add a route attribute that maps a certain part of the URL to a method parameter, i.e.:

[Route("there/are/{howManyDucks}/swimming/in/the/{bodyOfWaterType}")]
public string NotifyDucksSwimming(int howManyDucks, string bodyOfWaterType)
{
 ...
}

Is there an equivalent way of doing this with ServiceStack and skip making a DTO class for each type of request?

Upvotes: 3

Views: 2042

Answers (1)

mythz
mythz

Reputation: 143284

It's a fundamental concept in ServiceStack's message-based design that all Services accept a Request DTO which is what's used to define your Service Contract. Nearly all of ServiceStack's surrounding feature ecosystem is possible because your Service Contract is defined in a separate clean, impl and dependency-free DTO's which is contra to the RPC Services Design WCF, MVC and Web API encourage where your Service Contract is coupled to your Server method implementations.

The Equivalent in ServiceStack would be:

//Request DTO

[Route("/there/are/{HowManyDucks}/swimming/in/the/{BodyOfWaterType}")]
public class NotifyDucksSwimming 
{
    public int HowManyDucks { get; set; }
    public string BodyOfWaterType { get; set; }
}

//Implementation

public object Any(NotifyDucksSwimming request)
{
    //...
}

However stuffing all properties in the /path/info is not great API design, so I'd recommend looking at these answers below for some API design examples:

So I'd opt for a API endpoint that represents a resource, potentially:

[Route("/ducks/{BodyOfWaterType}")]
public class NotifyDucksSwimming 
{
    public int HowManyDucks { get; set; }
    public string BodyOfWaterType { get; set; }
}

In ServiceStack you only need to specify the /path/{info} as all other parameters can automatically be populated by any other means, e.g: QueryString, FormData, Serialized Body, HTTP Param Header Overrides, etc.

So the Custom route above will allow you to call the Service with:

  • /ducks/lake?HowManyDucks=10

No Ceremony Razor Views

Also if this API is only for executing within a Razor page in most cases you don't need a Service at all as ServiceStack lets you call the Razor Pages directly with its No Ceremony Pages feature.

Upvotes: 8

Related Questions