An EntityManager is both a gateway to a service and a local cache of entities. A single EntityManager will often suffice for applications that communicate with one service and can share a single cache of entities with every application view.
We recommend encapsulating the application manager within a "datacontext" (AKA "dataservice") module and putting that datacontext where other modules - such as View Models and View Controllers - can get it. Your application's modularity pattern will guide you. For example, if your modules are attached to an application namespace, you might define a datacontext as follows:
app.datacontext = (function () {
// ... configure the application for Breeze ...
var manager = new breeze.EntityManager(applicationServiceName);
// ... more datacontext ...
var datacontext {
getThis: getThis,
getThat: getThat,
saveChanges: saveChanges,
// ... other datacontext API ...
}
return datacontext;
function getThis(thisList) { ... }
function getThat(thatList) { ... }
function saveChanges( ) { ... }
})();
And your ViewModel classes might look somewhat like these:
/*** ViewModel of This ***/
app.ThisViewModel = (function (ko, datacontext) {
var _activate = false,
thisList = ko.observableArray();
return {
thisList: thisList,
activate: activate,
refresh: refresh
};
function activate() {
if (!_activated) {
_activated = true;
refresh();
}
}
function refresh() {
return datacontext.getThis(thisList).catch(queryFailed);
}
function queryFailed(error) { ... }
})(ko, app.datacontext);
/*** ViewModel of That ***/
app.ThatViewModel = (function (ko, datacontext) {
// ... like a ThisViewModel for that ...
})(ko, app.datacontext);