基础设施层编码指引
基础设施层的一个重要作用,是提供各层接口申明的实现。
比如,在领域层中,我们定义了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);
}
}
运行你的单元测试以验证它
有关单元测试的详细指引,请参阅单元测试章节