アプリケーション層における実装
最後に、アプリケーションサービスのサンプルコードを見てみましょう。
SaaSOvationにおけるテナントをアクティベーションするユースケースが存在します。この場合、UI層からはアプリケーションサービス「IdentityApplicationService」の「provisionTenant」メソッドを呼び出して更新を依頼します。
// アプリケーションサービス
@Transactional
public class IdentityApplicationService {
// 引数コマンドに応じたテナントを有効化する
@Transactional
public Tenant provisionTenant(ProvisionTenantCommand aCommand) {
//ドメインサービス「tenantProvisioningService」を呼び出し
return
this.tenantProvisioningService().provisionTenant(
aCommand.getTenantName(),
aCommand.getTenantDescription(),
new FullName(
aCommand.getAdministorFirstName(),
aCommand.getAdministorLastName()),
new EmailAddress(aCommand.getEmailAddress()),
new PostalAddress(
aCommand.getAddressStateProvince(),
aCommand.getAddressCity(),
aCommand.getAddressStateProvince(),
aCommand.getAddressPostalCode(),
aCommand.getAddressCountryCode()),
new Telephone(aCommand.getPrimaryTelephone()),
new Telephone(aCommand.getSecondaryTelephone()));
}
}
このメソッドの引数「ProvisionTenantCommand」は、Commandパターンを使用しており、プリミティブ型から構成されるパラメータ群をまとめています。コマンドはDTOに似ていますが、必要な操作命令をコマンドとして明示的にカプセル化でき、時間に縛られずその動作を実行できるメリットがあります。
最後に
本連載は今回で最終回となります。2年以上に渡る連載となりましたが、DDDコミュニティは引き続き盛り上がっています。実用的で正しいシステムを構築することは簡単ではありませんが、当連載がなにかのきっかけとなり、より良い開発への一歩となれば幸いです。
これまで記事を読んでいただいた読者の皆さま、執筆を支えて頂いた山田祥寛さん、奈美さん、多くの技術アドバイスをしていただいた上坂貴志さん、IDDDというすてきな書籍について連載の機会を与えてくださったCodeZine編集部の皆さま、本当にありがとうございました。
参考
- 開発者が知っておくべき、6つのUIアーキテクチャ・パターン
- DTOとプレゼンテーションモデルの混乱
- Data Transfer Object(Martin Fowler's Bliki (ja))
- Presentation Model(martinfowler.com)
- コマンドパターン(Wikipedia)
- Hibernate in Action における DTO についての考察
- 近辺の用語(EntityとかVOとかDTOとか)について整理しつつ考える
- Presentation Modelパターンの学習メモ
- MVC の Model 肥大化への対処
- サービス開発における フロントエンド・ドメイン駆動設計の実践
- SOAで活用されるデザイン・パターン その1
- SOAで活用されるデザイン・パターン その2
