acc-create-anti-corruption-layer
1
总安装量
1
周安装量
#47143
全站排名
安装命令
npx skills add https://github.com/dykyi-roman/awesome-claude-code --skill acc-create-anti-corruption-layer
Agent 安装分布
opencode
1
claude-code
1
Skill 文档
Anti-Corruption Layer Generator
Generate DDD-compliant Anti-Corruption Layer (ACL) components for isolating bounded contexts and integrating with external/legacy systems.
When to Use
| Scenario | Example |
|---|---|
| Legacy system integration | ERP, CRM, mainframe |
| Third-party API integration | Payment gateway, shipping API |
| Bounded context communication | Order â Inventory contexts |
| Database migration | Old schema â new domain model |
| Microservice integration | External service with different model |
Anti-Corruption Layer Characteristics
- Isolation: Protects domain model from external/foreign concepts
- Translation: Converts between domain and external models
- Facade: Provides simplified interface to external systems
- Adapter: Implements domain ports using external services
- No Domain Leakage: External concepts never enter domain layer
- Bidirectional: Can translate both inbound and outbound
ACL Architecture
YOUR BOUNDED CONTEXT
âââ DOMAIN LAYER
â âââ Port (Interface) ââââââââââââââ
â â
âââ ANTI-CORRUPTION LAYER â
â âââ Adapter (implements Port) âââââ
â âââ Translator (Domain â External)
â âââ Facade (External system wrapper)
â âââ External DTOs
â
âââ EXTERNAL SYSTEM (Legacy, API, other bounded context)
Generation Process
Step 1: Generate Domain Port
Path: src/Domain/{BoundedContext}/Port/
{ExternalSystem}PortInterface.phpâ Domain interface for external system
Step 2: Generate External DTOs
Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/DTO/
{ExternalSystem}{Concept}DTO.phpâ DTOs matching external format
Step 3: Generate Translator
Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/
{ExternalSystem}Translator.phpâ Domain â External conversion
Step 4: Generate Facade
Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/
{ExternalSystem}Facade.phpâ Simplified external system interface
Step 5: Generate Adapter
Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/
{ExternalSystem}Adapter.phpâ Implements domain port
Step 6: Generate Exceptions
Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/Exception/
{ExternalSystem}Exception.phpâ Domain exception{ExternalSystem}ConnectionException.phpâ Infrastructure exception
Step 7: Generate Tests
{ExternalSystem}TranslatorTest.phpâ Translation tests{ExternalSystem}AdapterTest.phpâ Adapter integration tests
File Placement
| Component | Path |
|---|---|
| Domain Port | src/Domain/{BoundedContext}/Port/{ExternalSystem}PortInterface.php |
| External DTO | src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/DTO/ |
| Translator | src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/{ExternalSystem}Translator.php |
| Facade | src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/{ExternalSystem}Facade.php |
| Adapter | src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/{ExternalSystem}Adapter.php |
| Exceptions | src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/Exception/ |
| Tests | tests/Unit/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/ |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Port | {ExternalSystem}PortInterface |
PaymentGatewayPortInterface |
| DTO | {ExternalSystem}{Concept}DTO |
StripeChargeDTO |
| Translator | {ExternalSystem}Translator |
StripeTranslator |
| Facade | {ExternalSystem}Facade |
StripeFacade |
| Adapter | {ExternalSystem}Adapter |
StripeAdapter |
| Exception | {ExternalSystem}Exception |
StripeException |
Quick Template Reference
Domain Port
interface {ExternalSystem}PortInterface
{
public function {operation}({DomainParameters}): {DomainReturnType};
}
Translator
final readonly class {ExternalSystem}Translator
{
public function toDomain({ExternalSystem}DTO $dto): {Entity};
public function toExternal({Entity} $entity): {ExternalSystem}DTO;
}
Adapter
final readonly class {ExternalSystem}Adapter implements {ExternalSystem}PortInterface
{
public function __construct(
private {ExternalSystem}Facade $facade,
private {ExternalSystem}Translator $translator,
) {}
public function {operation}({DomainParameters}): {DomainReturnType}
{
$dto = $this->translator->toExternal($entity);
$result = $this->facade->{externalOperation}($dto);
return $this->translator->toDomain($result);
}
}
Usage Example
// Domain port interface
interface PaymentGatewayPortInterface
{
public function charge(Payment $payment): PaymentId;
public function refund(PaymentId $paymentId, Money $amount): void;
}
// Adapter implementation
final readonly class StripeAdapter implements PaymentGatewayPortInterface
{
public function charge(Payment $payment): PaymentId
{
$stripeCharge = $this->translator->toStripeCharge($payment);
$result = $this->facade->createCharge($stripeCharge);
return $this->translator->toPaymentId($result);
}
}
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| Domain using external DTOs | External concepts leak into domain | Always translate at ACL boundary |
| Translator in domain layer | Infrastructure concern in domain | Keep translator in infrastructure |
| Exposing external exceptions | Coupling to external system | Wrap in domain exceptions |
| Direct API calls from domain | No isolation | Use port/adapter pattern |
| Shared DTOs across ACLs | Coupling between integrations | Each ACL has own DTOs |
| Business logic in translator | Wrong responsibility | Translator only maps data |
DI Configuration
# services.yaml
Domain\Payment\Port\PaymentGatewayPortInterface:
alias: Infrastructure\Payment\ACL\Stripe\StripeAdapter
Infrastructure\Payment\ACL\Stripe\StripeFacade:
arguments:
$client: '@stripe.client'
References
For complete PHP templates and examples, see:
references/templates.mdâ Domain Port, External DTO, Translator, Facade, Adapter, Exception templatesreferences/examples.mdâ Stripe Payment Gateway ACL complete example and tests