2

システム環境で使用したい REST サービスとして ServiceStack を評価していますが、これまでのところ非常に満足しています。サービスの要件は、特定のユーザーまたはユーザー グループのフィールドを非表示にすることです。ユーザーが持っているキー/セッションによっては、データ モデルのすべてのフィールドがクライアントに返されるわけではなく、サービス スタックによって非表示にする必要があります。したがって、Linq2SQL からデータ オブジェクト (リスト) を受け取った後、リフレクションを使用してオブジェクトを分析し、オブジェクト メンバーを抽出し、非表示になるはずのメンバーを無視して、他のメンバーを辞書に追加します。その後、ディクショナリを ServiceStack に渡し、それをシリアル化し、データ構造をクライアントに送信します。

このセットアップに対する私の質問は次のとおりです。

  • これはServiceStackでそれを行う適切な方法ですか、それともすぐに修正される抜け穴を悪用していますか?
  • 同じことを達成するServiceStackの方法はありますか?
  • 推奨できるベストプラクティスはありますか?
4

1 に答える 1

3

ServiceStack でこれを行う適切な方法は、既存のビジネス オブジェクトを使用しようとするのではなく、API の目的で DTO を定義することです。クライアントが辞書プロパティを持つ DTO を返すリストを解析する準備ができている場合は、機能する可能性があります。

これを行う「ServiceStack」の方法の 1 つは、各プロパティが Nullable であるすべての可能なプロパティを使用して、シンプルでフラットな DTO を定義することです。

DTO が次のように定義されている場合:

public class NullablePartials
{
    public Int32? Test1 { get; set; }
    public String Test2 { get; set; }
    public Double? Test3 { get; set; }
}

次のフラグメント:

Dictionary<String, String> MyDtoDictionary = new Dictionary<String, String>();
MyDtoDictionary.Add("Test1", "7");
MyDtoDictionary.Add("Test2", "Value2");
NullablePartials result = MyDtoDictionary.ToJson().FromJson<NullablePartials>();

System.Diagnostics.Debug.WriteLine(MyDtoDictionary.ToJson());
System.Diagnostics.Debug.WriteLine(result.ToJson());

生成:

{"Test1":"7","Test2":"Value2"}
{"Test1":7,"Test2":"Value2"}

null をシリアル化するためのデフォルト設定で、JSON ライブラリとして ServiceStack.Text を使用します。

ベスト プラクティスについては、https://github.com/ServiceStack/ServiceStack/wiki/Advantages-of-message-based-web-servicesを参照してください。ここでは、ServiceStack の哲学について説明しています。特に使用する推奨事項:

コードファースト POCO

ServiceStack はクリーンで再利用可能なコードを促進するため、ほぼすべてのコード ファースト POCO の使用を常に推奨してきました。つまり、同じ POCO を使用できます。

  • リクエストおよびレスポンス DTO 内 (クライアントおよびサーバー上)
  • JSON、JSV、および CSV テキスト シリアライザー
  • OrmLite、db4o、NHibernate のデータモデルとして
  • Redis に格納されたエンティティとして
  • キャッシュとセッションに保存されたブロブとして
  • MQ のサービスにドロップされて実行される
  • 複雑な構成への脱水

POCO を中心に機能が構築されたさまざまなテクノロジを活用することで、前例のないレベルの再利用を提供し、摩擦を減らし、一貫性があり、より使いやすく、合理化が容易なコードベースを促進します。

于 2013-10-02T15:05:10.660 に答える