jmolecules は、DDDや各種アーキテクチャの概念を表現するアノテーションや型を提供する。
molecules(モレキュールズ)は、分子/微粒子を意味し、物質の構成要素。
通常は、以下の各種インテグレーションを経由して利用することとなる。
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); }
これらのインターフェース型については以下の補足記事を参照してください。
Association
については以下の補足記事を参照してください。