【发布时间】:2012-07-26 06:59:13
【问题描述】:
我刚刚在看这篇文章:
http://www.tutorialized.com/view/tutorial/Spring-MVC-Application-Architecture/11986
我觉得很棒。它很好地解释了层架构,我很高兴我正在使用的架构几乎就是他所描述的。
但有一件事,我似乎没有明白:
首先:什么是业务逻辑,什么不是?他在文章中说(而且他不是唯一一个),业务逻辑应该放在领域模型中。所以Account 类应该有一个知道如何激活Account 的activate() 方法。据我了解,这可能涉及一些持久性工作。但是领域模型不应该依赖于 DAO。只有服务层应该知道 DAO。
那么,业务逻辑是否只是领域实体可以对自身执行的操作?就像activate()方法将active属性设置为true,加上dateActivated属性设置为new Date(),然后服务的任务是首先调用account.activate()和第二个dao.saveAccount(account)?服务需要什么外部依赖项?到目前为止,我大部分时间都是这样做的。
public AccountServiceImpl implements AccountService
{
private AccountDAO dao;
private MailSender mailSender;
public void activateAccount(Account account)
{
account.setActive(true);
account.setDateActivated(new Date());
dao.saveAccount(account);
sendActivationEmail(account);
}
private void sendActivationEmail(Account account)
{
...
}
}
我认为这与他所说的相反,不是吗?
我也没有得到关于如何拥有像 Account 这样的 Spring 线域对象的示例。如果 Account 自己发送电子邮件,则需要哪个。
鉴于此代码:
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
public class Account {
private String email;
private MailSender mailSender;
private boolean active = false;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
public void activate() {
if (active) {
throw new IllegalStateException("Already active");
}
active = true;
sendActivationEmail();
}
private void sendActivationEmail() {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setTo(email);
msg.setSubject("Congrats!");
msg.setText("You're the best.");
mailSender.send(msg);
}
}
如果我使用 Hibernate,我可以使用DependencyInjectionInterceptorFactoryBean 来连接mailSender。如果我改用 JDBC,我真的会编写以下繁琐的代码吗?另外,当我在 MVC 控制器中为 Account 创建一个新实例时,比如说将其填充到模型中??
BeanFactory beanFactory = new XmlBeanFactory(
new ClassPathResource("chapter3.xml"));
Account account = new Account();
account.setEmail("email@example.com");
((AutowireCapableBeanFactory)beanFactory).applyBeanPropertyValues(
account, "accountPrototype");
account.activate();
这不可靠而且很麻烦,不是吗?每当我看到 Account 的实例时,我都会问自己该对象是在哪里创建的。另外,如果我采用这种方法:我没有一个可以通过的 appContext.xml,而是几个,一个用于持久性,一个用于服务配置。我该怎么做?另外,每次创建这样的实例时都会创建一个全新的上下文,还是我遗漏了什么?
没有更好的解决办法吗?
非常感谢任何帮助。
【问题讨论】:
标签: java spring dependency-injection business-logic business-objects