/// <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); }
/// <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); }
/// <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); }