mcpField
D
ddd-hexagonal-architecture

ddd-hexagonal-architecture

github.com/partme-ai開発716132 回インストール3 週間前に更新
リポジトリ

ddd-hexagonal-architecture について

ソフトウェアにヘキサゴナルアーキテクチャを適用する開発者向けの設計スキルです。ポートとアダプターによるドメインの分離、依存性逆転、モックやインメモリアダプターを使ったテストを扱います。

主な機能

  1. 01ドメインモデルとポートの設計
  2. 02インバウンド/アウトバウンドアダプター
  3. 03依存性逆転とレイヤー構成
  4. 04モックアダプターによるテスト
  5. 05パッケージ構成と境界の指針

活用シーン

  1. 01ドメインと外部システムの分離を設計
  2. 02データベースや API 向けのポート定義
  3. 03HTTP やメッセージングのアダプター設計
  4. 04インメモリアダプターでドメインロジックをテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/partme-ai/full-stack-skills --skill ddd-hexagonal-architecture

インストール後、Claude Code で/ddd-hexagonal-architectureを入力して読み込まれたか確認します。

同梱ファイルLICENSE.txt

詳細

このスキルを使う場面

ユーザーが次のことを希望する場合は、いつでもこのスキルを使います。

  • ヘキサゴナル(ポートとアダプター)アーキテクチャを使ってアプリケーションを設計する
  • ドメイン層を外部システム(データベース、API、メッセージング)から分離する
  • ドメインがインターフェースを定義し、アダプターがそれを実装する依存関係逆転を実装する
  • ヘキサゴナルアーキテクチャの図やレイヤリングを作成、または実装する
  • インメモリーまたはモックのアダプターを使って、ドメインを分離してテストする

このスキルの使い方

ワークフロー
  1. エンティティ、値オブジェクト、ドメインサービスを使ってドメインモデルを定義します
  2. すべての外部とのやり取りについて、ドメイン層でポート(インターフェース)を定義します
  3. ポートの契約を満たすアダプターを実装します(インバウンド:HTTP、メッセージング、アウトバウンド:DB、API)
  4. すべての矢印がドメインに向かうように依存関係を接続します
1. ポートの定義(ドメイン層)
// Domain port — no framework dependencies
public interface UserRepository {
    Optional<User> findById(UserId id);
    void save(User user);
}

public interface EventPublisher {
    void publish(DomainEvent event);
}
2. インバウンドアダプター(HTTP コントローラー)
@RestController
@RequestMapping("/api/users")
public class UserController {
    private final CreateUserUseCase createUserUseCase;

    public UserController(CreateUserUseCase createUserUseCase) {
        this.createUserUseCase = createUserUseCase;
    }

    @PostMapping
    public ResponseEntity<UserDto> create(@RequestBody CreateUserRequest request) {
        User user = createUserUseCase.execute(request.toCommand());
        return ResponseEntity.ok(UserDto.from(user));
    }
}
3. アウトバウンドアダプター(データベース)
@Repository
public class JpaUserRepository implements UserRepository {
    private final SpringDataUserRepository springRepo;

    @Override
    public Optional<User> findById(UserId id) {
        return springRepo.findById(id.value()).map(UserEntity::toDomain);
    }

    @Override
    public void save(User user) {
        springRepo.save(UserEntity.fromDomain(user));
    }
}
4. パッケージ構成
com.example.app/
├── domain/
│   ├── model/         # Entities, Value Objects
│   ├── port/          # Repository and service interfaces
│   └── service/       # Domain services
├── application/
│   └── usecase/       # Use cases orchestrating domain logic
├── adapter/
│   ├── inbound/       # HTTP controllers, message consumers
│   └── outbound/      # Database, HTTP clients, message publishers
└── config/            # Dependency injection wiring

ベストプラクティス

  • ドメイン層にはフレームワークへの依存を一切持たせず、インメモリーまたはモックのアダプターを使ってテストできるようにします
  • 1つのポートに複数のアダプターを用意できます(例:異なるストレージバックエンド、異なるトランスポート)
  • COLA または Clean Architecture と組み合わせます。ヘキサゴンは本質的に「1つのドメイン層 + 複数のアダプター」です
  • DTO はアダプターとの境界に配置します。ドメインから永続化モデルやトランスポートモデルを公開することはありません

リソース

キーワード

ヘキサゴナルアーキテクチャ、ポートとアダプター、ドメインの分離、依存関係逆転、インバウンドアダプター、アウトバウンドアダプター、クリーンな境界、DDD

コメント