Пример #1
0
        /// <summary> Create <see cref="IPriorityConveyor{TData, TResult}" /> with single static conveyor machine without service registration </summary>
        /// <param name="services"> Service collection </param>
        /// <param name="conveyorMachine"> Conveyor machine instance </param>
        /// <param name="maxPriority"> Max allowed operation priority </param>
        /// <param name="maxAttempts"> Max allowed retry on fail attempts </param>
        /// <typeparam name="TData"> Input data type </typeparam>
        /// <typeparam name="TResult"> Processing result type </typeparam>
        /// <exception cref="ArgumentNullException"> Thrown if <paramref name="conveyorMachine" /> is NULL </exception>
        public static IPriorityConveyor <TData, TResult> CreatePriorityConveyor <TData, TResult>(this IServiceCollection services,
                                                                                                 IConveyorMachine <TData, TResult> conveyorMachine, int maxPriority = 100, int maxAttempts = int.MaxValue)
            where TData : notnull
        {
            if (conveyorMachine == null)
            {
                throw new ArgumentNullException(nameof(conveyorMachine));
            }
            var manager = new PriorityConveyorManager <TData, TResult>(maxPriority, maxAttempts);

            services.AddHostedService(provider => new TaskWorker <IConveyorMachine <TData, TResult>, int>(provider,
                                                                                                          manager,
                                                                                                          ProcessorFactory.CreateProcessor <IConveyorMachine <TData, TResult>, int>(conveyorMachine)));
            return(manager);
        }
Пример #2
0
        /// <summary> Create <see cref="IPriorityConveyor{TData, TResult}" /> with static conveyor machines without service registration </summary>
        /// <param name="services"> Service collection </param>
        /// <param name="conveyorMachines"> Conveyor machines collection </param>
        /// <param name="maxPriority"> Max allowed operation priority </param>
        /// <param name="maxAttempts"> Max allowed retry on fail attempts </param>
        /// <typeparam name="TData"> Input data type </typeparam>
        /// <typeparam name="TResult"> Processing result type </typeparam>
        /// <exception cref="ArgumentNullException"> Thrown if <paramref name="conveyorMachines" /> is NULL </exception>
        /// <exception cref="ArgumentException"> Thrown if <paramref name="conveyorMachines" /> collection is empty </exception>
        public static IPriorityConveyor <TData, TResult> CreatePriorityConveyor <TData, TResult>(this IServiceCollection services,
                                                                                                 IEnumerable <IConveyorMachine <TData, TResult> > conveyorMachines, int maxPriority = 100, int maxAttempts = int.MaxValue)
            where TData : notnull
        {
            var arguments = (conveyorMachines ?? throw new ArgumentNullException(nameof(conveyorMachines))).Where(machine => machine != null).ToList();

            if (arguments.Count == 0)
            {
                throw new ArgumentException("Empty collection", nameof(conveyorMachines));
            }
            var manager = new PriorityConveyorManager <TData, TResult>(maxPriority, maxAttempts);

            services.AddHostedService(provider => new TaskWorker <IConveyorMachine <TData, TResult>, int>(provider,
                                                                                                          manager,
                                                                                                          ProcessorFactory.CreateProcessor <IConveyorMachine <TData, TResult>, int>(arguments)));
            return(manager);
        }
Пример #3
0
        /// <summary>
        ///     Create <see cref="IPriorityConveyor{TData, TResult}" /> with given conveyor machines reuse <paramref name="strategy" /> without service
        ///     registration
        /// </summary>
        /// <param name="services"> Service collection </param>
        /// <param name="conveyorMachineFactory"> Conveyor machine factory function </param>
        /// <param name="strategy"> Conveyor machines reuse strategy <seealso cref="ReuseStrategy" /></param>
        /// <param name="maxParallelMachines"> Max allowed parallel conveyor machines </param>
        /// <param name="maxPriority"> Max allowed operation priority </param>
        /// <param name="maxAttempts"> Max allowed retry on fail attempts </param>
        /// <typeparam name="TData"> Input data type </typeparam>
        /// <typeparam name="TResult"> Processing result type </typeparam>
        /// <exception cref="ArgumentNullException"> Thrown if <paramref name="conveyorMachineFactory" /> is NULL </exception>
        /// <exception cref="InvalidEnumArgumentException"> Thrown if <paramref name="strategy" /> has incorrect value </exception>
        public static IPriorityConveyor <TData, TResult> CreatePriorityConveyor <TData, TResult>(this IServiceCollection services,
                                                                                                 Func <IServiceProvider, IConveyorMachine <TData, TResult> > conveyorMachineFactory, ReuseStrategy strategy, int maxParallelMachines = 1,
                                                                                                 int maxPriority = 100, int maxAttempts = int.MaxValue)
            where TData : notnull
        {
            if (conveyorMachineFactory == null)
            {
                throw new ArgumentNullException(nameof(conveyorMachineFactory));
            }
            if (strategy != ReuseStrategy.Static && strategy != ReuseStrategy.Reuse && strategy != ReuseStrategy.OneTime)
            {
                throw new InvalidEnumArgumentException(nameof(strategy), (int)strategy, typeof(ReuseStrategy));
            }
            var manager = new PriorityConveyorManager <TData, TResult>(maxPriority, maxAttempts);

            services.AddHostedService(provider => new TaskWorker <IConveyorMachine <TData, TResult>, int>(provider,
                                                                                                          manager,
                                                                                                          ProcessorFactory.CreateProcessor <IConveyorMachine <TData, TResult>, int>(conveyorMachineFactory,
                                                                                                                                                                                    strategy,
                                                                                                                                                                                    provider,
                                                                                                                                                                                    maxParallelMachines)));
            return(manager);
        }