6

私は Breezejs の使用を検討していますが、その機能とそれに伴うベスト プラクティスに関していくつか質問があります。

  1. サーバー側のメタデータは存在する必要がありますか? 非 EF WebApi コントローラーを使用している場合でも、それを ProviderContext でラップしてメタデータを実装する必要がありますか? もしそうなら、メタデータのフォーマットは何ですか?
  2. サーバー側でメタデータを省略し、クエリ可能な actionfilter を実装するだけでよい場合でも、クライアント側のコードを記述してメタデータを定義できますか? これを行う方法に関する情報はどこにありますか?
  3. ID と名前を持つ Job というサーバー モデル クラスがあります。これは単純なプロパティであり、Company というオブジェクト プロパティは、ID と名前を持つ Company というサーバー側モデル クラスを指します。Job(s) は、(Job のブール型の IsConfidential プロパティを介して) 機密にすることができます。その場合、たとえ companyId が残っていても、そのプロパティをクライアントに送信するべきではありません。代わりに、クライアントに送信される CompanyName (基本的に、非機密ジョブの場合は Company.Name、機密ジョブの場合は「Confidential」) と呼ばれるサーバー側の計算されたプロパティが必要です。管理者ロールのユーザーは CompanyId を表示および編集できる必要がありますが、通常のユーザーはその値を表示または投稿/入力できないようにする必要があります。これをそよ風でどのように達成しますか?そよ風はモデル以外のビューモデル (より少ないプロパティといくつかの計算されたプロパティ) の送受信をうまく処理しますか?
  4. ODataActionFilter のソース コードのソースは、任意の目的で使用および変更できるものですか?
  5. EF 以外のもの (Telerik OpenAccess など) 用に WebApi コントローラーを作成するのはどれほど難しいでしょうか?

ありがとう

4

3 に答える 3

6

Pawel の投稿は正しく、電話することから始めるべきです

Breeze.config.initializeAdapterInstances

実際にクライアント側のメタデータを作成するには、次のように記述します。(簡単な例)。

initializeMetadataStore(myEntityManager.metadataStore);

function initializeMetadataStore(metadataStore) {
    var et = new EntityType({
        shortName: "Person",
        namespace: "Sample_WebApi.Models"
    });
    et.addProperty( new DataProperty({
        name: "personId",
        dataType: DataType.Int32,
        isNullable: false,
        isPartOfKey: true,
    }));
    et.addProperty(new DataProperty({
        name: "firstName",
        dataType: DataType.String,
        isNullable: false,
    }));
    et.addProperty(new DataProperty({
        name: "lastName",
        dataType: DataType.String,
        isNullable: false,
    }));
    et.addProperty(new DataProperty({
        name: "birthDate",
        dataType: DataType.DateTime,
        isNullable: true
    }));
    et.addProperty(new NavigationProperty({
        name: "meals",
        entityTypeName: "Meal",
        isScalar: false,
        associationName: "personMeals"
    }));
    metadataStore.addEntityType(et);

    et = new EntityType({
        shortName: "Meal",
        namespace: "Sample_WebApi.Models"
    });
    et.addProperty(new DataProperty({
        name: "mealId",
        dataType: DataType.Int32,
        isNullable: false,
        isPartOfKey: true,
    }));
    et.addProperty(new DataProperty({
        name: "personId",
        dataType: DataType.Int32,
        isNullable: false,
    }));
    et.addProperty(new DataProperty({
        name: "dateConsumed",
        dataType: DataType.DateTime,
        isNullable: false,
    }));
    et.addProperty(new NavigationProperty({
        name: "person",
        entityTypeName: "Person",
        isScalar: true,
        associationName: "personMeals",
        foreignKeyNames: ["personId"]
    }));
    et.addProperty(new NavigationProperty({
        name: "dishes",
        entityTypeName: "Dish",
        isScalar: false,
        associationName: "mealDishes",
    }));
    metadataStore.addEntityType(et);

    et = new EntityType({
        shortName: "Dish",
        namespace: "Sample_WebApi.Models"
    });
    et.addProperty(new DataProperty({
        name: "dishId",
        dataType: DataType.Int32,
        isNullable: false,
        isPartOfKey: true,
    }));
    et.addProperty(new DataProperty({
        name: "foodName",
        dataType: DataType.String,
        isNullable: false,
    }));
    et.addProperty(new DataProperty({
        name: "servingSize",
        dataType: DataType.Double,
        isNullable: false,
    }));
    et.addProperty(new NavigationProperty({
        name: "food",
        entityTypeName: "Food",
        isScalar: true,
        associationName: "DishFood",
        foreignKeyNames: ["foodName"]
    }));
    metadataStore.addEntityType(et);

    et = new EntityType({
        shortName: "Food",
        namespace: "Sample_WebApi.Models"
    });
    et.addProperty(new DataProperty({
        name: "foodName",
        dataType: DataType.String,
        isNullable: false,
        isPartOfKey: true,
    }));
    et.addProperty(new DataProperty({
        name: "calories",
        dataType: DataType.Int32,
        isNullable: false,
    }));
    metadataStore.addEntityType(et);
}
于 2012-11-28T16:55:56.377 に答える
2

質問3ごと:これにはいくつかの可能なアプローチがあります。

1つ目は、「エンティティ」ではないオブジェクトをクライアントに返すことができ、これらは事実上任意の形状にすることができるということです。したがって、どのプロパティを含めるか、または除外するかを決定できます。基本的に、一致するクライアント側のメタデータが見つからないサーバーから返されたオブジェクトは、anonjsonオブジェクトとして返されます。これらのanonオブジェクトは、ko、バックボーン、angularなどのバインディングライブラリによってラップされず、これらのオブジェクトはentityManagerキャッシュに追加されないことに注意してください。

2番目の方法は、json.netシリアル化インターセプトポイントを使用することです。(json.netヘルプを参照してください)。これにより、選択したプロパティのシリアル化を条件付きで抑制することができます。「サニタイズ」された後にクライアントに返されたエンティティを再保存しようとすると、保存を完了する前にこれらのプロパティを(サーバー上の)元の値に復元する必要があるため、これに注意してください。

質問4によると、そよ風はオープンソースであり、githubで入手できます。ソースは自由に使用できます。

質問5ごと:breeze.webApi.dllの最新バージョンでは、まさにこの目的のために、ベースのwebApi機能からEF固有のコードをリファクタリングしました。これについてはまだ文書化を完了していませんが、Breeze.webApiプロジェクトの「ContextProvider」クラスと「EFContextProvider」クラスを見て、別のプロバイダーがどのように見えるかを確認できます。近い将来、mongodbのようなもののNoSQLプロバイダーを表示する予定です。この分野での具体的な提案については、そよ風のユーザーの声に投票してください。

于 2012-11-29T23:34:25.343 に答える
2

1 クライアントでメタデータを構成できます。サーバーのメタデータを無効にするには、次のようにします。

config.initializeAdapterInstances(
    new DataService({ 
        serviceName: "yourServiceNameHere",
        hasServerMetadata: false }));

2 Breeze のドキュメントと API を参照してください。ここからEntityTypeを開始し、ここからエンティティの拡張

于 2012-11-28T15:36:25.257 に答える