我有一个相当熟悉的设计,每个模型都有一个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 { ... }
是一个还是另一个,还是我应该混合两者?
答案 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
将应用更新。