rodrigo-speller/depenject-express


depenject-express is a middleware for express that provides dependency injection to your requests.

License: Apache-2.0

Language: TypeScript

Keywords: dependency, dependency-injection, di, express, injection, ioc, javascript, nodejs, npm, typescript


depenject-express

npm version Gitpod Ready-to-Code

depenject is a lightweight and fast IoC container to resolve dependencies, achieving Inversion of Control (IoC) between their dependencies.

depenject-express is a middleware for express that provides dependency injection to your requests.

Installing

For the latest stable version:

npm install depenject-express

Contribute

There are many ways to contribute to depenject-express:

Documentation

Building

In order to build the depenject-express, ensure that you have Git and Node.js installed.

Clone a copy of the repo:

git clone https://github.com/rodrigo-speller/depenject-express.git

Change to the depenject-express directory:

cd depenject-express

Install tools and dev dependencies:

npm install

Use one of the following to build and test:

npm run build       # Build the library into "dist" directory.

A simple sample to copy-and-paste

import * as express from 'express';
import * as depenject from 'depenject';
import * as di from 'depenject-express'

const app = express();

// DEPENDENCY INJECTION

// a single dependency are create once
class SingletonDependency {
  creation = Date();
}

// a scoped dependency are created once per request
class ScopedDependency {
  creation = Date();
}

app.use(di.depenject(services => {
  services
    .registerSingleton(SingletonDependency)
    .registerScoped(ScopedDependency)
}));

// REQUEST HANDLER

class SayHelloEndpoint {
  requestContext: di.RequestContext;

  constructor(container: depenject.Container) {
    let contextAccessor = container.resolve(di.RequestContextAccessor);

    this.requestContext = contextAccessor.context;
  }

  get message() {
    let { request } = this.requestContext;

    let name = request.query.name;
    if (!name)
      name = 'World';

    return `Hello ${name}!`;
  }

  execute() {
    const { request, response } = this.requestContext;

    const singletonSample = request.$services.resolve(SingletonDependency);
    const scopedSample = request.$services.resolve(ScopedDependency);
    
    response.send(`
      <h1>${this.message}</h1>
      <form>
          <label for=name>Name:</label>
          <input name=name />
          <button>Say hello</button>
      </form>
      <p>The singleton dependency was created at: ${singletonSample.creation}.</p>
      <p>The scoped dependency was created at: ${scopedSample.creation}.</p>
    `);
  }
}

app.use('/', (req) => {

  // the dependency container can be accessed using $services property
  const messageProvider = req.$services.resolve(SayHelloEndpoint);

  messageProvider.execute();

});

// START SERVER

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

License

Copyright 2019 Rodrigo Speller

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Project Statistics

Sourcerank 3
Repository Size 20.5 KB
Stars 0
Forks 0
Watchers 1
Open issues 0
Dependencies 34
Contributors 1
Tags 2
Created
Last updated
Last pushed

Top Contributors See all

Rodrigo Speller

Packages Referencing this Repo

depenject-express
[![npm version](https://badge.fury.io/js/depenject-express.svg)](https://www.npmjs.com/package/de...
Latest release 0.0.2 - Updated

Recent Tags See all

v0.0.2 December 26, 2019
v0.0.1 December 26, 2019

Something wrong with this page? Make a suggestion

Login to resync this repository