研读了官方示例的ServiceStack.Examples 和 ServiceStack.Northwind,总结如下的项目方案结构,这种方式比较适合较大的项目,并且规范化很好,易于扩展和对接。
根据ServiceStack官方示例项目,总结出如下项目规范:
项目目录结构,以产品管理模块示例:
需要建立三个项目:
>> Product.Web
>> Product.ServiceInterface
>> Product.ServiceModel
1 对外接口
Product.Web 中提供对外API接口,以及一般处理程序,也可以将测试页面和简单界面放在这个项目中。
全局环境配置Gloabl.asax在Product.Web 项目中,这个项目提供的服务可以对接到其他的手机、软件及第三方网站。
2 内部服务和接口
Product.ServiceInterface 中放置服务,同时也是内部调用的(dll模式)接口。
定义的服务例如
public class OrdersService : ServiceStack.ServiceInterface.Service
3 类定义文件(包括POJO类和DTO类)
Product.ServiceModel 是入口类定义和出口类定义,及实体类的定义
入口类、路由定义在Operations目录下的文件中,例如Operations/Order.cs文件中内容如下:
[Route("/customers")]
public class Customers
{
}
public class CustomersResponse : IHasResponseStatus
{
public CustomersResponse()
{
this.ResponseStatus = new ResponseStatus();
this.Customers = new List<Customer>();
}
public List<Customer> Customers { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
一般情况下将一个服务用到的入口类和出口类写在一个文件中,如果是复杂和聚合的数据,需要把类的调用关系通过定义属性,并且在构造函数中初始化该属性。
路由可以使用多重路由,对于类似的,有不同参数的操作
比如获取全部记录、按ID指定的一条、按关键字搜索的结果,以及分页方式获取的数据可以写成一组路由公用一个入口类。
[Route("/orders")]
[Route("/orders/page/{Page}")]
[Route("/customers/{CustomerId}/orders")]
public class Orders
{
public int? Page { get; set; }
public string CustomerId { get; set; }
}
一个模块的组件功能和调用说明图:
多个模块及项目装配(以及通用库)