1

我在这里面临一个棘手的情况。我的应用程序需要访问两个服务。一种是纯 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 为 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 () { ... }

我是不是忘了做点什么?

4

1 回答 1

3

好问题!

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

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