我有一个场景,我需要在DAO层中调用一些服务,以基于来自数据库(结果集中)的输入来获取一些数据。那么最好的方式实例化服务。插入DAO构造函数或实例化结果集。请参阅以下示例以进行清晰的了解
public class ParticipationDao {
private ConnectionFactory connectionFactory'
private int userId;
/**
* Constructor which injects dependencies
*/
public ParticipationDao(String userId, ConnectionFactory connectionFactory) {
this.userId = userId;
this.connectionFactory = connectionFactory;
}
public List<Participation> getParticipantDetails(Integer studyId) throws StudyParticipationException {
List<Participation> participationList = new ArrayList<>();
String query = //some QUERY.....
try (Connection connection = connectionFactory.getConnection();
PreparedStatement stmt = connection.prepareStatement(query); ) {
stmt.setInt(1, studyId);
try (ResultSet rs = stmt.executeQuery();) {
while (rs.next() ) {
Participation p = new Participation();
//SOME OTHER ASSIGNMENTS ......
String modifiedUserId = rs.getString("ModifiedByID");
// TODO call some service here to get the username and assign to the setUserName method.
p.setUserName(assignHere);
participationList.add(p);
}
}
} catch (SQLException | ConnectionFactoryException e) {
throw new StudyParticipationException(e.getMessage(), e);
}
return participationList;
}
}
是将UserService注入到DAO中的好方法,如下所示,因为这与DAO逻辑无关,因此是这样编写的好方法。
public ParticipationDao(String userId, ConnectionFactory connectionFactory, UserService userService) {
this.userId = userId;
this.connectionFactory = connectionFactory;
this.userService = userService;
}
建议使用任何好的方法。谢谢你
答案 0 :(得分:0)
是的,这很好,因为您的依赖项是从外部(即,将使用dao
的任何人)注入的。这样,您的dao
不需要了解服务本身的构造细节,并且服务可以自由更改,但是只要提供了依赖关系,从dao
的角度来看就没有问题了。 。
想象一下,您的dao
构建了自己的用户服务实例。如果由于需要更多细节而修改了用户服务构造函数,将会发生什么?然后,您还应该修改dao
。这个不好。发明了依赖注入技术来解决这些问题。
上一点对于测试也很有用,因为它可以轻松模拟依赖项。
答案 1 :(得分:0)
好坏实际上是一个相对的限定词,在软件世界中,如果大多数工程师遵循相同的一组实践或模式通常是一件好事,以便代码阅读器易于遵循和以后对代码进行操作。
在您的情况下,人们通常会尽量减少DAO,如果您需要使用来自其他服务的信息来丰富DAO提取的对象,那么最好在服务中做到这一点,例如ParticipationService
。
public ParticipationService(UserService userService, ParticipationDao Participation dao) {
this.userService = userService;
this.dao = dao;
}
public List<Participation> getParticipantDetails(Integer studyId) {
return this.dao.getParticipantDetails(studyId).forEach(p -> {
p.setUserName = userService.lookup(...);
});
}