gpt4 book ai didi

java - 关于服务、Daos 及其之间 - 初学者的困境

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:42 25 4
gpt4 key购买 nike

我对分层架构很陌生,+ spring + hibernate在阅读了一些关于类层次结构应该如何的指南之后 -

我想出了这个结构:

public interface GenericDAO {

public <T> T getItemById(long id, Class<T> c);

public <T> int save(T... objectsToSave);

public <T> int saveOrUpdate(T... objectsToSave);

public <T> int delete(T... objectsToDelete);
.
.
}

现在我所有其他 daos impl 都使用这个通用 dao 作为私有(private)字段,以便使用它的基本方法:即:

@Repository
public class UserDAOImpl implements UserDao {

@Autowired
private GenericDAO dao;

@Override
public int deleteUser(User u) {
return dao.delete(u);

}

.
.
.
}

我的服务是这样的:

 @Service
public class UserServiceImpl implements UserService {

@Autowired
private UserDao userDao;


@Transactional(readOnly = false)
public int deleteUser(User u) {
return userDao.deleteUser(u);
}
.
.
.
}

我不明白为什么我的项目中需要 UserDaoImpl 、 CarDaoImpl 、 XDaoImpl ?这看起来真的很多余,因为所有 XDaoImpl 看起来都一样:

 @Repository
public class UserDAOImpl implements UserDao {

@Autowired
private GenericDAO dao;

@Override
public int deleteUser(User u) {
return dao.delete(u);

}

.
.
.
}

@Repository
public class CarDAOImpl implements CarDao {

@Autowired
private GenericDAO dao;

@Override
public int deleteCar(Car c) {
return dao.delete(c);

}

.
.
.
}

@Repository
public class XDAOImpl implements XDao {

@Autowired
private GenericDAO dao;

@Override
public int deleteX(X c) {
return dao.delete(c);

}

.
.
.
}

我可以不创建任何 XDaoImpl,而只使用 GenericDaoImpl 来代替并节省大量的类创建,不是吗?

如果需要任何复杂的操作,例如deleteUserCar(User u),我可以在服务中实现逻辑:

UserService {
public void deleteUserCar(User u) {
Car c = u.getCar();
CarService cs.deleteCar(c);

}
}

我错过了什么吗?谁能提供一个例子,仅使用 GenericDaoImpl 而不是 XDaoImpl 会让我后悔?

谢谢

最佳答案

  • 您的服务稍后将调用业务逻辑,而不仅仅是将方法传递给 DAO。它可以验证值(例如,它是否存在以及是否应该是唯一的)、运行计算(例如 int getStock() { return bought - sold; } 等等。

  • 通用 DAO 很棒,但考虑 abstract class而不是interface 。这样你就不需要创建多个 create() s,只需扩展抽象 DAO(例如 CarDAO extends AbstractDAO<Car> )。

  • 您的扩展 DAO 将通过 class它处理通用抽象 DAO(如前面的示例所示)。

  • 您的扩展 DAO 稍后将实现仅适用于该特定对象的额外方法,例如:List<Car> getCarsWithColor(Color color) .

  • 您的服务 -> DAO 关系并不总是一对一的。考虑这些 DAO:TruckDAO , CarDAO , VanDAO与物体Truck extends Vehicle , Car extends Vehicle , Van extends Vehicle 。您需要三项服务吗,还是会VehicleService覆盖它(也许你会为所有 Vehicle 运行逻辑)?

  • 重新考虑接口(interface)的使用,this问题适用于C#但概念是一样的。

关于java - 关于服务、Daos 及其之间 - 初学者的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16581326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com