Dependency Injection
:::info 近日対応予定 依存性注入(DI)の詳細なドキュメントは現在準備中です。 :::
Zeltは内部でneedle-diを利用して依存性注入を行っており、軽量で型安全なDIコンテナを提供しています。
Quick Overview
@Injectable()
export class DatabaseService {
query(sql: string) {
// ...
}
}
@Injectable()
export class UserRepository {
constructor(private db = inject(DatabaseService)) {}
findAll() {
return this.db.query('SELECT * FROM users');
}
}
実践的な使用パターンについてはServicesのドキュメントを参照してください。
Decorator Composition
Zeltは、複数のデコレータを1つのメタデコレータへ組み合わせるユーティリティを提供しています。これは、関連する機能をまとめた再利用可能なカスタムデコレータを作る際に便利です。
composeClassDecorators
複数のクラスデコレータを1つに組み合わせます。
const GraphqlController = (path: string) =>
composeClassDecorators(
Controller(path),
createClassDecorator({ decorator: 'GraphqlController' })
);
@GraphqlController('/api')
class UserResolver {}
composeMethodDecorators
複数のメソッドデコレータを1つに組み合わせます。
const Controller = () => createClassDecorator({});
const Route = (method: string, path: string) =>
createMethodDecorator({ decorator: 'Route', method, path });
const Query = (path: string) =>
composeMethodDecorators(
Route('GET', path),
createMethodDecorator({ decorator: 'Query' })
);
@Controller()
class TestController {
@Query('/users')
getUsers() {}
}
composePropertyDecorators
複数のプロパティデコレータを1つに組み合わせます。
const Entity = () => createClassDecorator({});
const Column = (opts?: { nullable?: boolean }) =>
createPropertyDecorator({ decorator: 'Column', nullable: opts?.nullable ?? false });
const Searchable = () => createPropertyDecorator({ decorator: 'Searchable' });
const SearchableColumn = (opts?: { nullable?: boolean }) =>
composePropertyDecorators(Column(opts), Searchable());
@Entity()
class User {
@SearchableColumn()
name!: string;
}
How It Works
- Propsはマージされる: 各デコレータのpropsは順番にmetadataへ追加されます
- Traceは使用箇所を指す: ソース位置のtraceは、合成されたデコレータが適用された箇所(
composeClassDecoratorsならクラス定義、composeMethodDecoratorsならメソッド、composePropertyDecoratorsならプロパティ)を指し、デコレータファクトリが定義された箇所は指しません - ユースケース: より簡潔で意味の明確なコードのために、複数のデコレータをまとめたカスタムメタデコレータを作成する