sat*_*shi 2 java spring business-logic autowired jpa-2.0
我正在编写一个网站的功能区/成就系统,我必须为我的系统中的每个功能区编写一些逻辑.例如,如果您是第一批注册到该网站的2,000人或者在论坛中发布了1,000个帖子后,您就可以获得一个功能区.这个想法非常类似于stackoverflow的徽章,真的.
因此,每个功能区显然都在数据库中,但它们还需要一些逻辑来确定用户何时获得功能区.
在我编写它的方式,Ribbon是一个简单的界面:
public interface Ribbon {
public void setId(int id);
public int getId();
public String getTitle();
public void setTitle(String title);
public boolean isEarned(User user);
}
Run Code Online (Sandbox Code Playgroud)
RibbonJpa是一个实现Ribbon接口的抽象类,避免了isEarned()方法的定义:
@Entity
@Table(name = "ribbon")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "ribbon_type")
public abstract class RibbonJpa implements Ribbon {
@Id
@Column(name = "id", nullable = false)
int id;
@Column(name = "title", nullable = false)
private String title;
@Override
public int getId() {
return id;
}
@Override
public void setId(int id) {
this.id= id;
}
@Override
public String getTitle() {
return title;
}
@Override
public void setTitle(String title) {
this.title = title;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到我将继承策略定义为SINGLE_TABLE(因为我必须像50条带一样编码,我不需要为其中任何一条添加额外的列).
现在,将实现一个特定的功能区,如下所示:
@Entity
public class FirstUsersRibbon extends RibbonJpa implements Ribbon {
public FirstUsersRibbon() {
super.setId(1);
super.setTitle("First 2,000 users registered to the website");
}
@Override
public boolean isEarned(User user) {
// My logic to check whether the specified user has won the award
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,表格是按照我期望的方式在数据库中创建的(我在本地环境中使用DDL生成).
问题是,在域对象中编写业务逻辑是错误的.这是好习惯吗?你能提出更好的解决方案吗?此外,我无法在实体(FirstUsersRibbon)中自动装配任何DAO,并且我在业务逻辑中需要它们(在这种情况下,我需要DAO来检查用户是否在注册到网站的前2,000个用户中).
任何帮助非常感谢.
谢谢!
Rae*_*ald 11
问题是,在域对象中编写业务逻辑是错误的.
许多人会说反过来是正确的:在其他地方拥有业务逻辑是一种反模式(贫血领域模型).有关详细信息,请参阅域驱动设计.
您可能会想知道传统3层架构的中间层是什么.它为应用程序提供服务层.请参阅我的相关问题" EJB的用途是什么? ".
| 归档时间: |
|
| 查看次数: |
3538 次 |
| 最近记录: |