public class DiscountCalculationService {
public Money calculateDiscountAmounts(
List<OrderLine> orderLines, List<Coupon> coupons, MemberGrade grade) {
Money couponDiscount = coupons.stream()
.map(coupon -> calculateDiscount(coupon))
.reduce(Money(0), (v1, v2) -> v1.add(v2));
Money membershipDiscount = calculateDiscount(orderer.getMember().getGrade());
return couponDiscount.add(membershipDiscount);
}
private Money calculateDiscount(Coupon coupon) {
...
}
private Money calculateDiscount(MemberGrade grade) {
...
}
}
할인 계산 서비스를 사용하는 주체는 애그리거트가 될 수도 있고 응용 서비스가 될 수도 있다.
DiscountCalculationService 를 애그리거트의 결제 금액 계산 기능에 전달하면 사용 주체는 애그리거트가 된다.
에그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서비스 책임이다.
// 애그리거트의 결제 금액 계산 기능을 도메인 서비스가 처리
public class Order {
public void calculateAmounts(
DiscountCalculationService disCalSvc, MemberGrade grade) {
Money totalAmounts = getTotalAmounts();
Money discountAmounts =
disCalSvc.calculateDiscajrrtAnouits(this.orderLines, this.coupons, grade);
this.paymentAmounts = totaBVnounts.minus(discountAmounts);
}
...
}
public class TransferService {
public void transfer(Account fromAcc, Account toAcc, Money amounts) {
fromAcc.withdraw(amounts);
toAcc.credit(amounts);
}
...
}
public class Order {
@Autowired
private DiscountCalculationService discountCalculationService;
}