🚀 機能
featureは、スキーマと1つ以上のルートをグループ化する便利なラッパーです。これにより、サービスファクトリを簡潔に保ちながら、複雑な動作を合成できます。
1️⃣ 構造
Featuresはcompose関数を使用して合成され、複数のコンポーネント(スキーマ、ルート、または他のfeatures)を受け取り、それらを単一の合成可能なユニットに結合します。この合成パターンにより、シンプルで再利用可能なパーツから複雑な機能を構築できます。
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は任意の数の引数(スキーマ、ルート、他のfeatures)を単一のComposableオブジェクトにフラット化し、サービスが消費できるようにします。合成順序が重要です - スキーマは通常最初に合成され、ルート実行前にバリデーションが行われるようにします。
2️⃣ Featuresを使用する理由
- Reusability – 複数のサービス間で同じfeatureを共有します。
- Override-friendly – ダウンストリームアプリでfeatureを置き換えたり拡張したりできます。
- Clarity – feature内に低レベルの詳細を隠します。
3️⃣ ベストプラクティス
- One responsibility – 作成、読み取り、更新、削除のために別々のfeaturesを作成します。
- Name consistently –
<verb><Entity>Feature(s)は発見を助けます。 - Compose schemas first – バリデーションは常にルート実行に先行する必要があります。
4️⃣ サービスでの使用
FeaturesはdefService関数を通じてサービスによって消費され、合成されたfeaturesに必要なコンテキスト(データベース接続など)を提供します。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 }
)
);
このパターンにより、テスト、保守、拡張が容易なクリーンでモジュール化されたサービスを作成できます。サービスファクトリパターンにより、データベース接続やその他の依存関係がfeaturesに適切に注入されます。
➡️ 次へ
Service Componentを学習して、featuresが完全なサービスにどのように合成されるかを理解してください。すべてのサービスは同じパターンと規則に従います!