2

ServiceStackで API を構築しています。各リクエストに一意の ID を付けて、システム (分散されている) を追跡できるようにしたいと思います。

私は自分の API の DTO を含むコントラクト アセンブリを持っているのでRequest、新しい ID を割り当てたシールされた保護されたパラメーターなしのコンストラクターを持つ基本クラスからそれぞれを派生させるのが自然な場所だと思いました (おそらく GUID は問題ありません)。

ただし、コントラクト DTO アセンブリを必ずしも使用しなくても、クライアント経由で API を使用することは可能です。その時点で、クライアントは好きな ID を割り当てることができます (プロパティは対応する文字列であり、ID の割り当てを迅速に行いたいため)。

そのため、リクエストがシステムに到着したときに、サービスがリクエスト ID を割り当てる必要があると思います。そのため、現在、最善の方法は、API によって空であることが検証された各リクエスト DTO に ID プロパティを設定することだと考えています。クライアントはそれを設定できません。次に、DTO プロパティに値を割り当てるための before-everything フィルター。

それは賢明ですか?

それを行うためのよりエレガントな方法はありますか (それはまだ裸のクライアントに対して機能しますか?)?

4

1 に答える 1

2

グローバルリクエストフィルターを使用するとうまくいきます。次のようなことができます:

public class IRequiresUniqueId
{
    public Guid UniqueId { get; set; }
}

次に、上記のインターフェースを実装して、一意の ID を取得したいすべてのリクエスト DTO をマークします。

public MyRequest : IRequiresUniqueId
{
    public Guid UniqueId { get; set; }
}

次に、グローバル リクエスト フィルターを使用して、それらを持つすべてのリクエスト DTO を設定できます。

this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
     var requiresUniqueId = requestDto as IRequiresUniqueId;
     requiresUniqueId.UniqueId = Guid.NewGuid();
});
于 2013-07-05T14:47:59.700 に答える