tweed-inject
TypeScript icon, indicating that this package has built-in type declarations

0.5.0 • Public • Published

Tweed Inject

A dependency injection framework, with the Tweed library in mind. It doesn't require Tweed, though.


Installation

$ npm install tweed-inject

Overview

The Container class can be used to create and store instances. It can then be used to automatically inject dependencies into class constructors.

JavaScript (Babel) ```javascript // src/main.js

import { Container } from 'tweed-inject' import UserRepository from './UserRepository' import LocalStorageUserRepository from './LocalStorageUserRepository' import UserService from './UserService'

const container = new Container()

container.bind(UserRepository).toClass(LocalStorageUserRepository)

// Uses the @inject decorator to resolve the necessary dependencies const userService = container.make(UserService)

userService.create('Jane Doe', 35)

console.log(userService.all()) // -> [{ name: 'Jane Doe', age: 35 }]

```javascript
// src/UserRepository.js

/**
 * Marker for the UserRepository interface
 *
 * interface User {
 *   name: string
 *   age: number
 * }
 *
 * interface UserRepository {
 *   all (): User[]
 *   add (user: User): void
 * }
 */
export default 'UserRepository'
// src/LocalStorageUserRepository.js
 
/**
 * @implements UserRepository
 */
export default class LocalStorageUserRepository {
  all () {
    return JSON.parse(localStorage.getItem('users'))
  }
 
  add (user) {
    let current = localStorage.getItem('users') || []
 
    current.push(user)
 
    localStorage.setItem('users', JSON.stringify(current))
  }
}
// src/UserService.js
 
import { inject } from 'tweed-inject'
import UserRepository from './UserRepository'
 
@inject(UserRepository)
export default class UserService {
  constructor (repo) {
    this.repo = repo
  }
 
  all () {
    return this.repo.all()
  }
 
  create (name, age) {
    this.repo.add({ name, age })
  }
}
TypeScript ```typescript // tsconfig.json { "compilerOptions": { "experimentalDecorators", "emitDecoratorMetadata": true } } ``` ```typescript // src/main.ts

import { Container } from 'tweed-inject' import UserRepository from './UserRepository' import LocalStorageUserRepository from './LocalStorageUserRepository' import UserService from './UserService'

const container = new Container()

container.bind(UserRepository).toClass(LocalStorageUserRepository)

// Uses the @autoinject decorator to resolve the necessary dependencies const userService = container.make(UserService)

userService.create('Jane Doe', 35)

console.log(userService.all()) // -> [{ name: 'Jane Doe', age: 35 }]

```typescript
// src/UserRepository.ts

Marker for the UserRepository interface

export interface User {
  name: string
  age: number
}

interface UserRepository {
  all (): User[]
  add (user: User): void
}

// Marker
const UserRepository = 'UserRepository'

export default UserRepository
// src/LocalStorageUserRepository.ts
 
import UserRepository, { User } from './UserRepository'
 
export default class LocalStorageUserRepository implements UserRepository {
  all (): User[] {
    return JSON.parse(localStorage.getItem('users'))
  }
 
  add (user: User): void {
    let current: User[] = localStorage.getItem('users') || []
 
    current.push(user)
 
    localStorage.setItem('users', JSON.stringify(current))
  }
}
// src/UserService.ts
 
import { autoinject } from 'tweed-inject'
import UserRepository, { User } from './UserRepository'
 
@autoinject
export default class UserService {
  constructor (
    private repo: UserRepository
  ) {}
 
  all (): User[] {
    return this.repo.all()
  }
 
  create (name: string, age: number): void {
    this.repo.add({ name, age })
  }
}

Dependencies (2)

Dev Dependencies (7)

Package Sidebar

Install

npm i tweed-inject

Weekly Downloads

2

Version

0.5.0

License

WTFPL

Last publish

Collaborators

  • emilniklas