It is very easy to integrate OpenAccess ORM as a persistence solution and use it from a ServiceStack web service. Let’s start with the setup of ServiceStack. You could use the NuGet package manager to do that:
Install-Package ServiceStack
Before moving to the implementation of the service we will register it together with its dependencies. The following code snippet should be added under the Global.asax.cs file:
public
class
MayLilyAppHost : AppHostBase
{
public
MayLilyAppHost()
:
base
(
"OpenAccess ORM and ServiceStack integration sample"
,
typeof
(MayLilyAppHost).Assembly)
{
}
public
override
void
Configure(Container container)
{
container.RegisterAutoWiredAs<Configuration, IConfiguration>().ReusedWithin(ReuseScope.Container);
container.RegisterAutoWiredAs<MayLilyMetadataSource, IMetadataSource>().ReusedWithin(ReuseScope.Container);
container.RegisterAutoWiredAs<MayLilyContext, IDbMigrator>().ReusedWithin(ReuseScope.None);
container.RegisterAutoWiredAs<MayLilyContext, IMayLilyContext>().ReusedWithin(ReuseScope.None);
}
}
public
static
class
AppBootstrapper
{
public
static
void
Start()
{
MayLilyAppHost appHost =
new
MayLilyAppHost();
appHost.Init();
IDbMigrator migrator = appHost.Container.Resolve<IDbMigrator>();
migrator.MigrateSchema();
migrator.SeedData();
}
}
public
class
Global : HttpApplication
{
protected
void
Application_Start(
object
sender, EventArgs e)
{
AppBootstrapper.Start();
}
}
There are three parts in a ServiceStack service: Request DTO, Response DTO and the service implementation. In this blog post we will read category data filtered based on its identity. This means we need an appropriate request DTO:
[Route(
"/get-category/{CategoryID}"
, Verbs =
"GET"
)]
public
class
GetCategory
{
public
int
CategoryID
{
get
;
set
;
}
}
The service will return the following response DTO:
public
class
GetCategoryResponse
{
public
CategoryDto Result
{
get
;
set
;
}
public
ResponseStatus ResponseStatus
{
get
;
set
;
}
}
public
class
CategoryDto
{
public
int
Id
{
get
;
set
;
}
public
string
Name
{
get
;
set
;
}
public
string
Description
{
get
;
set
;
}
}
Note the name of the response DTO. It is constructed by appending Response to the request DTO name. This is the convention used by ServiceStack. To support automatic exception handling a ResponseStatus property is added to the response DTO class.
And here the implementation of the service itself:
public
class
CategoryService : Service
{
private
readonly
IMayLilyContext context;
public
CategoryService(IMayLilyContext context)
{
this
.context = context;
}
public
object
Get(GetCategory request)
{
Category result =
this
.context.Categories.Find(request.CategoryID);
if
(result ==
null
)
{
throw
HttpError.NotFound(
string
.Format(
"Unable to find category with id {0}."
, request.CategoryID));
}
return
new
GetCategoryResponse
{
Result =
new
CategoryDto
{
Id = result.Id,
Name = result.Name,
Description = result.Description
}
};
}
public
override
void
Dispose()
{
this
.context.Dispose();
}
}
If everything is configured correctly, you could run the service and go to http://[server_uri]/get-category/1 to see your OpenAccess ORM ServiceStack web service in action.
The complete demo application can be found here.