[Creation] Use instantiate from objectService

Use instantiate from DomainObjectProvider, to remove redundant
code around DomainObject instantiation.
This commit is contained in:
Victor Woeltjen 2015-11-06 14:23:34 -08:00
parent 81b136eab1
commit cca1928b82
3 changed files with 27 additions and 53 deletions

View File

@ -38,7 +38,7 @@
"provides": "objectService", "provides": "objectService",
"type": "provider", "type": "provider",
"implementation": "objects/DomainObjectProvider.js", "implementation": "objects/DomainObjectProvider.js",
"depends": [ "modelService", "capabilityService", "$q" ] "depends": [ "modelService", "instantiate" ]
}, },
{ {
"provides": "capabilityService", "provides": "capabilityService",

View File

@ -27,8 +27,8 @@
* @namespace platform/core * @namespace platform/core
*/ */
define( define(
["./DomainObjectImpl"], [],
function (DomainObjectImpl) { function () {
"use strict"; "use strict";
/** /**
@ -57,62 +57,36 @@ define(
* *
* @param {ModelService} modelService the service which shall * @param {ModelService} modelService the service which shall
* provide models (persistent state) for domain objects * provide models (persistent state) for domain objects
* @param {CapabilityService} capabilityService the service * @param {Function} instantiate a service to instantiate new
* which provides capabilities (dynamic behavior) * domain object instances
* for domain objects.
* @param $q Angular's $q, for promise consolidation * @param $q Angular's $q, for promise consolidation
* @memberof platform/core * @memberof platform/core
* @constructor * @constructor
*/ */
function DomainObjectProvider(modelService, capabilityService, $q) { function DomainObjectProvider(modelService, instantiate, $q) {
this.modelService = modelService; this.modelService = modelService;
this.capabilityService = capabilityService; this.instantiate = instantiate;
this.$q = $q;
} }
DomainObjectProvider.prototype.getObjects = function getObjects(ids) { DomainObjectProvider.prototype.getObjects = function getObjects(ids) {
var modelService = this.modelService, var modelService = this.modelService,
capabilityService = this.capabilityService, instantiate = this.instantiate;
$q = this.$q;
// Given a models object (containing key-value id-model pairs)
// create a function that will look up from the capability
// service based on id; for handy mapping below.
function capabilityResolver(models) {
return function (id) {
var model = models[id];
return model ?
capabilityService.getCapabilities(model) :
undefined;
};
}
// Assemble the results from the model service and the // Assemble the results from the model service and the
// capability service into one value, suitable to return // capability service into one value, suitable to return
// from this service. Note that ids are matched to capabilities // from this service.
// by index. function assembleResult(models) {
function assembleResult(ids, models, capabilities) {
var result = {}; var result = {};
ids.forEach(function (id, index) { ids.forEach(function (id, index) {
if (models[id]) { if (models[id]) {
// Create the domain object // Create the domain object
result[id] = new DomainObjectImpl( result[id] = instantiate(models[id], id);
id,
models[id],
capabilities[index]
);
} }
}); });
return result; return result;
} }
return modelService.getModels(ids).then(function (models) { return modelService.getModels(ids).then(assembleResult);
return $q.all(
ids.map(capabilityResolver(models))
).then(function (capabilities) {
return assembleResult(ids, models, capabilities);
});
});
}; };
return DomainObjectProvider; return DomainObjectProvider;

View File

@ -25,14 +25,16 @@
* DomainObjectProviderSpec. Created by vwoeltje on 11/6/14. * DomainObjectProviderSpec. Created by vwoeltje on 11/6/14.
*/ */
define( define(
["../../src/objects/DomainObjectProvider"], [
function (DomainObjectProvider) { "../../src/objects/DomainObjectProvider",
"../../src/objects/DomainObjectImpl"
],
function (DomainObjectProvider, DomainObjectImpl) {
"use strict"; "use strict";
describe("The domain object provider", function () { describe("The domain object provider", function () {
var mockModelService, var mockModelService,
mockCapabilityService, mockInstantiate,
mockQ,
provider; provider;
function mockPromise(value) { function mockPromise(value) {
@ -57,18 +59,15 @@ define(
"modelService", "modelService",
[ "getModels" ] [ "getModels" ]
); );
mockCapabilityService = jasmine.createSpyObj( mockInstantiate = jasmine.createSpy("instantiate");
"capabilityService",
[ "getCapabilities" ] mockInstantiate.andCallFake(function (model, id) {
); return new DomainObjectImpl(id, model, {});
mockQ = { });
when: mockPromise,
all: mockAll
};
provider = new DomainObjectProvider( provider = new DomainObjectProvider(
mockModelService, mockModelService,
mockCapabilityService, mockInstantiate
mockQ
); );
}); });
@ -86,10 +85,11 @@ define(
result; result;
mockModelService.getModels.andReturn(mockPromise({ a: model })); mockModelService.getModels.andReturn(mockPromise({ a: model }));
result = provider.getObjects(ids).testValue; result = provider.getObjects(ids).testValue;
expect(mockInstantiate).toHaveBeenCalledWith(model, 'a');
expect(result.a.getId()).toEqual("a"); expect(result.a.getId()).toEqual("a");
expect(result.a.getModel()).toEqual(model); expect(result.a.getModel()).toEqual(model);
}); });
}); });
} }
); );