我有一个相当熟悉的设计,其中每个模型都有一个 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/