玩法2.4:如何与Ebean分离关注点?
Play 2.4: How to separate concerns with Ebean?
所以最近开始使用 Play 2.4 的新网络应用程序。我已经在很多项目中使用 JPA,但这次我决定尝试一下 Ebean。
但是我想知道关注点分离。使用 JPA,我通常会创建模型、服务和 DAO 以实现持久性。使用 Ebean,我了解到模型支持静态方法(参见 http://ebean-orm.github.io/quickstart "Create Model")。
我见过不少示例,其中所有内容似乎都进入了模型中的这些静态方法;业务逻辑,持久性逻辑等等。这是我应该接受的使用 Ebean 的最佳实践吗?或者使用服务和 DAO 来分离逻辑是否仍然有意义,我应该由谁来以最好的方式做到这一点?
您可以像使用 JPA 一样做事,创建 DAO 等。
如果您查看 Ebean 示例中的静态方法,您会发现它们通常使用 Finder
。对于主键为 String
iso2
的 table Country
,您将拥有这样的模型 class:
@Entity
public class Country extends Model {
@Id
public String iso2;
// other stuff
}
在 Ebean 示例 ActiveRecord 风格的代码中,会有一些额外的东西。
@Entity
public class Country extends Model {
private static final Finder<String, Country> FIND = new Finder<>(String.class, Country.class);
@Id
public String iso2;
public static List<Country> findAll() {
return FIND.all();
}
// other stuff
}
如果您想将其更改为 DAO 风格的方法,只需将与 Finder
相关的代码移出 Country
.
public class CountryDao {
private static final Model.Finder<String, Country> FIND = new Model.Finder<>(String.class, Country.class);
// not static if you don't want it to be
public List<Country> findAll() {
return FIND.all();
}
}
您使用的方法进入了意见领域,但 DAO 方法有很多值得推荐的地方,尤其是现在 Play 支持开箱即用的 DI。您可以直接注入您的 DAO,而不是让控制器硬编码引用模型 classes。
// direct reference to the Country class
public class ControllerWithActiveRecord extends Controller {
public F.Promise<Result> getAllCountries() {
return F.Promise.promise(() -> Country.findAll())
.map(Json::toJson)
.map(Results::ok);
}
}
交替使用 DI。
public class ControllerWithInjectedDAO extends Controller {
private final CountryDAO countryDAO;
@Inject
public ControllerWithInjectedDAO(final CountryDAO countryDAO) {
this.countryDAO = countryDAO;
}
public F.Promise<Result> getAllCountries() {
return F.Promise.promise(() -> countryDAO.findAll())
.map(Json::toJson)
.map(Results::ok);
}
}
所以最近开始使用 Play 2.4 的新网络应用程序。我已经在很多项目中使用 JPA,但这次我决定尝试一下 Ebean。
但是我想知道关注点分离。使用 JPA,我通常会创建模型、服务和 DAO 以实现持久性。使用 Ebean,我了解到模型支持静态方法(参见 http://ebean-orm.github.io/quickstart "Create Model")。
我见过不少示例,其中所有内容似乎都进入了模型中的这些静态方法;业务逻辑,持久性逻辑等等。这是我应该接受的使用 Ebean 的最佳实践吗?或者使用服务和 DAO 来分离逻辑是否仍然有意义,我应该由谁来以最好的方式做到这一点?
您可以像使用 JPA 一样做事,创建 DAO 等。
如果您查看 Ebean 示例中的静态方法,您会发现它们通常使用 Finder
。对于主键为 String
iso2
的 table Country
,您将拥有这样的模型 class:
@Entity
public class Country extends Model {
@Id
public String iso2;
// other stuff
}
在 Ebean 示例 ActiveRecord 风格的代码中,会有一些额外的东西。
@Entity
public class Country extends Model {
private static final Finder<String, Country> FIND = new Finder<>(String.class, Country.class);
@Id
public String iso2;
public static List<Country> findAll() {
return FIND.all();
}
// other stuff
}
如果您想将其更改为 DAO 风格的方法,只需将与 Finder
相关的代码移出 Country
.
public class CountryDao {
private static final Model.Finder<String, Country> FIND = new Model.Finder<>(String.class, Country.class);
// not static if you don't want it to be
public List<Country> findAll() {
return FIND.all();
}
}
您使用的方法进入了意见领域,但 DAO 方法有很多值得推荐的地方,尤其是现在 Play 支持开箱即用的 DI。您可以直接注入您的 DAO,而不是让控制器硬编码引用模型 classes。
// direct reference to the Country class
public class ControllerWithActiveRecord extends Controller {
public F.Promise<Result> getAllCountries() {
return F.Promise.promise(() -> Country.findAll())
.map(Json::toJson)
.map(Results::ok);
}
}
交替使用 DI。
public class ControllerWithInjectedDAO extends Controller {
private final CountryDAO countryDAO;
@Inject
public ControllerWithInjectedDAO(final CountryDAO countryDAO) {
this.countryDAO = countryDAO;
}
public F.Promise<Result> getAllCountries() {
return F.Promise.promise(() -> countryDAO.findAll())
.map(Json::toJson)
.map(Results::ok);
}
}