public void Join(CircleJoinCommand command) { var circleId = new CircleId(command.CircleId); var circle = circleRepository.Find(circleId); var owner = userRepository.Find(circle.Owner); var members = userRepository.Find(circle.Members); var circleMembers = new CircleMembers(circle.Id, owner, members); var circleFullSpec = new CircleMembersFullSpecification(); if (circleFullSpec.IsSatisfiedBy(circleMembers)) { throw new CircleFullException(circleId); } var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "사용자를 찾지 못했음"); } circle.Join(member); circleRepository.Save(circle); }
public void Join(CircleJoinCommand command) { using var transaction = new TransactionScope(); var circleId = new CircleId(command.CircleId); var circle = _circleRepository.Find(circleId); if (circle == null) { throw new CircleNotFoundException(circleId, "サークルが見つかりませんでした。"); } // 複雑な仕様:対処方法その1 // var circleFullSpecification = new CircleFullSpecification(_userRepository); // if (circleFullSpecification.IsSatisfiedBy(circle)) // { // throw new CircleFullException(circle.Id); // } // 複雑な仕様:対処方法その2 // ファーストコレクションクラスを利用する場合 // ドメインオブジェクトで userRepository を使わずに済む(入出力をドメインオブジェクトから排除できた) var owner = _userRepository.Find(circle.Owner); var members = _userRepository.Find(circle.Members); var circleMembers = new CircleMembers(circle.Id, owner, members); var circleMembersFullSpecification = new CircleMembersFullSpecification(); if (circleMembersFullSpecification.IsSatisfiedBy(circleMembers)) { throw new CircleFullException(circleId); } var memberId = new UserId(command.UserId); var member = _userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "ユーザーが見つかりませんでした。"); } circle.Join(member); _circleRepository.Save(circle); transaction.Complete(); }