首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何改进这种分层架构?

如何改进这种分层架构?
EN

Stack Overflow用户
提问于 2014-03-21 06:18:52
回答 1查看 814关注 0票数 3

在我的工作中,我们遵循这样的分层架构: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公共项目的项目

这些项目有不同的目的:

  • One项目是一个内部支持工具,另一个项目是我们的监视工具customers
  • Another是一个自定义引擎,用于驱动

的目的

问题

我对这个架构的问题是,如果我想要向依赖于我们的公共项目的模块添加像getMostRecentOrder()这样的新功能,我必须创建4个方法而不是1个方法。另外,我们为我们的一个应用程序创建了另一个层,它抽象了Spring,因为工程师不想/需要知道它,它总共创建了5个方法。

有没有人遵循类似的分层架构,并能够解决或找到更好的解决方案?

与我共事的架构师喜欢这种结构,但我真的开始不喜欢它了,因为添加所有这些方法只是为了提取数据对我来说是乏味的,而且由于层的存在,似乎我正在编写大量重复的代码,只是数据类型发生了变化。

架构师希望我们的be是通用的,就像WeatherBO一样,拥有天气的所有业务逻辑,事件的所有逻辑等。我的问题是,我们的be开始有1000行代码,当我们有大量的类时,我会感到沮丧。

有谁能提供一些关于一些成功的Java分层架构的见解,这些架构简单(3层与我的4层或5层)、可维护、灵活、可伸缩等(基本上是开发人员的头号梦想哈哈)?

更新:提供层的伪代码

存储库

代码语言:javascript
运行
复制
public interface IOrderRepository extends JpaRepository {
       @Query("FROM Order o WHERE o.time = Max Time")
       Order getMostRecentOrder();
}

数据库服务

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
 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

代码语言:javascript
运行
复制
 @Service
 public final class OrderBO {
     @Autowired
     private IOrderDAO orderDAO;

     public OrderDTO getMostRecentOrder() {
        return orderDAO.getMostRecentOrder();
     }
 }

Web服务调用

代码语言:javascript
运行
复制
 @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等。

EN

回答 1

Stack Overflow用户

发布于 2014-04-01 09:28:58

我不认为这里有正确或错误的答案,但我通常做的是…

我会创建一个“数据库”项目。这个项目将有所有的数据库交互。

然后我会创建一个“服务”项目,这个项目将包含所有的业务/服务操作。它还直接与“数据库”项目交互。此项目将公开所有业务方法,如saveClient(客户端)、deleteClient(客户端)、updateProjects(列出项目)等。

然后,我创建了N个“客户端”项目,然后与调用接口方法的“服务”项目进行交互。

只有几个附注。客户端是客户端应用程序,如web应用程序、桌面应用程序或移动应用程序。根据需求,它们都“可以/应该”与相同的服务层交互。2-这是概念性概述。

我试着让每件事都保持标准。然而,你的“抱怨”是,如果你有一个新的“客户”需求,比如“按特定顺序显示项目”,你需要3到4个新方法。是的,您将需要编写3到4个新方法,这取决于您拥有的层数。我记得使用整个J2EE堆栈的项目,其中一个简单的CRUD操作需要来自DAO的12个类,facades,拦截器和其他一些类。

就我个人而言,我尝试遵循KISS principle

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22546361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档