approvers / OreOreBot2

限界開発鯖を代表する BOT はらちょ を TypeScript+discord.js で作り直し。 オレオレ BOT です。別に詐欺とかはしません。
https://haracho.approvers.dev
MIT License
13 stars 2 forks source link

refactor: DI コンテナを追加する #1270

Closed MikuroXina closed 9 months ago

MikuroXina commented 9 months ago

機能要望の提出を行う前に

要望の概要

/packages/bot/src/service/command.tsregisterAllCommandResponder は依存関係の注入処理をまとめているが, 明らかに依存関係と引数のサイズが肥大化しており管理が難しい. このまま今後の機能追加や改善は難しいのでこれを改善しつつ, 概念的に共通する依存関係の整理と直感的なサービス実装も維持できるようにしたい.

新規実装

まず, ドライバ層として /packages/bot/src/driver/ フォルダを追加する. そしてその配下に dep-registry.ts ファイルを追加し, 自前の DI コンテナ実装として依存関係レジストリを表す実装を追加する.

特定のシンボルに対応した抽象の型を定義するために, 次の型情報を export する. これは後述の Symbol の追加と interface のマージ処理を利用したテクニックである.

export type Dep0 = {
  readonly type: unknown;
} & symbol;
export type GetDep0<S> = S extends Dep0 ? S["type"] : never;
// 抽象の定義に型引数が含まれる場合は, それに対応した `Dep1`, `Dep2` を追加していく

次に, DepRegistry クラスを追加する. これは特定の抽象型 (type Hoge = { ... }interaface Hoge { ... }) に対応する Symbol をキーに, その interface を実装したオブジェクトを格納する. 具体的には次のメソッドを提供する.

コードの書き換え

これを利用して, 各モジュールの実装を以下のように書き換える.

代替え案

No response

追加情報

No response