Skip to content

Instantly share code, notes, and snippets.

@jmosul
Last active September 26, 2023 01:04
Show Gist options
  • Save jmosul/9670aa85e2ebf6b7794ff34da89f440a to your computer and use it in GitHub Desktop.
Save jmosul/9670aa85e2ebf6b7794ff34da89f440a to your computer and use it in GitHub Desktop.
A simple (singleton) service provider for VueJS
// Part of main.js, adding ServiceProvder as Vue plugin
import ServiceProvider from '.SimpleVueServiceProvider';
import MyService from '.MyService';
Vue.use(ServiceProvider, {
MyService
});
// within a component
export default {
name: 'HelloWorld',
methods: {
getService: function () {
return Vue.serviceProvider.myService;
}
},
};
class ServiceProvider {
constructor(services) {
this._services = services;
// use proxy to create a "magic getter" that will search the _services for a matching name
// then call "_makeOnce" to instantiate or return the singleton
return new Proxy(this, {
get: (provider, service) => {
service = service.charAt(0).toUpperCase() + service.slice(1);
return provider._services[service] ? provider._makeOnce(service) : undefined;
}
});
}
/** @var {Object<Object>} **/
_services = {};
/** @var {Object<Object>} **/
_singletons = {};
/**
* @param {String} service
* @return {Object}
* @private
*/
_makeOnce(service) {
if (!this._singletons[service]) {
this._singletons[service] = new this._services[service]();
}
return this._singletons[service];
}
}
export default (Vue, services) => {
Vue.serviceProvider = new ServiceProvider(services);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment