ddd
4
总安装量
4
周安装量
#50951
全站排名
安装命令
npx skills add https://github.com/jackjin1997/clawforge --skill ddd
Agent 安装分布
openclaw
4
github-copilot
4
codex
4
kimi-cli
4
gemini-cli
4
cursor
4
Skill 文档
DDD Skill – é¢å驱å¨è®¾è®¡å»ºæ¨¡
æ¦è¿°
DDD Skill æä¾é¢å驱å¨è®¾è®¡ç宿´æå¯¼ï¼å¸®å©å¼åè åæ¶æå¸è¿è¡é¢å建模ãéçä¸ä¸æåååææ¯æ¨¡å¼å®ç°ã
使¶ä½¿ç¨
å½ç¨æ·éè¦ï¼
- åæå¤æä¸å¡é¢åå¹¶è¿è¡é¢å建模
- ååéçä¸ä¸æååå
- 设计èåæ ¹ãå®ä½ãå¼å¯¹è±¡
- å®ç°é¢åæå¡åé¢åäºä»¶
- è¿è¡å¾®æå¡è¾¹çåå
- åºç¨CQRS/äºä»¶æº¯æºæ¨¡å¼
- 设计å è¾¹å½¢æ¶æ/æ´è±æ¶æ
å¿«éå¼å§
1. æç¥è®¾è®¡ï¼Strategic Designï¼
ç¡®å®ä¸å¡é¢åçè¾¹çåä¸ä¸æå ³ç³»ï¼
æ ¸å¿åï¼Core Domainï¼â ç«äºä¼å¿æå¨
æ¯æåï¼Supporting Domainï¼â æ¯ææ ¸å¿ä¸å¡
éç¨åï¼Generic Domainï¼â å¯å¤è´/å¤ç¨
2. ææ¯è®¾è®¡ï¼Tactical Designï¼
å¨éçä¸ä¸æå è¿è¡è¯¦ç»å»ºæ¨¡ï¼
èåæ ¹ï¼Aggregate Rootï¼
âââ å®ä½ï¼Entityï¼- æå¯ä¸æ è¯
âââ å¼å¯¹è±¡ï¼Value Objectï¼- æ æ è¯ï¼ä¸å¯å
âââ é¢åäºä»¶ï¼Domain Eventï¼- è®°å½ä¸å¡åå
æ ¸å¿æ¦å¿µ
éçä¸ä¸æï¼Bounded Contextï¼
éçä¸ä¸ææ¯DDDçæ ¸å¿æ¦å¿µï¼å®ä¹äºé¢å模åçè¾¹çï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 订åä¸ä¸æ â
â âââââââââââ âââââââââââ âââââââââââ â
â â 订å â â 订å项 â â æ¯ä» â â
â â èåæ ¹ â â å®ä½ â â å¼å¯¹è±¡ â â
â âââââââââââ âââââââââââ âââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
â ä¸ä¸ææ å°
â¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â åºåä¸ä¸æ â
â âââââââââââ âââââââââââ â
â â åºå â â åºå项 â â
â â èåæ ¹ â â å®ä½ â â
â âââââââââââ âââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
èå设计è§å
- ä¿æ¤ä¸å¡ä¸åå¼ – èåè¾¹çå çæ°æ®ä¸è´æ§ç±èåæ ¹ä¿æ¤
- å°èååå – èååºå°½å¯è½å°ï¼åªå å«å¿ éçå ç´
- éè¿IDå¼ç¨ – èåé´éè¿IDå¼ç¨ï¼ä¸ç´æ¥ææå¯¹è±¡å¼ç¨
- 䏿¬¡äºå¡ä¸ä¸ªèå – æ¯æ¬¡äºå¡åªä¿®æ¹ä¸ä¸ªèå
- æç»ä¸è´æ§ – èåé´éè¿é¢åäºä»¶å®ç°æç»ä¸è´æ§
å»ºæ¨¡å·¥ä½æµ
æ¥éª¤1ï¼äºä»¶é£æ´ï¼Event Stormingï¼
è¯å«é¢åä¸çå ³é®äºä»¶ï¼
æ©è²ä¾¿ç¾ï¼é¢åäºä»¶ï¼åçäºä»ä¹ï¼
èè²ä¾¿ç¾ï¼å½ä»¤ï¼è§¦åäºä»¶çå¨ä½ï¼
é»è²ä¾¿ç¾ï¼èåï¼å¤çå½ä»¤ã产çäºä»¶ï¼
ç´«è²ä¾¿ç¾ï¼çç¥ï¼ååºäºä»¶çè§åï¼
ç²è²ä¾¿ç¾ï¼å¤é¨ç³»ç»
æ¥éª¤2ï¼è¯å«éçä¸ä¸æ
æ ¹æ®äºä»¶é£æ´ç»æååä¸ä¸æè¾¹çï¼
- ç¸å ³äºä»¶åèåå½å ¥åä¸ä¸ä¸æ
- 使ç¨éç¨è¯è¨ï¼Ubiquitous Languageï¼
- ç¡®å®ä¸ä¸æä¹é´çå ³ç³»
æ¥éª¤3ï¼ä¸ä¸ææ å°
å®ä¹ä¸ä¸æé´çéæå ³ç³»ï¼
| æ¨¡å¼ | 说æ | éç¨åºæ¯ |
|---|---|---|
| å ±äº«å æ ¸ | å ±äº«é¨å模å | ç´§å¯åä½å¢é |
| 客æ·-ä¾åºå | ä¸ä¸æ¸¸ä¾èµ | æç¡®çæå¡ä¾èµ |
| é²è å± | é离å¤é¨æ¨¡å | éæéçç³»ç» |
| 弿¾ä¸»æºæå¡ | æä¾æ åAPI | 夿¶è´¹è åºæ¯ |
| åå¸è¯è¨ | å ±äº«æ°æ®æ ¼å¼ | äºä»¶é©±å¨éæ |
æ¥éª¤4ï¼ææ¯å»ºæ¨¡
卿¯ä¸ªä¸ä¸æå è¿è¡è¯¦ç»è®¾è®¡ï¼
# èåæ ¹ç¤ºä¾
class Order(AggregateRoot):
def __init__(self, order_id: OrderId, customer_id: CustomerId):
self.id = order_id
self.customer_id = customer_id
self.items: List[OrderItem] = []
self.status = OrderStatus.DRAFT
def add_item(self, product_id: ProductId, quantity: int, price: Money):
"""æ·»å 订å项 - ä¸å¡é»è¾å°è£
å¨èåå
"""
if self.status != OrderStatus.DRAFT:
raise DomainException("åªè½åèç¨¿è®¢åæ·»å åå")
item = OrderItem(product_id, quantity, price)
self.items.append(item)
self.add_event(OrderItemAdded(self.id, item))
def submit(self):
"""æäº¤è®¢å - 触åé¢åäºä»¶"""
if not self.items:
raise DomainException("订åä¸è½ä¸ºç©º")
self.status = OrderStatus.SUBMITTED
self.add_event(OrderSubmitted(self.id, self.total_amount))
# å¼å¯¹è±¡ç¤ºä¾ - ä¸å¯åï¼æ æ è¯
@dataclass(frozen=True)
class Money:
amount: Decimal
currency: str
def add(self, other: 'Money') -> 'Money':
if self.currency != other.currency:
raise ValueError("è´§å¸ç±»åä¸å¹é
")
return Money(self.amount + other.amount, self.currency)
# é¢åäºä»¶ç¤ºä¾
@dataclass(frozen=True)
class OrderSubmitted(DomainEvent):
order_id: OrderId
total_amount: Money
occurred_at: datetime = field(default_factory=datetime.utcnow)
æ¶ææ¨¡å¼
å è¾¹å½¢æ¶æï¼ç«¯å£ä¸éé å¨ï¼
âââââââââââââââââââââââââââââââââââ
â åºç¨å±ï¼Applicationï¼ â
âââââââââââââ â âââââââââââââââââââââââââââ â âââââââââââââ
â REST âââââ¼âââ 端å£ï¼Portsï¼ ââââ¼âââºâ æ°æ®åº â
â API â â âââââââââââââââââââââââââââ â â éé
å¨ â
âââââââââââââ â â â âââââââââââââ
â â¼ â
âââââââââââââ â âââââââââââââââââââââââââââ â âââââââââââââ
â æ¶æ¯ âââââ¼âââ é¢åå±ï¼Domainï¼ ââââ¼âââºâ æ¶æ¯ â
â éå â â â èåãå®ä½ãå¼å¯¹è±¡ â â â éé
å¨ â
âââââââââââââ â âââââââââââââââââââââââââââ â âââââââââââââ
âââââââââââââââââââââââââââââââââââ
CQRS模å¼
å½ä»¤ç«¯ï¼Command Sideï¼ æ¥è¯¢ç«¯ï¼Query Sideï¼
â â
â¼ â¼
ââââââââââââââââ ââââââââââââââââ
â Command Bus â â Query Bus â
ââââââââââââââââ ââââââââââââââââ
â â
â¼ â¼
ââââââââââââââââ ââââââââââââââââ
â èåæ ¹ âââäºä»¶ââ⺠â 读模å â
âï¼å模åï¼ â âï¼ä¼åæ¥è¯¢ï¼ â
ââââââââââââââââ ââââââââââââââââ
â â
â¼ â¼
ââââââââââââââââ ââââââââââââââââ
â äºä»¶åå¨ â â æ¥è¯¢æ°æ®åº â
ââââââââââââââââ ââââââââââââââââ
èµæºæä»¶
详ç»åèææ¡£ï¼
references/strategic-design.md– æç¥è®¾è®¡è¯¦è§£references/tactical-design.md– ææ¯è®¾è®¡æ¨¡å¼references/patterns.md– DDDæ¶ææ¨¡å¼assets/ddd-model-template.drawio– é¢åæ¨¡åæ¨¡æ¿
常è§é®é¢
Q: å¦ä½ç¡®å®èåè¾¹çï¼
- è¯å«ä¸å¡ä¸åå¼ï¼å¿ é¡»å§ç»ä¸ºççè§åï¼
- ä¸å弿¶åçå®ä½åºå¨åä¸èåå
- ä¼å å°èåï¼éè¿é¢åäºä»¶å®ç°è·¨èåä¸è´æ§
Q: 使¶ä½¿ç¨é¢åæå¡ï¼
- ä¸å¡é»è¾ä¸èªç¶å±äºä»»ä½å®ä½æå¼å¯¹è±¡
- éè¦åè°å¤ä¸ªèåçæä½
- ä¾å¦ï¼è½¬è´¦æå¡ï¼åè°ä¸¤ä¸ªè´¦æ·èåï¼
Q: å¦ä½å¤çè·¨èåäºå¡ï¼
- 使ç¨Saga模å¼ç¼æé¿äºå¡
- éè¿é¢åäºä»¶å®ç°æç»ä¸è´æ§
- é¿å åå¸å¼äºå¡ï¼æ¥æ±è¡¥å¿æºå¶