我对 ServiceStack 中的服务合同定义有点困惑。
正如这里提到的https://github.com/ServiceStack/ServiceStack/wiki/SilverlightServiceClient
它可以使用可移植类库或链接项目。(好的,PCL 的限制是不支持[RestService]
属性或一般来说,任何外部引用。)
实际上,现在总是有一个RouteAttribute
used 而不是RestServiceAttribue
.
有一个新的 API: https ://github.com/ServiceStack/ServiceStack/wiki/New-Api
因此,可以直接使用泛型或类型来代替MyCall
,MyCallResponse
和类,例如:MyCallService
[Route("/reqstars")]
public class AllReqstars : IReturn<List<Reqstar>> { }
public class ReqstarsService : Service
{
public List<Reqstar> Get(AllReqstars request)
{
return Db.Select<Reqstar>();
}
}
现在想想一个香草项目:
我想有一个地方来定义和共享我的 DTO 和“模型”。我只想定义它们一次,用验证属性等标记它们,然后在任何 silverlight 项目以及我流利的 nhibernate 程序集中重用它们以进行数据访问。这就是我所说的合同大会。这可以是每个技术堆栈的 PCL 或链接项目,在我的例子中:Silverlight 和 .NET 4(服务器端)。我不想每天都生成我的服务客户端,这就是为什么我想做通道工厂方法/服务堆栈客户端的方式。
除了拥有 DAL(这不是我的问题的一部分)之外,我还想为服务逻辑本身提供一个单独的程序集。合同和业务逻辑的严格分离。我注意到的第一件事是,我无法找到任何匹配的 nuget-package 来从
Service
(ServiceStack 一个)继承我的服务实现,而不会收到程序集垃圾邮件。最后,我决定使用:PM> Install-Package ServiceStack.Host.AspNet ....
成功将“Microsoft.Web.Infrastructure 1.0.0.0”添加到 HR.RoBP.Services。
成功将“WebActivator 1.5.3”添加到 HR.RoBP.Services。
成功将“ServiceStack.Redis 3.9.35”添加到 HR.RoBP.Services。
成功将“ServiceStack.OrmLite.SqlServer 3.9.35”添加到 HR.RoBP.Services。
成功将“ServiceStack 3.9.35”添加到 HR.RoBP.Services。
成功将“ServiceStack.Host.AspNet 3.9.33”添加到 HR.RoBP.Services。
并删除了项目中还添加的文件(App_Start、jquery...等)。
Service 项目由 Host 项目引用和托管。
路由应该在哪里完成? 现在我必须在合同中或在主机程序集中手动完成。我假设服务应该说明它应该如何访问/路由。
我应该将请求/响应模式类移动到服务程序集中吗?
我的方法完全错误吗?
在我使用 WCF 之前。我在合同程序集中有我的模型、请求/响应和 IService 定义,在服务程序集中实现了 IService。主机只需要一个 .svc 文件,它就可以工作。我也能够在没有任何通信框架的情况下直接调用服务(例如,从命令行应用程序而不实例化 wcf 端点)来使用它。
var result = new MyCallService().Execute(new MyCall() { MyParamater="Value"})
对比
var result = new MyCallService().MyCall("Value");
我是否应该介绍 IMyCallService 的老式方式,实现它,并在 MyCallService (ServiceStack) Execute() 方法中调用它,使用 ioc 的东西......
public class MyCallSevice : Service
{
// use DI
[Import]
public IMyCallService ServiceInstance { private get; set; }
public MyCallResponse Execute(MyCall request)
{
return new MyCallResponse(ServiceInstance.MyCall(request.MyParameter));
}
}
// or use the Request Response directly in the Service? so that it looks like this:
public class MyCallSevice : Service
{
// use DI
[Import]
public IMyCallService ServiceInstance { private get; set; }
public MyCallResponse Execute(MyCall request)
{
return ServiceInstance.MyCall(request);
}
}
我的目标是提高应用程序执行时的速度以及编码速度。添加新方法时,我不想有太多的地方或步骤。
我应该做的最佳做法是什么? 欢迎任何提示或经验数据!
非常感谢!