1.0.5 • Published 4 years ago

@codingworkbench/inject v1.0.5

Weekly downloads
-
License
ISC
Repository
-
Last release
4 years ago

@codingworkbench/inject

Goal

Lightweight dependency inject module for Typescript that has no dependencies. Uses powerful generics features of Typescript to enforce correct binding of dependencies.

Install

npm install @codingworkbench/inject --save

Basic Usage

import CwbInject from "@codingworkbench/inject"

// Application domain interfaces and implementations
interface ITodoService {}

class TodoServiceImpl implements ITodoService {}


// Describe the module dependencies
interface ITodoModule {
    todoService: ITodoService;
}

// Create a module for the application domain
const todoModule = new CwbInject.Module<ITodoModule>();

// Bind the todoService property to the TodoService constructor
todoModule.bind("todoService", TodoServiceImpl);

// Request the todoService property and use as needed
const todoService = todoModule.getProperty("todoService");

Factory Functions

// Bind a function to the todoService property
todoModule.bindFactoryFunction("todoService", async () => new TodoService());

Injecting Dependencies

TodoStore.ts

 
export interface ITodoStore {}

export class TodoStoreImpl implements ITodoStore {}

TodoService.ts

import {ITodoStore} from "./TodoStore"
 
export interface ITodoService {}

export interface ITodoServiceArgs {
    todoStore: ITodoStore;
}

export class TodoServiceImpl implements ITodoService {
    private store: ITodoStore;
    constructor(args: ITodoServiceArgs) {
        this.store = args.todoStore;
    }
}

inject.ts

import CwbInject from "@codingworkbench/inject"

import {ITodoStore} from "./TodoStore"
import {ITodoService, ITodoServiceArgs} from "./TodoService"

export interface ITodoModule {
    todoStore: ITodoStore;
    todoService: ITodoService;
}

const todoServiceInjectionProperties: CwbInject.InjectionProperties<ITodoServiceArgs> = {
    todoStore: true,
};
export todoServiceInjectionProperties;

main.ts

import CwbInject from "@codingworkbench/inject"

import {TodoStoreImpl} from "./TodoStore"
import {TodoServiceImpl} from "./TodoService"
import {todoServiceInjectionProperties, ITodoModule} from "./inject"


// Create a module for the application domain
const todoModule = new CwbInject.Module<ITodoModule>();

// bind the store object
todoModule.bind("todoStore", TodoStoreImpl);

// Bind the todoService property to the TodoService constructor
todoModule.bind("todoService", TodoServiceImpl, todoServiceInjectionProperties);
// or
// todoModule.bindFactoryFunction("todoService", async (args) => new TodoServiceImpl(args), todoServiceInjectionProperties);

// Request the todoService property and use as needed
const todoService = todoModule.getProperty("todoService");

API

class Module <MC>

An object provider that lazy constructs object as they are requested. Modules can be combined to create more complex models.

  • MC: (Template) Interface type that has all the properties that can be required by the module to construct.
methods
  • getProperty( propertyKey ): this propertyKey (keyof MC) : Request the value for the given property.
  • bind( propertyKey, constructor , injectionProperties ): this propertyKey (keyof MC) : A key that had is part of the module type MC. constructor (Constructor): Reference to a constructor that should be called when populating the property. injectionProperties (InjectionKeys): The properties that should be injected into the constructor. Bind a class constructor to a property. The constructor will be called when getProperty(propertyKey) is invoked.
  • bindFactoryFunction( propertyKey, factoryFunction , injectionProperties ): this propertyKey (keyof MC): A key that had is part of the module type MC. factoryFunction (function (args) : Promise<R>) : A function that returns a new object. If injectionProperties is set then the properties values will be passed to this function call. injectionProperties (InjectionKeys): The properties that should be passed into the factoryFunction. Bind a factory function to a property. The function will be called when getProperty(propertyKey) is invoked.

License

The ISC License

Copyright (c) 2020 Fredrique Samuels (https://codingworkbench.com)

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.