-
-
Save thinmy/52f45fce2ef7f205e4876d9ba5736e99 to your computer and use it in GitHub Desktop.
A simple (singleton) service provider for VueJS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
} | |
}, | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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