Skip to main content

基础设施层编码指引

基础设施层的一个重要作用,是提供各层接口申明的实现。

比如,在领域层中,我们定义了UserRepository仓储接口,它只是个接口,我们需要实现,这个实现就是在基础设施层实现的。

1. 申明UserRepository的JPA实现

如果你的仓储是使用JPA的,那实现的标准方式应该是参照如下代码所示:


@Named
public class UserRepositoryJPA extends AbstractRepositoryJPA implements UserRepository {

@Override
public User queryUserByUserId(String userId) {
return getEntityManager().createQuery("from User where userId = :userId",User.class)
.setParameter("userId",userId)
.getResultList().stream().findFirst().orElse(null);
}

}

上面这就是对UserRepository仓储的一个JPA实现UserRepositoryJPA, 它实现了UserRepository接口,并继承了一个AbstractRepositoryJPA父类

其中,AbstractRepositoryJPA是对AbstractRepository接口的实现,我们在UserRepository接口中继承了AbstractRepository接口,所以我们在这为它提供一个默认的实现。

不要忘记在实现上,使用@Named Annotation来将这个实现流入到Spring IOC中

2. 编写单元测试

现在,我们可以为我们的仓储实现,编写一个单元测试,以验证它的正确性。


class TestUserRepository extends AbstractTest {

@Inject
private UserRepository userRepository;

@Test
@Transactional
void testQueryUserById(){
User notExistUser = userRepository.queryUserByUserId(randomId());
Assertions.assertNull(notExistUser);

User created = userRepository.save(randomUser());
Assertions.assertNotNull(created);

User query = userRepository.queryUserByUserId(created.getUserId());
Assertions.assertNotNull(query);
}
}


运行你的单元测试以验证它

有关单元测试的详细指引,请参阅单元测试章节