一組函式庫,可協助開發人員以無幹擾、簡單的舊式 Java 實作域模型。
明確表達架構概念,以便於程式碼閱讀與寫作。
使特定領域的程式碼免受技術依賴。減少樣板代碼。
自動產生文件並驗證實作結構和您的架構。
讓開發人員的生活更輕鬆。
表示一段程式碼(套件、類別或方法)實作了一個架構概念。
讓人類讀者可以輕鬆地確定給定的程式碼片段屬於哪種架構概念。
允許工具整合:
代碼的增強。 (工具範例:ByteBuddy 與 Spring 和 JPA 整合)。
檢查架構規則。 (工具範例:jQAssistant、ArchUnit)。
範例:銀行域。
import org . jmolecules . ddd . annotation .*;
@ Entity
class BankAccount {
@ Identity
final IBAN iban ;
/* ... */
}
@ ValueObject
class IBAN { /* ... */ }
@ ValueObject
record Currency { /* ... */ }
@ Repository
class Accounts { /* ... */ }
當我們認真對待通用語言時,我們希望名稱(類別、方法等)僅包含領域語言中的單字。這意味著構建塊的標題不應成為名稱的一部分。因此,在銀行領域,我們不希望BankAccountEntity
、 CurrencyVO
甚至AccountRepository
作為類型。相反,我們需要BankAccount
、 Currency
和Accounts
就像上面的範例一樣。
儘管如此,我們還是想表達給定的類別(或其他架構元素)是一個特殊的構建塊;即使用設計模式。 jMolecules 為 DDD 中已知的建構塊提供了一組標準註解。
作為上述註釋的替代方案,jMolecules 還提供了一組接口,很大程度上基於 John Sullivan 的系列“Advancing Enterprise DDD”中提出的思想。它們允許在類型系統中表達建構塊之間的關係,以便編譯器可以幫助驗證模型的正確性,並且資訊也可以更容易地透過 Java 反射進行處理。
Identifier
- 表示應該充當標識符的類型的類型。
Identifiable<ID>
— 任何公開識別碼的內容。
Entity<T extends AggregateRoot<T, ?>, ID> extends Identifiable<ID>
— 一個實體,宣告它屬於哪個AggregateRoot
以及它公開哪個識別碼。
AggregateRoot<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Entity<T, ID>
— 聚合根是屬於自身的Entity
,公開專用Identifier
Association<T extends AggregateRoot<T, ID>, ID extends Identifier> extends Identifiable<ID>
— 與目標AggregateRoot
的明確關聯。
這種安排為建模提供了指導,並允許輕鬆驗證以下規則(可能透過反射):
每個聚合強制使用專用標識符類型,以避免不同聚合的標識符混淆。
AggregateRoot
必須只引用聲明屬於它的Entity
實例。
AggregateRoot
和Entity
只能透過Association
實例引用其他AggregateRoots
。
有關自動驗證和運行時技術集成,請參閱 jMolecules 集成。
jmolecules-ddd
— 在程式碼中表達 DDD 建構塊(值物件、實體、聚合根等)的註解和介面。
jmolecules-events
— 在程式碼中表達事件概念的註解和介面。
kmolecules-ddd
— 基於 Kotlin 的jmolecules-ddd
風格,用於緩解基於類型的模型的 Kotlin/Java 互通性問題。
jMolecules 提供註解來描述遵循分層、洋蔥和六邊形架構風格的更高層次架構概念。它們允許您將整個套件標記為一層、環或包含連接埠和適配器的層。這些將出現在您要註解的每個套件的package-info.java
檔案中,例如:
package-info.java
: @ DomainLayer
package org . acmebank . domain ;
import org . jmolecules . architecture . layered .*;
package-info.java
: @ ApplicationLayer
package org . acmebank . application ;
import org . jmolecules . architecture . layered .*;
這樣,對應套件中的所有類別都被視為註解層、環的一部分,或被視為連接埠/適配器。
或者,可以直接註解類別:
import org . jmolecules . architecture . layered .*;
@ DomainLayer
@ Entity
public class BankAccount { /* ... */ }
@ ApplicationLayer
@ Service
public class TransferMoney { /* ... */ }
目前,存在分層、洋蔥和六邊形架構的註釋。
jmolecules-architecture
— 在程式碼中表達架構風格的註解。
jmolecules-cqrs-architecture
— CQRS 架構
@Command
@CommandDispatcher
@CommandHandler
@QueryModel
jmolecules-layered-architecture
— 分層架構
@DomainLayer
@ApplicationLayer
@InfrastructureLayer
@InterfaceLayer
jmolecules-onion-architecture
— 洋蔥架構
經典的
@DomainModelRing
@DomainServiceRing
@ApplicationServiceRing
@InfrastructureRing
簡化(不分離領域模型和服務)
@DomainRing
@ApplicationRing
@InfrastructureRing
jmolecules-hexagonal-architecture
— 六角形架構
@Application
@(Primary|Secondary)Adapter
@(Primary|Secondary)Port
jMolecules 註解和介面可用於產生在特定目標技術中表達概念所需的技術程式碼。
Spring、Data JPA、Data MongoDB、Data JDBC 和 Jackson 整合 — 讓使用 jMolecules 註解的程式碼在這些技術中開箱即用。
以程式碼表達的 jMolecules 概念可用於驗證源自概念定義的規則並產生文件。
jQAssistant 外掛程式 — 用於驗證適用於不同架構樣式、DDD 建置區塊、CQRS 和事件的規則。也可以根據程式碼庫中的可用資訊建立 PlantUML 圖。
ArchUnit 規則 — 允許驗證 DDD 建構塊之間的關係。
Spring Modulith — 支援偵測 jMolecules 元件、DDD 建置區塊和事件,以用於模組模型和文件目的(有關更多信息,請參閱 Spring Modulith 文件)。
要在專案中使用 jMolecules,只需聲明對其的依賴關係。發布二進位檔案可從 Maven 中央儲存庫取得。為了避免必須明確聲明所有版本,我們建議在依賴項管理部分使用jmolecules-bom
。
< dependency >
< groupId >org.jmolecules</ groupId >
< artifactId >jmolecules-ddd</ artifactId >
< version >1.9.0</ version >
</ dependency >
repositories {
mavenCentral()
}
dependencies {
implementation( " org.jmolecules:jmolecules-ddd:1.9.0 " )
}
mvn release:prepare -DscmReleaseCommitComment="$ticketId - Release version $version." -DscmDevelopmentCommitComment="$ticketId - Prepare next development iteration."
mvn release:perform -Dgpg.keyname=$keyname