/// <inheritdoc cref="IDataLoader.RemoveTrigger(IDataLoaderTrigger)"/>
        public void RemoveTrigger(IDataLoaderTrigger trigger)
        {
            trigger = trigger ?? throw new ArgumentNullException(nameof(trigger));

            _triggers.Remove(trigger);
            trigger.LoadRequested -= OnLoadRequested;
        }
        private void OnLoadRequested(IDataLoaderTrigger trigger, IDataLoaderContext context)
        {
            // This operation is not cancellable from the trigger itself.
            // The operation will be cancelled if the loader is disposed.
            context = context ?? new DataLoaderContext();
            var cancellationToken = CancellationToken.None;
            var sequenceId        = Interlocked.Increment(ref _sequenceId);

            PopulateContext(context);

            _ = LoadFromTrigger(cancellationToken, new DataLoaderRequest(sequenceId, trigger, context, _contextValues));

            async Task LoadFromTrigger(CancellationToken ct, DataLoaderRequest request)
            {
                try
                {
                    await InnerLoad(ct, request);
                }
                catch (Exception e)
                {
                    if (_logger.IsEnabled(LogLevel.Error))
                    {
                        _logger.LogError(e, "Caught unhandled exception during Load operation. Prefer injecting a strategy that handles all exceptions in your application code.");
                    }
                }
            }
        }
        /// <summary>
        /// Adds a <see cref="IDataLoaderTrigger"/> in <see cref="IDataLoaderBuilder.TriggerProviders"/>.
        /// </summary>
        /// <typeparam name="TBuilder">Any type implementing <see cref="IDataLoaderBuilder"/>.</typeparam>
        /// <param name="builder">The <see cref="IDataLoaderBuilder"/> reference.</param>
        /// <param name="trigger">The new <see cref="IDataLoaderTrigger"/> to add.</param>
        public static TBuilder WithTrigger <TBuilder>(this TBuilder builder, IDataLoaderTrigger trigger) where TBuilder : IDataLoaderBuilder
        {
            builder.TriggerProviders.Add(GetTrigger);
            return(builder);

            IDataLoaderTrigger GetTrigger(IDataLoader dataLoader)
            {
                return(trigger);
            }
        }
Beispiel #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DataLoaderRequest"/> class.
 /// </summary>
 /// <param name="sequenceId">The sequence Id of this request.</param>
 /// <param name="sourceTrigger"><see cref="IDataLoaderTrigger"/></param>
 /// <param name="triggerContext"><see cref="IDataLoaderContext"/></param>
 /// <param name="dataLoaderContextValues"></param>
 public DataLoaderRequest(int sequenceId, IDataLoaderTrigger sourceTrigger, IDataLoaderContext triggerContext, IDictionary <string, object> dataLoaderContextValues)
 {
     SequenceId    = sequenceId;
     SourceTrigger = sourceTrigger ?? throw new ArgumentNullException(nameof(sourceTrigger));
     Context       = new MergedDataLoaderContext(triggerContext, dataLoaderContextValues);
 }