Esempio n. 1
0
        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 bool IsSatisfiedBy(CircleMembers members)
        {
            var premiumNumber    = members.CountPremiumMembers(false);
            var circleUpperLimit = premiumNumber < 10 ? 30 : 50;

            return(members.CountMembers() >= circleUpperLimit);
        }
        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();
        }