6

我正在寻找使用breathjs,并对其功能和附带的最佳实践有一些疑问。

  1. 服务器端元数据是否必须存在?如果我有一个非 EF WebApi 控制器,我还需要用 ProviderContext 包装它并实现元数据吗?如果是这样,元数据的格式是什么?
  2. 如果我能够在服务器端省略元数据而只实现可查询的操作过滤器,我还能编写客户端代码来定义元数据吗?我在哪里可以找到有关如何执行此操作的信息?
  3. 我有一个名为 Job 的服务器模型类,它有一个 ID 和名称,它们是简单的属性和一个名为 Company 的对象属性,它指向一个名为 Company 的服务器端模型类,它有一个 ID 和名称。Job(s) 可以是机密的(通过 Job 上的布尔 IsConfidential 属性),在这种情况下,即使他们仍然有 companyId,该属性也不应该发送给客户端。相反,应该有一个名为 CompanyName 的服务器端计算属性(基本上是 Company.Name 用于非机密作业,“Confidential”用于机密作业)发送到客户端。管理员角色用户应该能够查看和编辑 CompanyId,但普通用户不应该能够查看或发布/放置该值。你如何在微风中做到这一点?微风是否可以很好地处理发送和接收非模型视图模型(更少的属性和一些计算的属性)?
  4. ODataActionFilter 的源代码的来源是我可以出于任何我想要的目的使用和更改的吗?
  5. 为 EF 以外的东西创建 WebApi 控制器会有多困难——比如 Telerik OpenAccess?

谢谢

4

3 回答 3

6

Pawel 的帖子是正确的,您应该先致电

微风.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

1 您可以在客户端上配置元数据。要关闭服务器元数据,请尝试以下操作:

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

2 请查看 Breeze 文档和 API。从这里开始EntityType和这里​​扩展实体

于 2012-11-28T15:36:25.257 回答
2

根据问题 3:有几种可能的方法。

第一个是您可以将不是“实体”的对象返回给客户端,这些对象几乎可以是任何形状。因此,您可以确定要包含或排除哪些属性。基本上,从服务器返回的任何无法找到匹配客户端元数据的对象都将作为匿名 json 对象返回。请注意,这些匿名对象不会被任何绑定库(即 ko、backbone、angular 等)包装,并且这些对象不会被添加到 entityManager 缓存中。

第二种选择是使用 json.net 序列化拦截点。(请参阅json.net 帮助)。这将允许您有条件地抑制选定属性的序列化。请注意这一点,因为如果您尝试重新保存在“清理”后返回给客户端的任何实体,您将需要在完成保存之前将这些属性恢复为其原始值(在服务器上)。

根据问题 4:微风是开源的,可在 github 上找到。您可以自由使用源代码。

根据问题 5:在最新版本的微风.webApi.dll 中,我们已经从我们的基本 webApi 功能重构了我们的 EF 特定代码,正是为了这个目的。我们尚未完成对此的记录,但您可以查看 Breeze.webApi 项目中的“ContextProvider”和“EFContextProvider”类,以了解其他提供程序的外观。我们计划在不久的将来某个时候为 mongodb 之类的东西展示一个 NoSQL 提供程序。请为微风用户的声音投票,以获得该领域的任何具体建议。

于 2012-11-29T23:34:25.343 回答