public IEnumerable <IEvent> HandleCreateCourse(CreateCourse command)
        {
            // Validate the command.
            if (State != null)
            {
                return(new IEvent[] { new Failed("Can't create an existing course.") });
            }
            if (command == null)
            {
                return(new IEvent[] { new Failed("Can handle a null command.") });
            }
            var validationResult = CourseValidator.Validate(command);

            if (!validationResult.IsValid)
            {
                return(new IEvent[] { new Failed(GetFormattedErrorMessage(validationResult)) });
            }

            return(new IEvent[] { new CourseCreated(command) });
        }
        public IEnumerable <IEvent> HandleUpdateCourse(UpdateCourse command)
        {
            // Validate the command.
            if (State == null)
            {
                return(new IEvent[] { new Failed("Course doesn't exist.") });
            }
            if (Deleted)
            {
                return(new IEvent[] { new Failed("The course was previously deleted.") });
            }
            var validationResult = CourseValidator.Validate(command);

            if (!validationResult.IsValid)
            {
                return(new IEvent[] { new Failed(GetFormattedErrorMessage(validationResult)) });
            }

            // Validate that the command doesn't conflict with the current state.
            if (command.Id != State.Id)
            {
                validationResult.Errors.Add(new ValidationFailure("Id", "Id mismatch."));
            }
            if (command.Holes.Length != State.Holes.Length)
            {
                validationResult.Errors.Add(new ValidationFailure("Holes", "Cannot change the number of holes."));
            }
            if (command.PlayerId != State.PlayerId)
            {
                validationResult.Errors.Add(new ValidationFailure("PlayerId", "Cannot change a course's player."));
            }
            if (!validationResult.IsValid)
            {
                return(new IEvent[] { new Failed(GetFormattedErrorMessage(validationResult)) });
            }

            return(new IEvent[] { new CourseUpdated(command) });
        }