public SchedulerClockRepository(
     Func<CommandSchedulerDbContext> createDbContext,
     GetClockName getClockName)
 {
     if (createDbContext == null)
     {
         throw new ArgumentNullException(nameof(createDbContext));
     }
     if (getClockName == null)
     {
         throw new ArgumentNullException(nameof(getClockName));
     }
     this.createDbContext = createDbContext;
     this.getClockName = getClockName;
 }
示例#2
0
 public SchedulerClockRepository(
     Func <CommandSchedulerDbContext> createDbContext,
     GetClockName getClockName)
 {
     if (createDbContext == null)
     {
         throw new ArgumentNullException(nameof(createDbContext));
     }
     if (getClockName == null)
     {
         throw new ArgumentNullException(nameof(getClockName));
     }
     this.createDbContext = createDbContext;
     this.getClockName    = getClockName;
 }
        /// <summary>
        ///     Initializes a new instance of the <see cref="SqlCommandScheduler" /> class.
        /// </summary>
        /// <param name="configuration">The configuration.</param>
        public SqlCommandScheduler(
            Configuration configuration,
            Func<CommandSchedulerDbContext> createCommandSchedulerDbContext = null,
            GetClockName getClockName = null)
        {
            
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            GetClockName = getClockName ?? (e => null);
            this.createCommandSchedulerDbContext = createCommandSchedulerDbContext ??
                                                   (() => new CommandSchedulerDbContext());

            var container = configuration.Container;

            var dispatchers = ConfigurationExtensions.InitializeSchedulersPerAggregateType(
                container,
                ClockName,
                activity);

            base.binders = dispatchers;

            ClockTrigger = new SchedulerClockTrigger(
                this.createCommandSchedulerDbContext,
                async (scheduled, result, db) =>
                {
                    var dispatcher = dispatchers.SingleOrDefault(d => d.AggregateType == scheduled.AggregateType);

                    if (dispatcher != null)
                    {
                        await dispatcher.Deliver(scheduled);
                        result.Add(scheduled.Result);
                    }

                    scheduled.Attempts++;

                    await db.SaveChangesAsync();
                });

            clockRepository = new SchedulerClockRepository(
                this.createCommandSchedulerDbContext,
                GetClockName);
        }
示例#4
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="SqlCommandScheduler" /> class.
        /// </summary>
        /// <param name="configuration">The configuration.</param>
        public SqlCommandScheduler(
            Configuration configuration,
            Func <CommandSchedulerDbContext> createCommandSchedulerDbContext = null,
            GetClockName getClockName = null)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            GetClockName = getClockName ?? (e => null);
            this.createCommandSchedulerDbContext = createCommandSchedulerDbContext ??
                                                   (() => new CommandSchedulerDbContext());

            var container = configuration.Container;

            var dispatchers = ConfigurationExtensions.InitializeSchedulersPerAggregateType(
                container,
                ClockName,
                activity);

            base.binders = dispatchers;

            ClockTrigger = new SchedulerClockTrigger(
                this.createCommandSchedulerDbContext,
                async(scheduled, result, db) =>
            {
                var dispatcher = dispatchers.SingleOrDefault(d => d.AggregateType == scheduled.AggregateType);

                if (dispatcher != null)
                {
                    await dispatcher.Deliver(scheduled);
                    result.Add(scheduled.Result);
                }

                scheduled.Attempts++;

                await db.SaveChangesAsync();
            });

            clockRepository = new SchedulerClockRepository(
                this.createCommandSchedulerDbContext,
                GetClockName);
        }
        internal static ICommandSchedulerDispatcher[] InitializeSchedulersPerAggregateType(
            PocketContainer container,
            GetClockName getClockName,
            ISubject<ICommandSchedulerActivity> subject)
        {
            var binders = AggregateType.KnownTypes
                                       .Select(aggregateType =>
                                       {
                                           var initializerType =
                                               typeof (SchedulerInitializer<>).MakeGenericType(aggregateType);

                                           dynamic initializer = container.Resolve(initializerType);

                                           return (ICommandSchedulerDispatcher) initializer.InitializeScheduler(
                                               subject,
                                               container,
                                               getClockName);
                                       })
                                       .ToArray();
            return binders;
        }