breezejs:在OData和WebAPI之间动态切换

时间:2013-05-24 12:43:59

标签: angularjs breeze

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

我的应用程序是围绕AngularJS模块设计的,而breeze被注入两个不同的单实例服务:

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
}

现在显然问题是,一旦人员服务被实例化,定居服务就会使用OData,因为配置被覆盖了。

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

修改

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

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

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

这就是我所做的:

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 () { ... }

我忘了做某事吗?

1 个答案:

答案 0 :(得分:3)

好问题!

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

如果您需要拥有多个适配器并在每个查询的基础上应用它们,请参阅 DataService 文档,尤其是ctor中的“adapterName”属性。您可以拥有两个DataServices,一个用于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(...)