/// <summary>
        /// Processes the specified command.
        /// </summary>
        /// <param name="command">
        /// The command to process.
        /// </param>
        /// <param name="repositories">
        /// An object that provides access to data access repositories.
        /// </param>
        /// <param name="transaction">
        /// A transaction that is used to process the command.
        /// </param>
        /// <param name="controlToken">
        /// A token that ensures thread safety for the operation.
        /// </param>
        protected override void Process(AddFibonacciNumberCommand command, IFactoryProducedInstanceGroup repositories, IDataAccessTransaction transaction, ConcurrencyControlToken controlToken)
        {
            var fibonacciNumberSeries = NumberSeries.Named.Fibonacci;
            var numberRepository      = repositories.Get <NumberRepository>();
            var number = numberRepository.FindByValue(command.NumberValue);

            if (number is null)
            {
                number = new Number()
                {
                    Identifier = Guid.NewGuid(),
                    Value      = command.NumberValue
                };

                numberRepository.Add(number);
            }

            var numberSeriesNumberRespository = repositories.Get <NumberSeriesNumberRepository>();
            var numberSeriesNumber            = numberSeriesNumberRespository.FindWhere(entity => entity.Number.Value == number.Value && entity.NumberSeriesIdentifier == fibonacciNumberSeries.Identifier).SingleOrDefault();

            if (numberSeriesNumber is null)
            {
                numberSeriesNumber = new NumberSeriesNumber()
                {
                    Identifier             = Guid.NewGuid(),
                    Number                 = number,
                    NumberIdentifier       = number.Identifier,
                    NumberSeriesIdentifier = fibonacciNumberSeries.Identifier
                };

                numberSeriesNumberRespository.Add(numberSeriesNumber);
            }
        }
 /// <summary>
 /// Processes the specified command.
 /// </summary>
 /// <param name="command">
 /// The command to process.
 /// </param>
 /// <param name="repositories">
 /// An object that provides access to data access repositories.
 /// </param>
 /// <param name="transaction">
 /// A transaction that is used to process the command.
 /// </param>
 /// <param name="controlToken">
 /// A token that ensures thread safety for the operation.
 /// </param>
 protected abstract void Process(TCommand command, IFactoryProducedInstanceGroup repositories, IDataAccessTransaction transaction, ConcurrencyControlToken controlToken);
        /// <summary>
        /// Processes the specified command.
        /// </summary>
        /// <param name="command">
        /// The command to process.
        /// </param>
        /// <param name="repositories">
        /// An object that provides access to data access repositories.
        /// </param>
        /// <param name="transaction">
        /// A transaction that is used to process the command.
        /// </param>
        /// <param name="controlToken">
        /// A token that ensures thread safety for the operation.
        /// </param>
        /// <returns>
        /// The result that is emitted when processing the command.
        /// </returns>
        protected sealed override IEnumerable <Int64> Process(GetFibonacciNumberValuesCommand command, IFactoryProducedInstanceGroup repositories, IDataAccessTransaction transaction, ConcurrencyControlToken controlToken)
        {
            var numberSeriesNumberRepository = repositories.Get <NumberSeriesNumberRepository>();

            return(numberSeriesNumberRepository.FindWhere(entity => entity.NumberSeries.Identifier == NumberSeries.Named.Fibonacci.Identifier).Select(entity => entity.Number.Value).ToList());
        }