3

我在 ServiceStack 中有这样的 DTO

[Route("/skillslist/{TaskTypeId*}", WebMethods.Get)]
public class GetSkillsList : IReturn<List<SkillDto>>
{
    public long? TaskTypeId { get; set; }
}

和这样的服务方法

public List<SkillDto> Get(GetSkillsList request){...}

在另一个不相关的方法中(在同一个程序集中的另一个服务上,同一个主机上),我想触发上述路由并得到它的结果,当我只有一个准备好的路由字符串,比如“/skillslist/5”。

谁能告诉我该怎么做?

4

1 回答 1

5

ServiceStack 中的服务本质上只是普通的自动连接类(注入了当前的 RequestContext)。从任何服务内部,您可以使用所有其他服务base.ResolveService<TService>,例如:

public object Any(AnotherRequest request)
{
    using (var service = base.ResolveService<GetSkillsService>())
    {
        List<SkillDto> results = service.Get(new GetSkillsList { ... });
    }
} 

注意:这只是一个标准的 C# 方法调用,即它只是从 IOC 解析服务并执行它,因此没有性能损失,因为它不执行任何 HTTP 或 DTO 反/序列化等。

在 ServiceStack 之外(例如在 MVC 中),您可以使用AppHostBase.ResolveService调用服务,例如:

using (var service = AppHostBase.ResolveService<GetSkillsService>(HttpContext.Current))
{
    List<SkillDto> results = service.Get(new GetSkillsList { ... });
}

仅使用路径信息执行服务

1)获取IRestPath

var controller = EndpointHost.Config.ServiceController;
var restPath = controller.GetRestPathForRequest("GET","/skillslist/5");

2)创建一个新实例:

var queryString = new Dictionary<string,string>();
var request = restPath.CreateRequest("/skillslist/5", queryString, null); 

3)然后执行它:

var response = controller.Execute(request, base.RequestContext);
于 2013-11-06T18:43:57.463 回答