4

1つのサービスでリクエストを処理し、それを他のリクエストに変換し、そのリクエストを内部サービスに渡し、応答を取得して、外部サービス応答に戻す必要があります。いくつかのコードはそれをよりよく説明するかもしれません。これは私がしたことです:

public class InviteUserService : Service, IPost<Invitee>
{
    public RegistrationService RegistrationService { get; set; }

    public object Post(Invitee invitee)
    {
        // Do other invitation related work that is part of my domain.

        var registration = invitee.TranslateTo<Registration>();
        registration.UserName = invitee.EmailAddress;
        registration.Email = invitee.EmailAddress;

        // It previously threw a null ref exception until I added this.
        RegistrationService.RequestContext = RequestContext;

        var response = RegistrationService.Post(registration);
        if (response is RegistrationResponse)
        {
            var inviteeResponse = response.TranslateTo<InviteeResponse>();
            return inviteeResponse;
        }
        // Else it is probably an error and just return it directly to be handled by SS.
        return response;
    }
}

上記のコードのコメントが示すように、私が渡す前に、RequestContextそれはNullReferenceExceptionで失敗していました。これで動作するようになりましたが、ServiceStackの動作に関して、上流の戦いに向かっているのではないかと思います。それは私に今後さらに問題を引き起こすでしょうか?

両方のサービスが私の管理下にある場合は、登録コードを別の共有依存関係に移動するだけです。ただしRegistrationService、ServiceStackに組み込まれており、これ以外の方法で呼び出すことはできないようです。私が何かを逃していない限り?

4

1 に答える 1

5

ServiceStackの他のサービスにリクエストを委任する方法は、IOCからサービスを解決し、現在のRequestContextbase.ResolveService<T>を挿入するだけの呼び出しです。これは基本的にあなたがしていることと似ていますが、これはこれを行うための公式APIであるため、他に何かを行う必要がある場合でも維持されます。

このAPIを使用すると、サービスは次のようになります。

public class InviteUserService : Service, IPost<Invitee>
{
    public object Post(Invitee invitee)
    {
        // Do other invitation related work that is part of my domain.

        var registration = invitee.TranslateTo<Registration>();
        registration.UserName = invitee.EmailAddress;
        registration.Email = invitee.EmailAddress;

        // Resolve auto-wired RegistrationService from IOC
        using (var regService = base.ResolveService<RegistrationService>())
        {
            var response = regService.Post(registration);
            if (response is RegistrationResponse)
            {
                var inviteeResponse = response.TranslateTo<InviteeResponse>();
                return inviteeResponse;
            }
            return response;
        }    
    }
}
于 2012-12-04T19:26:18.167 に答える