2

ルートを登録する ServiceStack のベスト プラクティスを知りたいです。

  1. AppHost で Routes.Add を使用してルートを定義する
  2. DTO の RouteAttiribute デコレーターを使用してルートを定義する

ルート定義を DTO から分離するため、AppHost でそれを行うことが望ましい場所をいくつか読みました。しかし、私が目にするほとんどの例はデコレータ パターンを使用しています。

それで、どれが良いですか?どちらか一方を使用する引数はありますか?

4

1 に答える 1

5

ルート属性で DTO を装飾することがベスト プラクティスになりましたSerivceStack の「新しい API」のリリースは、これの多くの利点を示していますが、最も重要なことは、より「簡潔で型指定されたエンド ツー エンドのクライアント API」を促進することです。

IReturnIReturn<T>またはインターフェースのいずれかで DTO をマークすることに加えて Route 属性を使用することでIReturnVoid、現在 ServiceStack によって提供されているすべての機能を使用できます。

利点

  • DTO のみに基づいて、エンドポイントを使用する URL を動的に検出できます。
  • 消費するサービス クライアント コード (c# の場合) がより厳密に型指定され、既存のルート/DTO を変更するのが簡単になります。
  • AppHost をクリーンでスリムに保ちます。私は、AppHost のコードが少ないほど良いと信じています。
  • コードがよりテストしやすくなる
  • AppHost にルートを追加することと並行して機能します (1 つだけを選択する必要はありません)。
  • そして何よりも、すべてが機能します。

特定の DTO に対して、ToUrl 拡張メソッドを使用して、属性を検出してルートを生成できます。

[Route("/route/{Id}/{Name}")]
public class ExampleDTO : IReturn
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

var url = new ExampleDTO() { Id = 1, Name = "Test", Value = "Foo" }.ToUrl("GET"); 
// generates  /route/1/Test?value=Foo

ServiceClients は、これらすべてを内部で行います。消費するコードは次のようになります。

ExampleDTO response  = new JsonServiceClient(“http://api.com/)
   .Get(new ExampleDTO() { Id = 1, Name = "Test", Value = "Foo" });

デカップリングについてはどうですか? 私は、ルートから DTO を分離する大きな必要性はないと主張します。ルートを変更せずにリクエストを変更してはならないことを、仲間の開発者に知ってもらいたいです。DTO を変更した後に AppHost のルートを更新するのを忘れたため、多くのランタイム エラーが発生しました。

于 2013-08-02T13:32:29.700 に答える