我试图找出我的 API 项目架构的选项。
我想使用 JAX-RS 1.0 版创建一个 API。此 API 使用来自更大、旧且复杂的应用程序的远程 EJB (EJB 3.0)。我正在使用 Java 6。
到目前为止,我可以做到这一点并且可以工作。但我对解决方案不满意。查看我的包裹配置。在代码之后描述了我的担忧:
/api/
/com.organization.api.v1.rs -> Rest Services with the JAX-RS annotations
/com.organization.api.v1.services -> Service classes used by Rest Services. Basically, they only have the logic to transform the DTOs objects from Remote EJBs in JSON. This is separated by API version, because the JSON can be different in each version.
/com.organization.api.v1.vo -> View Objects returned by the Rest Services. They will be transformed in JSON using Gson.
/com.organization.api.services -> Service classes used by versioned Services.
Here we have the lookup for Remote EJBs and some API logic, like validations. This services can be used by any versioned of each Service.
的例子com.organization.api.v1.rs.UserV1RS
:
@Path("/v1/user/")
public class UserV1RS {
@GET
public UserV1VO getUsername() {
UserV1VO userVO = ServiceLocator.get(UserV1Service.class).getUsername();
return userVO;
}
}
的例子com.organization.api.v1.services.UserV1Service
:
public class UserV1Service extends UserService {
public UserV1VO getUsername() {
UserDTO userDTO = getUserName(); // method from UserService
return new UserV1VO(userDTO.getName);
}
}
的例子com.organization.api.services.UserService
:
public class UserService {
public UserDTO getUsername() {
UserDTO userDTO = RemoteEJBLocator.lookup(UserRemote.JNDI_REMOTE_NAME).getUser();
return userDTO;
}
}
我的项目的一些要求:
- API 有版本:v1、v2 等。
- 同一版本化服务的不同 API 版本可以共享代码:
UserV1Service
并且UserV2Service
使用UserService
. - 不同版本化服务的不同 API 版本可以共享代码:
UserV1Service
并OrderV2Service
使用AnotherService
. - 每个版本都有自己的视图对象(
UserV1VO
而不是UserVO
)。
上面的代码让我感到困扰的是:
- 这
ServiceLocator
门课对我来说不是一个好方法。这个类使用旧库中的遗留代码,我对这个类的工作方式有很多疑问。使用的方式ServiceLocator
对我来说也很奇怪,而且这种策略不适合模拟 我的单元测试服务。我想创建一个新的 ServiceLocator 或使用一些依赖注入策略(或另一种更好的方法)。 - 这
UserService
不打算由另一个“外部”服务使用,例如OrderService
. 它仅适用于UserVxService
. 但在未来,也许OrderService
想使用一些来自UserService
...的代码 - 即使我忽略了最后一个问题,我也需要在我的代码
ServiceLocator
中做很多事情。lookups
创建循环依赖(serviceOne查找serviceTwo那个查找serviceThree那个查找serviceOne)的几率非常高。 - 在这种方法中,VO
UserV1VO
可以在我的未版本化服务(com.organization.api.services
)中使用,但这不会发生。一个好的架构不允许不允许的东西。我有创建一个新项目的想法,比如api-services
并将其放在com.organization.api.services
那里以避免这种情况。这是一个好的解决方案吗?
所以……想法?