我会尽力解释。
我使用Play Framework 2,我会做很多CRUD操作。其中一些将是同一性的,所以我喜欢KISS和DRY,所以起初我在考虑一个包含list
,details
,create
,{{的抽象类。 1}}和update
方法,使用泛型对象,并通过指定要使用的对象(Model& Form)来扩展此类:
delete
一个将使用CRUD的课程:
public abstract class CrudController extends Controller {
protected static Model.Finder<Long, Model> finder = null;
protected static Form<Model> form = null;
public static Result list() {
// some code here
}
public static Result details(Long id) {
// some code here
}
public static Result create() {
// some code here
}
public static Result update(Long id) {
// some code here
}
public static Result delete(Long id) {
// some code here
}
}
如果我不在静态环境中,这将有效。
但既然如此,我该怎么办?
答案 0 :(得分:13)
这可以使用委托来实现:定义一个包含CRUD动作逻辑的常规Java类:
public class Crud<T extends Model> {
private final Model.Finder<Long, T> find;
private final Form<T> form;
public Crud(Model.Finder<Long, T> find, Form<T> form) {
this.find = find;
this.form = form;
}
public Result list() {
return ok(Json.toJson(find.all()));
}
public Result create() {
Form<T> createForm = form.bindFromRequest();
if (createForm.hasErrors()) {
return badRequest();
} else {
createForm.get().save();
return ok();
}
}
public Result read(Long id) {
T t = find.byId(id);
if (t == null) {
return notFound();
}
return ok(Json.toJson(t));
}
// … same for update and delete
}
然后,您可以定义一个Play控制器,其中包含一个包含Crud<City>
实例的静态字段:
public class Cities extends Controller {
public final static Crud<City> crud = new Crud<City>(City.find, form(City.class));
}
你差不多完成了:你只需要为Crud动作定义路线:
GET / controllers.Cities.crud.list()
POST / controllers.Cities.crud.create()
GET /:id controllers.Cities.crud.read(id: Long)
注意:此示例为brevety生成JSON响应,但可以呈现HTML模板。但是,由于Play 2模板是静态类型的,因此您需要将所有这些模板作为Crud
类的参数传递。
答案 1 :(得分:4)
(免责声明:我对playframework没有经验。)
以下想法可能有所帮助:
public interface IOpImplementation {
public static Result list();
public static Result details(Long id);
public static Result create();
public static Result update(Long id);
public static Result delete(Long id);
}
public abstract class CrudController extends Controller {
protected static Model.Finder<Long, Model> finder = null;
protected static Form<Model> form = null;
protected static IOpImplementation impl;
public static Result list() {
return impl.list();
}
public static Result details(Long id) {
return impl.details(id);
}
// other operations defined the same way
}
public class Cities extends CrudController {
public static Cities() {
impl = new CitiesImpl();
}
}
这样您就可以创建实现层次结构。
(这必须是一些奇特的设计模式,但我不知道ATM的名称。)