我在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”这样的就绪路由字符串时。
有谁能告诉我怎么做?
答案 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);