服务层应该将对象或id作为输入吗?应答应该是对象吗?

时间:2015-11-04 02:07:17

标签: java scala playframework

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

我对如何正确创建这些服务类感到困惑,具体应该是我的参数应该是什么以及我的回答是什么。

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

令人困惑的是,我可以在我的控制器操作中执行其中的一些操作,或者我可以在我的服务层中执行此操作。对这些类型的问题有明确的答案吗?

下面的伪代码:

UserDao
  save
  update
  delete
  getById

UserService
  private userDao

  GetUser
  Update

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

我可以使用以下方法:

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

或者我可以这样:

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

是一个还是另一个,还是我应该混合两者?

1 个答案:

答案 0 :(得分:0)

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

然后我们假设您要提供/user/1/location/1之类的请求 您的控制器需要通过返回Location json来处理此问题。为了做到这一点你需要 1.按ID查找User(可能不存在 - > NotFound(具有ID的用户)) 2.对于User查找Location(可能不存在 - > NotFound(带ID的位置)

考虑到所有这些因素,您需要一项服务:def find(userId: UserId):Option[User] = {...}。然后在Your User中添加一个函数来查找位置:def findLocation(id:LocationId):Option [Location]。把 findLocation中的User会阻止所谓的'贫血模型'

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