java - 服务层应该将对象或 ID 作为输入吗?响应应该是对象吗?

标签 java scala playframework

我有一个相当熟悉的设计,其中每个模型都有一个 DAO,然后是一个使用 DAO 并在其中包含所有业务逻辑的模型服务类。

我对如何正确创建这些服务类感到有点困惑,具体来说,我的参数应该是什么以及我的响应应该是什么样的。

假设我有一个 JSON 操作,我可以读取 JSON,然后加载我需要的对象,然后将它们传递给服务,或者我可以简单地传递 ID,然后在服务方法中加载对象。

令人困惑的是,我可以在我的 Controller 操作中做其中一些事情,或者我可以在我的服务层中做这些事情。这些类型的问题是否有明确的答案?

伪代码如下:

UserDao
  save
  update
  delete
  getById

UserService
  private userDao

  GetUser
  Update

我将在 Web 应用程序和 API 层中使用我的服务层。

我可以有这样的方法:

def GetSomething(userId: Int, locationId: Int, ...): Something = { ... }

或者我可以这样:

def GetSomething(request: GetSomethingRequest): GetSomethingResponse { ... }

是两者兼而有之,还是两者兼而有之?

最佳答案

首先,我认为对 id 使用案例类是一个很好的设计,所以将使用 UserId(id: Int)LocationId(id: Int) 假设您有这样一个模型:User(id: UserId, locations: Set[Location])

然后假设您想要像 /user/1/location/1 这样的请求提供服务 您的 Controller 需要通过返回 Location json 来处理这个问题。为了做到这一点,你需要 1.通过id查找User(可能不存在->NotFound(user with id)) 2. 对于User 查找Location(可能不存在-> NotFound(location with id)

考虑到所有这些,您将需要一个服务:def find(userId: UserId):Option[User] = {...}。然后在您的 User 中添加一个函数来查找位置:def findLocation(id: LocationId): Option[Location]。推杆 User 中的 findLocation 可防止所谓的“贫血模型”

对于更新,事情有点不同。您的 Location 可能会有自动更新的字段(例如:版本、状态等)。所以 您将需要另一个类,例如:LocationData(它可以映射到表单、json 等)和方法 def update(data: LocationData): Location on 将应用更新的位置

关于java - 服务层应该将对象或 ID 作为输入吗?响应应该是对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512534/

相关文章:

java - Play Framework : package play. db.jpa 未找到

c# - 为什么具体化的泛型很难与更高级的类型结合使用?

scala - 在 Scala 中将 List[Try[A]] 转换为 List[A]

java - 如何使用wait()和notifyAll()在GUI类和逻辑线程之间进行通信

java - 记录 Maven 原型(prototype)以及项目布局和使用情况

scala - 通过Spark创建的Hive表在HUE/Hive GUI中不可见

json - 使用 ScalaJson 序列化解决类型不匹配问题

oracle - 您在范围 : PlayFramework with Oracle 中没有隐式应用程序

java - 使用 Bouncing CaSTLe 的 PGP 加密文件无法使用 PGP 命令行解密

java - iTextSharp 页脚随着每一页逐渐变粗