私はちょうどこの記事を読んでいました:
http://www.tutorialized.com/view/tutorial/Spring-MVC-Application-Architecture/11986
私はそれが素晴らしいと思います。それはレイヤーアーキテクチャをうまく説明していて、私が取り組んでいるアーキテクチャが彼が説明しているものであることがうれしかったです。
しかし、私が得ていないように思われることが1つあります。
まず、ビジネスロジックとは正確には何であり、そうではないのでしょうか。彼が言う記事の中で(そして彼だけではありません)、そのビジネスロジックはドメインモデルに組み込まれるべきです。したがって、Account
クラスには、activate()
をアクティブ化する方法を知っているメソッドが必要Account
です。私の理解では、これにはおそらく永続的な作業が含まれます。ただし、ドメインモデルに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)
{
...
}
}
これは彼の言うこととは対照的だと思いますね
私も得られないのは、のような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コントローラーでアカウントの新しいインスタンスを作成するときも、モデルにデータを入力するとしますか?
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は1つではありませんが、永続性用に1つ、サービス構成用に1つ、いくつかあります。どうすればいいですか?さらに、そのようなインスタンスが作成されるたびに完全に新しいコンテキストが作成されますか、それとも何かが足りませんか?
それに対するより良い解決策はありませんか?
どんな助けでも大歓迎です。