2

REST と ServiceStack を学習し、この例のスキーマを構築する方法について提案を求めています。

これらのフィールドを持つUserオブジェクトがあります:

public class User
{
   public string ID {get;set;
   public string Name {get;set;}
   public List<int> OrderID {get;set;}     // inner collection
   //  all other fields
 }

私はServiceクラスを持っています:

public class UserService : Service
{
   public List<User> Get(User UserRequest)
   {
      List<User> lstUsers = // Somehow polulate a collection of Users
      return  lstUsers;
   }

   // Other functions
 }

および AppHost ファイル (今のところ自己ホスト)

 public UserHost : AppHostHttpListenerBase
 {
     public override void Configure(Funq.Container container)
     {
            Routes
               .Add<User>("/UserInfo")
               .Add<User>("/User/{ID}");
      }
  }

クライアント (ブラウザ) は空の「ユーザー」リクエストを送信し、オブジェクトのコレクションを受け取りUserますが、追加する必要があるのは特定のUserリクエストを取得することです。たとえば、特定のUserID を持つすべての注文を受信 (および変更) したいとします。

たとえばUser、ID = 2 のコレクションには 10 がありOrderIDます。したがって、/MyHost/2/Orders のような URI を作成すると、Orderオブジェクトのコレクションが返されます。

私はすでに別の DTO オブジェクトを追加して、次のOrderようなルートにバインドしようとしました。

  Route.Add<Order>("/User/{ID}/Oders")

しかし、それは機能しません。画面 (少なくともブラウザー) は常に空白のままで、SS から応答がないようです。

それはRESFullのやり方ですか?ServiceStack にどのように実装できますか? それを行う方法を少しコード例(回路図でも)提供できますか?

4

1 に答える 1

3

特定のユーザーの注文のリストを返したい場合、URL へのバインド"/User/{ID}/Orders"は RESTful な方法です。

ServiceStack では、通常、リクエスト クラスとレスポンス クラスを定義することを好みます。ここで、リクエスト クラスには可能なすべての入力パラメータがあり、レスポンスは結果のオブジェクトを定義します。多くの場合、これらUserは例のように組み合わせることができます。

{ID}URL はユーザー ID を参照するため、名前を付けて、{UserID}リクエスト クラスにこのプロパティを設定することをお勧めします。

Orderおそらく、クラスに UserID を持つことができます:

public class Order
{
    public string ID { get; set; } // order ID
    public string UserID { get; set; } // user ID - also request param
    // ...
}

Routes.Add<Order>("/User/{UserID}/Oders");

これで、URL の UserID が UserID プロパティにマップされ、それを使用してデータベースなどにクエリを実行できます。

通常、各リクエスト クラスは、アプリ ロジックを持つ別のサービス クラスに対応します。したがって、

  • Userあなたが持っているのでUserService : RestServiceBase<User>
  • ありOrderますOrderService : RestServiceBase<Order>

ServiceStack は、この URL マッピングを確認すると、特定の URLRoutes.Add<Order>("/User/{UserID}/Oders")を呼び出す必要があることを認識しOrderServiceます。

public class OrderService : RestServiceBase<Order>
{
    public override object OnGet(Order request)
    {
        // ...
    }
}
于 2012-12-23T16:07:25.403 に答える