breeze服务器端元数据是强制性的还是可以在客户端定义?

时间:2012-11-28 14:44:05

标签: breeze

我正在寻找使用breezejs,并就其功能和随附的最佳实践提出一些问题。

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

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

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

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

2请查看Breeze docs和api。从这里开始EntityTypeExtending Entities

答案 2 :(得分:2)

每个问题3:有几种可能的方法。

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

第二种方法是使用json.net序列化拦截点。 (见json.net help)。这将允许您有条件地禁止所选属性的序列化。请注意这一点,因为如果您尝试重新保存已经“清理”后已返回到客户端的任何实体,则需要在完成保存之前将这些属性恢复为其原始值(在服务器上)。

每个问题4:breeze是开源的,可以在github上找到。您可以自由使用来源。

每个问题5:在最新版本的breeze.webApi.dll中,我们已经从我们的基本webApi功能重构了我们的EF特定代码,正是出于此目的。我们尚未完成对此文档的记录,但您可以查看Breeze.webApi项目中的“ContextProvider”和“EFContextProvider”类,以了解其他提供程序的外观。我们计划在不久的将来某个时候为mongodb展示一个NoSQL提供商。有关此领域的任何具体建议,请在breeze user voice上投票。