tweed-inject
v0.5.0
Published
Dependency Injection Framework for Tweed
Downloads
4
Readme
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.
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 })
}
}
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 })
}
}