领域驱动设计(DDD):领域接口化设计

本文探讨了在领域驱动设计(DDD)中如何进行接口化设计,包括领域接口化、关联接口化和系统接口化。通过将领域模型设计为接口,可以实现不同ORM框架之间的无缝切换,解决持久化框架对接口类型支持的问题,并在单进程、集群和微服务之间进行无缝切换。同时,接口化设计也有助于在实际项目如开源电商Mallfoundry中提高代码的灵活性和可扩展性。
摘要由CSDN通过智能技术生成

领域接口化设计

把服务对象(service)和资源库对象(repository)设计成接口是最常见的。但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编程。所以我们要讨论的是全面接口化,尤其是对领域模型接口化的认识。

领域接口化

通常的情况下我们会把领域模型设计成类(class),但是你有没有想过把领域模型设计成接口(interface)?比如:

public interface User {
   
    // ...
}

public class UserImpl implements User {
   
    // ...
}

这样的设计似乎没有任何价值,那么继续深入地看看。比如:

user-object-uml

这时候看起来有点东西,因为我们为了适配不同的数据源,提供了不同的实现类。

最开始要把领域对象设计成接口,确实是为了在不同的 ORM 框架之间实现无缝切换。因为 JPA 对面向对象的支持最好,而 Mybatis 因为简单在大环境下比较流行。在解决这个问题时,通常使用层内包裹或者叫对象转换的方式来解决。具体来说是在持久层使用持久化对象(PO)与领域对象(DO)的之间进行转换。例如:

public class JpaUserRepository implements UserRepository {
   
    // ...
    @Override
    public Optional<User> findById(String id) {
   
        UserPO userPO = this.entityManager.find(UserPO.class, id);
        return Optional.ofNullable(userPO).map(UserPO::toUser);
    }

    @Override
    public User save(User user) {
   
        UserPO userPO = this.entityManager.find(UserPO.class, user.getId());
        userPO.setNickname(user.getNickname());
        // ...
        return this.entityManager.merge(userPO).toUser();
    }
}

其中 UserPO 对象基本上是对数据库表的映射,然后将数据与 User 对象进行交换。对于这种需要交换的方式既有性能的损失又比较繁琐,将 User 设计成接口后,这个交换的问题就比较简单地解决了,如下:

public class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值