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 が挿入されています)。任意の Service 内から、 を使用して別のすべてのサービスを実行できます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を使用して Service を呼び出すことができます。

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 に答える