Big Bang
This commit is contained in:
commit
da706a9c5a
12
App.js
Normal file
12
App.js
Normal file
@ -0,0 +1,12 @@
|
||||
const Injectable = require('./Injectable')
|
||||
|
||||
class App extends Injectable {
|
||||
static services = ['emailLogging']
|
||||
run() {
|
||||
setInterval(() => {
|
||||
this.emailLogging.error('Haha made ya\' look!')
|
||||
}, 5000)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exports = App
|
14
DependencyInjector.js
Normal file
14
DependencyInjector.js
Normal file
@ -0,0 +1,14 @@
|
||||
const ServiceContainer = require('./ServiceContainer.js')
|
||||
|
||||
class DependencyInjector {
|
||||
constructor() {
|
||||
this.container = new ServiceContainer()
|
||||
}
|
||||
|
||||
// Injects the dependencies into an uninstantiated class
|
||||
make(Class) {
|
||||
return Class.__inject(this.container)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exports = DependencyInjector
|
11
Injectable.js
Normal file
11
Injectable.js
Normal file
@ -0,0 +1,11 @@
|
||||
class Injectable {
|
||||
static services = []
|
||||
|
||||
static __inject(container) {
|
||||
this.services.forEach(serviceName => {
|
||||
this.prototype[serviceName] = container.getService(serviceName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exports = Injectable
|
6
README.md
Normal file
6
README.md
Normal file
@ -0,0 +1,6 @@
|
||||
# Basic Dependency Injection
|
||||
## In less than 100 lines of pure, ES6 JavaScript
|
||||
|
||||
This is a very bare-bones dependency injector implementation based on the ES6 classes. It's meant to illustrate the feasibility and benefits of using a service-based dependency injector for Node.js/JavaScript applications.
|
||||
|
||||
I discuss this project in greater depth in my blog post [here](https://garrettmills.dev/blog).
|
5
Service.js
Normal file
5
Service.js
Normal file
@ -0,0 +1,5 @@
|
||||
class Service {
|
||||
|
||||
}
|
||||
|
||||
module.exports = exports = Service
|
28
ServiceContainer.js
Normal file
28
ServiceContainer.js
Normal file
@ -0,0 +1,28 @@
|
||||
const LogHelper = require('./LogHelper')
|
||||
const EmailLogHelper = require('./EmailLogHelper')
|
||||
|
||||
class ServiceContainer {
|
||||
constructor() {
|
||||
// We define the service classes here, but we won't
|
||||
// instantiate them until they're needed.
|
||||
this.definitions = {
|
||||
logging: LogHelper,
|
||||
emailLogging: EmailLogHelper,
|
||||
}
|
||||
|
||||
// This is where the container will store service instances
|
||||
// so they can be reused when requested.
|
||||
this.instances = {}
|
||||
}
|
||||
|
||||
getService(serviceName) {
|
||||
// Create a service instance if one doesn't already exist.
|
||||
if ( !this.instances[serviceName] ) {
|
||||
const ServiceClass = this.definitions[serviceName]
|
||||
this.instances[serviceName] = new ServiceClass()
|
||||
}
|
||||
return this.instances[serviceName]
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exports = ServiceContainer
|
9
index.js
Normal file
9
index.js
Normal file
@ -0,0 +1,9 @@
|
||||
// Create the dependency injector instance for the application
|
||||
const DI = require('./DependencyInjector')
|
||||
const di = new DI()
|
||||
|
||||
// Now, create the instance of our application using the DI to inject services
|
||||
const App = di.make(require('./App'))
|
||||
const app = new App() // Has access to the emailLogging service
|
||||
|
||||
app.run();
|
Loading…
Reference in New Issue
Block a user