- Article -

DDD

分类于 Framework 标签 DDD 发表于2024-03-04 21:03

Domain-driven design(DDD)

领域驱动设计(DDD)四层架构

1. 用户界面层(UI层)

2. 应用服务层(Application层)

3. 领域层(Domain层)

4. 基础设施层(Infrastructure层)

这种四层架构有助于将不同层次的关注点分离开来,使系统更易于理解、扩展和维护。每一层都有其特定的职责,从而降低了系统的复杂性,同时也促进了更好的模块化和可测试性。在实施DDD时,开发团队应该根据具体的业务需求和系统特点进行适当的调整。

防腐层设计建议

在领域驱动设计(DDD)中,"防腐层"是一个重要的概念,用于在不同的子域(Bounded Context)之间进行数据交互时采取一些策略和模式,以防止数据模型的混淆和依赖关系的混乱。以下是一些建议,可用于设计防腐层:

1. 明确定义子域边界

2. 使用适配器模式

3. 定义映射规则

4. 使用 Anti-Corruption Layer(ACL)

5. 避免直接依赖

6. 定期同步和协调

7. 文档化和测试

8. 考虑异步通信

设计防腐层是一个依赖具体业务情境


// Order.hpp
#include <vector>

class Order {
public:
    Order(int orderId) : orderId(orderId) {}

    void addProduct(int productId, int quantity);

private:
    int orderId;
    std::vector<std::pair<int, int>> products;  // 商品ID和数量的列表
};

// InventoryItem.hpp
class InventoryItem {
public:
    InventoryItem(int productId, int availableQuantity) : productId(productId), availableQuantity(availableQuantity) {}

    bool reserve(int quantity);

private:
    int productId;
    int availableQuantity;
};

为了防止订单管理子域直接依赖库存管理子域,我们引入防腐层。我们创建一个名为 InventoryService 的类,该类负责与库存管理子域进行交互,通过适配器模式来进行防腐:

// InventoryService.hpp
#include "InventoryItem.hpp"

class InventoryService {
public:
    bool reserveInventory(int productId, int quantity);

private:
    InventoryItem getInventoryItem(int productId);  // 通过库存管理子域获取库存信息的适配器方法
};

// InventoryService.cpp
#include "InventoryService.hpp"

bool InventoryService::reserveInventory(int productId, int quantity) {
    InventoryItem inventoryItem = getInventoryItem(productId);
    return inventoryItem.reserve(quantity);
}

InventoryItem InventoryService::getInventoryItem(int productId) {
    // 此处省略通过库存管理子域获取库存信息的逻辑
    // 这可能包括调用库存管理子域的服务、API等
    return InventoryItem(productId, /* 获取的库存数量 */);
}

现在,订单管理子域只需要与 InventoryService 交互,而不需要直接依赖库存管理子域。这种设计有助于防止子域之间的直接依赖关系,提高系统的灵活性和可维护性.

抽象中间件

public interface AccountTransferService{
  void transfer(Account sourceAccount,Account targetAccount,Money money);
}

public class AccountTransferServiceImpl implements AccountTransferService{
  public void transfer(Account sourceAccount,Account targetAccount,Money money){
    sourceAccout.deposit(money);
    targetAccout.withdraw(money);
  }
}

第四步: 用领域服务封装多实体逻辑 - 使用领域服务,封装跨实体业务,保证实体纯粹性.

图片

图片