在我的工作中,我们遵循这样的分层架构:http://www.oracle.com/technetwork/java/dataaccessobject-138824.html
我们有以下内容:
Maven数据库项目
Spring Data Repositories -运行自定义SQL的自定义@Query方法
数据库服务-调用存储库接口以持久化或从数据库获取JPA模型数据
JPA模型-包含仅具有getter和setter的Hibernate JPA模型
Maven公共项目
DAOs -调用数据库服务来获取数据并将其转换为DTO对象,或者将DTO对象转换为JPA模型以传递给数据库服务进行保存
业务对象(BO) -包含我们的业务逻辑,并调用DAO来保存或获取数据(DTO)
DTOs与JPA模型相同,但其属性可能不在数据库中
依赖于Maven公共项目的项目
这些项目有不同的目的:
的目的
问题
我对这个架构的问题是,如果我想要向依赖于我们的公共项目的模块添加像getMostRecentOrder()这样的新功能,我必须创建4个方法而不是1个方法。另外,我们为我们的一个应用程序创建了另一个层,它抽象了Spring,因为工程师不想/需要知道它,它总共创建了5个方法。
有没有人遵循类似的分层架构,并能够解决或找到更好的解决方案?
与我共事的架构师喜欢这种结构,但我真的开始不喜欢它了,因为添加所有这些方法只是为了提取数据对我来说是乏味的,而且由于层的存在,似乎我正在编写大量重复的代码,只是数据类型发生了变化。
架构师希望我们的be是通用的,就像WeatherBO一样,拥有天气的所有业务逻辑,事件的所有逻辑等。我的问题是,我们的be开始有1000行代码,当我们有大量的类时,我会感到沮丧。
有谁能提供一些关于一些成功的Java分层架构的见解,这些架构简单(3层与我的4层或5层)、可维护、灵活、可伸缩等(基本上是开发人员的头号梦想哈哈)?
更新:提供层的伪代码
存储库
public interface IOrderRepository extends JpaRepository {
@Query("FROM Order o WHERE o.time = Max Time")
Order getMostRecentOrder();
}
数据库服务
public interface IOrderService extends IService<Entity ID, Entity> {
Order getMostRecentOrder();
}
@Service
@Transactional
public final class OrderServiceImpl implements IOrderService {
@Autowired
private IOrderRepository repository;
@Override
public Order getMostRecentOrder() {
return repository.getMostRecentOrder();
}
}
DAO
public interface IOrderDAO extends IDAO<DTO Key, DTO> {
OrderDTO getMostRecentOrder();
}
@Service
@Transactional
public final class OrderDAOImpl implements IOrderDAO {
@Autowired
private IOrderService service;
// Spring Conversion Service that uses Dozer to convert JPA model to DTO
@Autowired
private ConversionService conversionService;
@Override
public OrderDTO getMostRecentOrder() {
Order order = service.getMostRecentOrder();
return conversionService.convert(order, OrderDTO.class);
}
}
BO
@Service
public final class OrderBO {
@Autowired
private IOrderDAO orderDAO;
public OrderDTO getMostRecentOrder() {
return orderDAO.getMostRecentOrder();
}
}
Web服务调用
@PATH("/orders")
@Service
public class OrderResource {
@Autowired
private OrderBO orderBO;
@GET
@PATH("/getMostRecentOrder")
@Produces(APPLICATION_JSON)
public Response getMostRecentOrder() {
Response response = Response.ok().build();
OrderDTO orderDTO = orderBO.getMostRecentOrder();
response.withEntity(orderDTO).build();
return response;
}
}
这只是一个例子,但BO比我提供的例子要大得多,大约有1000行代码或关闭。另外,我担心DAO也会变得很大。对于每个DTO和JPA模型,我们都有一个DAO、Service和Repository。OrderBO通常是公共DAO的集合,例如,一个BO可以有订单DAO、发票DAO、客户DAO等。
发布于 2014-04-01 09:28:58
我不认为这里有正确或错误的答案,但我通常做的是…
我会创建一个“数据库”项目。这个项目将有所有的数据库交互。
然后我会创建一个“服务”项目,这个项目将包含所有的业务/服务操作。它还直接与“数据库”项目交互。此项目将公开所有业务方法,如saveClient(客户端)、deleteClient(客户端)、updateProjects(列出项目)等。
然后,我创建了N个“客户端”项目,然后与调用接口方法的“服务”项目进行交互。
只有几个附注。客户端是客户端应用程序,如web应用程序、桌面应用程序或移动应用程序。根据需求,它们都“可以/应该”与相同的服务层交互。2-这是概念性概述。
我试着让每件事都保持标准。然而,你的“抱怨”是,如果你有一个新的“客户”需求,比如“按特定顺序显示项目”,你需要3到4个新方法。是的,您将需要编写3到4个新方法,这取决于您拥有的层数。我记得使用整个J2EE堆栈的项目,其中一个简单的CRUD操作需要来自DAO的12个类,facades,拦截器和其他一些类。
就我个人而言,我尝试遵循KISS principle。
https://stackoverflow.com/questions/22546361
复制相似问题