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