This commit is contained in:
garrettmills 2019-11-15 21:30:27 -06:00
commit da706a9c5a
7 changed files with 85 additions and 0 deletions

12
App.js Normal file
View 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
View 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
View 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
View 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
View File

@ -0,0 +1,5 @@
class Service {
}
module.exports = exports = Service

28
ServiceContainer.js Normal file
View 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
View 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();