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.jsimport { 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 */ { return JSON } { let current = localStorage || current localStorage }
// src/UserService.js @ { thisrepo = repo } { return thisrepoall } { thisrepo }
TypeScript
```typescript // tsconfig.json { "compilerOptions": { "experimentalDecorators", "emitDecoratorMetadata": true } } ``` ```typescript // src/main.tsimport { 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
// src/UserService.ts