当您在 grails 中生成控制器时,控制器直接调用域层上的方法 - 我很不明白这一点,我的每一点都在告诉我这是一种错误,因为您将后端与前端紧密耦合。我认为这属于服务层。
由于在服务层中为域对象上定义的所有方法创建一组等效的方法会非常难看,因此我创建了它AbstractService
以将所有(缺失的)方法调用从服务层委托给域层:
abstract class AbstractService {
def entityType
/**
* By default, this method takes the name of the service that extends this
* class, removes the suffix 'Service' and tries to create the Class object
* from the resulting name. Override at will.
*/
protected Class getEntityType() {
if (!entityType) {
try {
entityType = Class.forName(this.class.name[0..-8], false, Thread.currentThread().contextClassLoader)
} catch (ClassNotFoundException e) {
throw new ClassNotFoundException("Class ${this.class.name[0..-8]} could not be found. Please "
+ "override AbstractService#getEntityType() for ${this.class}.")
}
}
entityType
}
def methodMissing(String name, args) {
try {
if (getEntityType()?.metaClass?.getStaticMetaMethod(name)) {
getEntityType().invokeMethod(name, args)
} else if (args?.last()?.metaClass?.getMetaMethod(name)) {
args.last().invokeMethod(name, args.take(args.size() - 1))
} else {
throw new MissingMethodException(name, this.class, args)
}
} catch (MissingMethodException e) {
throw new MissingMethodException(name, this.class, args)
}
}
}
然后我只是扩展此服务,例如:
class UserService extends AbstractService {
}
然后我的控制器可以看起来像这样:
class UserController {
def userService
def create() {
userService.save(new User(params))
}
def list() {
userService.list(params)
}
// et cetera...
}
你不觉得这样更好吗?多亏了依赖注入,我可以重写整个业务层,而无需更改控制器中的代码——这就是我们使用依赖注入的原因,不是吗?
感谢您的回答,我想听到尽可能多的意见。