メインコンテンツまでスキップ
バージョン: 0.5.0 (最新)

🧩 機能

機能は、スキーマを1つ以上のルートとグループ化する便利なラッパーです。サービスファクトリを簡潔に保ちながら、複雑な動作を構成できます。


1️⃣ アナトミー

機能は、compose関数を使用して構成され、複数のコンポーネント(スキーマ、ルート、または他の機能)を受け取り、それらを単一の合成可能なユニットに組み合わせます。この合成パターンにより、シンプルで再利用可能なパーツから複雑な機能を構築できます。

src/features/user.ts
import { compose } from '../primitives';
import { createUserSchema, updateUserSchema } from '../schemas/user';
import { createUserRoute, getUserRoute, findUsersRoute, updateUserRoute } from '../routes/user';

export const createUserFeature = compose(createUserSchema, createUserRoute);
export const getUserFeatures = compose(getUserRoute, findUsersRoute);
export const editUserFeatures = compose(updateUserSchema, updateUserRoute);

composeは、任意の数の引数(スキーマ、ルート、他の機能も)を単一の合成可能オブジェクトに平坦化し、サービスが消費できます。合成順序は重要です - スキーマは通常最初に合成され、検証がルート実行よりも先に発生するようにします。


2️⃣ なぜ機能をしようするのか?

  • 再利用性 – 同じ機能を複数のサービスで共有。
  • オーバーライド対応 – ダウンストリームアプリで機能を置き換えまたは拡張。
  • 明確さ – 機能内に低レベルの詳細を隠す。

3️⃣ 良いプラクティス

  1. 単一責任 – 作成、読み取り、更新、削除ごとに別々の機能を作成。
  2. 一貫した命名<verb><Entity>Feature(s)が発見を助ける。
  3. スキーマを最初に合成 – 検証は常にルート実行よりも先行すべき。

4️⃣ サービスでの使用

機能は、defService関数を通じてサービスによって消費され、構成された機能に必要なコンテキスト(データベース接続など)を提供します。Ramdaのpartial関数を使用してデータベース設定を事前に適用し、Expressアプリケーションに簡単に統合できるサービスファクトリを作成します。

src/services/user.ts
import { compose, defService } from '../primitives';
import { partial } from 'lodash';
import { createUserFeature, getUserFeatures, editUserFeatures } from '../features/user';

export const userService = (db: any, configuration: any) =>
defService(
partial(
compose(editUserFeatures, getUserFeatures, createUserFeature),
{ dataStores: db, configuration }
)
);

このパターンにより、テスト、保守、拡張が容易なクリーンでモジュール化されたサービスを作成できます。サービスファクトリパターンは、データベース接続やその他の依存関係が機能に適切に注入されることを保証します。


➡️ 次へ

機能がどのように完全なサービスに構成されるかを理解するためにService Componentを学習してください。すべてのサービスは同じパターンと規則に従います!