1

我对 ServiceStack 中的服务合同定义有点困惑。

正如这里提到的https://github.com/ServiceStack/ServiceStack/wiki/SilverlightServiceClient

它可以使用可移植类库或链接项目。(好的,PCL 的限制是不支持[RestService]属性或一般来说,任何外部引用。)

实际上,现在总是有一个RouteAttributeused 而不是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>();
    }
}

现在想想一个香草项目:

  1. 我想有一个地方来定义和共享我的 DTO 和“模型”。我只想定义它们一次,用验证属性等标记它们,然后在任何 silverlight 项目以及我流利的 ​​nhibernate 程序集中重用它们以进行数据访问。这就是我所说的合同大会。这可以是每个技术堆栈的 PCL 或链接项目,在我的例子中:Silverlight 和 .NET 4(服务器端)。我不想每天都生成我的服务客户端,这就是为什么我想做通道工厂方法/服务堆栈客户端的方式。

  2. 除了拥有 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);
    }
}

我的目标是提高应用程序执行时的速度以及编码速度。添加新方法时,我不想有太多的地方或步骤。

我应该做的最佳做法是什么? 欢迎任何提示或经验数据!

非常感谢!

4

0 回答 0