【问题标题】:breezejs: dynamically switching between OData and WebAPI微风js:在OData和WebAPI之间动态切换
【发布时间】:2013-06-11 18:02:28
【问题描述】:

我在这里遇到了一些棘手的情况。我的应用程序需要访问两个服务。一种是纯 ODATA 服务,另一种是 WebAPI(带有 Breeze 控制器)服务。

我的应用程序是围绕 AngularJS 模块设计的,并且微风被注入到两个不同的单实例服务中:

angular.module('domiciliations.services').
   factory('domiciliationService', function (breeze) {

     breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
     //more initialization goes here

     //then query methods go here
}

angular.module('person.services').
   factory('personService', function (breeze) {

    breeze.config.initializeAdapterInstances({ "dataService": "OData" });

     //more initialization goes here

     //then query methods go here
}

现在很明显的问题是,一旦个人服务被实例化,则 domiciliations 服务就会使用 OData,因为配置已被覆盖。

那么,解决这个问题的一般方法是什么?有没有办法隔离配置? 到目前为止,我能想到的唯一方法是每次调用查询方法时都调用 initializeAdapterinstances 方法,这并不是真正可取的。

编辑

根据 Jay 的建议,我现在正在使用 DataService。我在 ctor.resolve 中遇到错误:

ds.jsonResultsAdapter = ds.jsonResultsAdapter || ds.adapterInstance.jsonResultsAdapter;

ds.adapterInstance 为空,因此这会引发异常。但我不明白为什么它是空的。

这是我所做的:

var service = new breeze.DataService({
            serviceName: 'http://localhost:16361/api/mandates',
            adapterName: 'WebApi'
        });
var manager = new breeze.EntityManager({ dataService: service });

//this is the line causing the later exception:

manager.fetchMetadata().then(function () { ... }

我忘记做某事了吗?

【问题讨论】:

    标签: angularjs breeze


    【解决方案1】:

    好问题!

    initializeAdapterInstance 方法实际上是为了设置“默认”适配器。

    如果您需要多个适配器并在每个查询的基础上应用它们,请参阅 DataService 文档,尤其是 ctor 中的 'adapterName' 属性。您可以拥有两个 DataService,一个用于 OData,一个用于 WebApi。然后,您可以通过 EntityQuery.using 方法将任一查询用于任何查询。

     var odataDataService = new DataService({
           serviceName: "Foo",
           adapterName: "OData"
     });
     var webApiDataService = new DataService({
           serviceName: "Bar",
           adapterName: "WebApi"
     });
    
     var query1 = EntityQuery.from(...).where(...);
     var query2 = EntityQuery.from(...).where(...);
    
     entityManager.executeQuery(query1.using(odataDataService)).then(...)
     entityManager.executeQuery(query2.using(webApiDataService)).then(...)
    

    【讨论】:

    • @@Jay,这听起来不错,尽管我仍然必须在查询级别指定要使用的服务(最好在经理级别指定,如果经理没有分享同样的微风实例)。不过,我在使用此代码时遇到错误,请参阅我更新的帖子。知道有什么问题吗?
    • 不确定发生了什么,但在上面的示例中,EntityManager.fetchMetadata 调用不将“dataService”作为参数。 MetadataStore.fetchMetadata 调用确实如此(请参阅 api 文档)。基本上,entityManager 有一个“默认”数据服务。可以通过 EntityManager.setProperties 调用更改此默认值。 entityManager 有一个 metadataStore,它本身可以拥有来自各种 dataServices 的元数据。
    • 我让它工作了,但我不明白发生了什么。我必须在创建 EntityManager 之前编写那行代码:微风.config.initializeAdapterInstances({ "dataService": "WebApi" });为什么我现在使用 DataService 还需要初始化默认适配器?
    • 现在我正在使用 DataService,实际上在调用 SaveChanges() 时出现错误:ReferenceError: « AutoGeneratedKeyType » 在匿名函数中未定义 (localhost:1502/Scripts/libs/breeze/适配器/breeze.dataService.webApi.js:184:13)
    • AutoGeneratedKeyType.None 被用在轻风.dataService.webApi.js 中,但 AutoGeneratedKeyType 枚举实际上是在微风.debug.js 中定义的。有些东西我不太明白。
    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2017-02-11
    • 2013-08-04
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多