有没有办法在ServiceStack中手动调用路由,只使用一个字符串,否则将是其URL?

时间:2013-11-06 18:15:04

标签: c# servicestack

我在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”这样的就绪路由字符串时。

有谁能告诉我怎么做?

1 个答案:

答案 0 :(得分: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);