代码之家  ›  专栏  ›  技术社区  ›  Pradeep

在java中向DAO注入服务是一种好方法吗

  •  -2
  • Pradeep  · 技术社区  · 7 年前

     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;
        }
    
        }
    

    像下面这样在DAO中注入UserService是一种好方法吗,因为这与DAO逻辑无关,所以这样写是一种好方法。

    public  ParticipationDao(String userId, ConnectionFactory connectionFactory, UserService userService) {
            this.userId = userId;
            this.connectionFactory = connectionFactory;
            this.userService = userService;
    
        }
    

    建议任何好的方法。谢谢您

    2 回复  |  直到 7 年前
        1
  •  0
  •   NiVeR    7 年前

    是的,这很好,因为您的依赖项是从外部注入的,也就是说,从使用 dao . 以这种方式 不需要知道服务本身的构造细节,并且服务可以自由更改,但是只要提供了依赖项,就没有问题 观点。

    想象一下你的 构造了自己的用户服务实例。如果用户服务构造函数由于需要更多详细信息而被修改,会发生什么情况?那么你也应该修改你的 . 这不好。依赖注入就是为了解决这些问题而发明的。

        2
  •  0
  •   Duong Nguyen    7 年前

    好或坏实际上是一个相对的限定符,在软件世界中,如果大多数工程师遵循相同的实践或模式集,以便代码读取器能够很容易地遵循并在以后操作代码,通常是好的。 在您的情况下,人们通常会尽可能地保持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(...);
         });
    }