Giter Club home page Giter Club logo

di's Introduction

simple-ts-di

Build Status

Simple DI framework written in and for TypeScript. By default all bindings are in singleton scope. Where possible you can call a transient() binder function to create a transient binding.

Setup

Make sure your tsconfig.json contains

{
  "experimentalDecorators": true,
  "emitDecoratorMetadata": true
}

Install reflect-metadata and include it somewhere.

Make sure your setup supports Maps and Symbols.

Example

Constructor injection

class Service {
  sayHi() { return 'hi'; }
}

@inject()
class Test {
  constructor(service: Service) {
    service.sayHi();
  }
}

class MyModule implements Module {
  init(bind: Bind) {
    bind(Service).transient(); // transient scope
    bind(Test); // singleton scope
                // shortcut for bind(Test).to(Test)
  }
}

const container = new Container(new MyModule());
const test = container.get(Test);

Property injection

simple-ts-di supports property injection. It will only work if the type (here Service) has a meaningful runtime representation. So it only works for classes (as of now). If you want to inject some primitives or a service which implements an interface you have to use named injection. If your environment dont let you control how the class is instantiated (e.g. react components are instantiated by react and not via container.get(...)), you can use a special version of inject - abounded inject. See "bounded property injection".

class Service {
  sayHi() { return 'hi'; }
}

class Test {
  @inject()
  private service: Service;

  sayHelloToService() {
    return this.service.sayHi();
  }
}

class MyModule implements Module {
  init(bind: Bind) {
    bind(Service).transient(); // transient scope
    bind(Test); // singleton scope
                // shortcut for bind(Test).to(Test)
  }
}

const container = new Container(new MyModule());
const test = container.get(Test);

named injection

const SERVICE = Symbol();
const PRIMITIVE = Symbol();

interface IService {
  sayHi(): string;
}

class Service implements IService {
  sayHi() { return 'hi'; }
}

@inject([SERVICE, PRIMITIVE])
class Test {
  @inject(SERVICE)
  private service: IService;

  @inject(PRIMITIVE)
  private primitive: number;

  constructor(service: IService, primitive: number) {
  }
}

class MyModule implements Module {
  init(bind: Bind) {
    bind(SERVICE).to(Service);
    bind(PRIMITIVE).toValue(10);
    bind(Test);
  }
}

const container = new Container(new MyModule());
const test = container.get(Test);

bounded property injection

class Service {
  sayHi() {
    return 'hi';
  }
}

class MyModule implements Module {
  init(bind: Bind) {
    bind(Service);
  }
}

const container = new Container(new MyModule());
const bInject = createBoundedInject(container);

class Test {
  @bInject() service: Service;
}

const t = new Test();

t.service.sayHi(); // returns Hi

See tests/ for more complex examples and API.

di's People

Contributors

otbe avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.