DDDの概念表現を提供する jmolecules


jmolecules は、DDDや各種アーキテクチャの概念を表現するアノテーションや型を提供する。

github.com

molecules(モレキュールズ)は、分子/微粒子を意味し、物質の構成要素。

通常は、以下の各種インテグレーションを経由して利用することとなる。

github.com


DDD コンセプト表現

DDD の概念を表現するアノテーションを提供する。

説明
@Entity エンティティを識別する
@Identity 識別子を識別する
@Association 集約ルートへの関連を識別する
@ValueObject 値オブジェクトを識別する
@AggregateRoot 集約のルートエンティティを識別する
@Repository リポジトリを識別する
@Service ドメインサービスを識別する
@Factory ファクトリを識別する
@Module DDD モジュールを識別する
@BoundedContext 境界づけられたコンテキストを識別する

ドメインイベント

説明
@DomainEvent ドメインイベントを識別する
@DomainEventHandler ドメインイベントハンドラを識別する
@DomainEventPublisher ドメインイベントパブリッシャを識別する
@Externalized 外在化されるドメインイベントを識別する


アーキテクチャ コンセプト表現

レイヤや役割をパッケージで分けるのではなく、ドメイン別のパッケージ直下にまとめて、アノテーションで役割を識別する使い方が主。

CQRS・アーキテクチャ

説明
@Command コマンドを識別する
@CommandDispatcher コマンドディスパッチャを識別する
@CommandHandler コマンドハンドラを識別する
@QueryModel クエリを識別する

ヘキサゴナル・アーキテクチャ

説明
@Port @PrimaryPort @SecondaryPort アプリケーションと外界とのインターフェイスを識別する
@Adapter @PrimaryAdapter @SecondaryAdapter ポートを駆動するテクノロジー固有の実装を識別する
@Application コアアプリケーションコードの役割を識別する

レイヤード・アーキテクチャ

説明
@InterfaceLayer インターフェース・レイヤを識別する
@ApplicationLayer アプリケーション・レイヤを識別する
@DomainLayer ドメイン・レイヤを識別する
@InfrastructureLayer インフラストラクチャ・レイヤを識別する

オニオン・アーキテクチャ

説明
@DomainModelRing ドメインモデル層を識別する
@DomainServiceRing ドメインサービス層を識別する
@ApplicationServiceRing アプリケーションサービス層を識別する
@InfrastructureRing インフラストラクチャ層を識別する

オニオン・アーキテクチャ(ドメインモデルとサービスを分離しない)

説明
@DomainRing ドメイン層を識別する
@ApplicationRing アプリケーション層を識別する
@InfrastructureRing インフラストラクチャ層を識別する


インターフェース型に基づくDDD表現

アノテーションではなく、インターフェースとしてのDDDの型表現も提供している。

説明
Entity エンティティ・インターフェース
Identifier 識別子インターフェース
Identifiable 識別子を公開するインターフェース
Association 集約ルートへの関連インターフェース
SimpleAssociation 集約ルートへの関連インターフェース実装
ValueObject 値オブジェクト・インターフェース
AggregateRoot 集約のルート・インターフェース
Repository リポジトリ・インターフェース

ドメインイベント

説明
DomainEvent ドメインイベント・インターフェース
Externalized 外在化されるドメインイベント・インターフェース

基本的にはマーカーインタフェースの提供となっているが、厳しめな型制約が付与されている。

例えば以下のような実装になり、Entity は特定の AggregateRoot にのみ属し、リポジトリは AggregateRoot の単位でしか操作できないなどの制約が課せられる。

public class Customer implements AggregateRoot<Customer, CustomerId> {

    private final CustomerId id;
    private Name name;
    private List<Address> addresses;

    public Customer(String firstname, String lastname, Address address) { ... }

    public record Name(String firstname, String lastname) implements ValueObject {}

    public record CustomerId(UUID id) implements Identifier {}
}
public class Address implements Entity<Customer, Address.AddressId> {

    private final AddressId id;
    private final String street, city, zipCode;

    public Address(String street, String city, String zipCode) { ... }

    public record AddressId(UUID id) implements Identifier {}
}
public interface Customers extends Repository<Customer, CustomerId>, AssociationResolver<Customer, CustomerId> {

    Customer save(Customer customer);
}

これらのインターフェース型については以下の補足記事を参照してください。

blog1.mammb.com


Association については以下の補足記事を参照してください。

blog1.mammb.com