ドメインサービスの例
それでは概要を理解したところで、ドメインサービスの具体的な例を見てみましょう。
SaaSOvationのコード例
ここではSaaSOvationのドメインサービスのソースコード「businessPriorityTotalsクラス」を見てみましょう。
この処理では、Scrumプロダクトの中から未処理のバックログアイテムを取り出し、ビジネス優先度を合計する処理を実装しています。
package com.saasovation.agilepm.domain.model.product.backlogitem; // ビジネス優先度計算用ドメインサービス public class BusinessPriorityCalculator { // リポジトリ private BacklogItemRepository backlogItemRepository; // コンストラクタ public BusinessPriorityCalculator( BacklogItemRepository aBacklogItemRepository) { super(); this.backlogItemRepository = aBacklogItemRepository; } // 「ビジネス優先度を合計する」メソッド public BusinessPriorityTotals businessPriorityTotals( TenantId aTenantId, ProductId aProductId) { int totalBenefit = 0; int totalPenalty = 0; int totalCost = 0; int totalRisk = 0; // リポジトリからBacklogItemのコレクションを取得 Collection<BacklogItem> outstandingBacklogItems = this.backlogItemRepository() .allOutstandingProductBacklogItems(aTenantId, aProductId); // 複数のBaklogアイテムの集計処理を実施 for (BacklogItem backlogItem : outstandingBacklogItems) { if (backlogItem.hasBusinessPriority()) { BusinessPriorityRatings ratings = backlogItem.businessPriority().ratings(); totalBenefit += ratings.benefit(); totalPenalty += ratings.penalty(); totalCost += ratings.cost(); totalRisk += ratings.risk(); } } // 戻り値であるBusinessPriorityTotalsの値オブジェクトを設定 BusinessPriorityTotals businessPriorityTotals = new BusinessPriorityTotals( totalBenefit, totalPenalty, totalBenefit + totalPenalty, totalCost, totalRisk); return businessPriorityTotals; } private BacklogItemRepository backlogItemRepository() { return this.backlogItemRepository; } }
このドメインサービスでは、リポジトリを利用してバックログアイテムを取得して計算を行い、ビジネス優先度合計を示す値オブジェクトを生成しています。これまで解説してきた通り、複数のドメインオブジェクトを組み合わせ、変換を行う処理を実装していることがわかります。