Browse Source

Enable nullable annotations for Volo.Abp.Threading

pull/17020/head
liangshiwei 3 years ago
parent
commit
e6d161e0b4
  1. 2
      framework/src/Volo.Abp.Threading/Volo.Abp.Threading.csproj
  2. 122
      framework/src/Volo.Abp.Threading/Volo/Abp/Linq/AsyncQueryableExecuter.cs
  3. 20
      framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableExecuter.cs
  4. 20
      framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableProvider.cs
  5. 2
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpAsyncTimer.cs
  6. 4
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpTimer.cs
  7. 13
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AmbientDataContextAmbientScopeProvider.cs
  8. 10
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AsyncLocalAmbientDataContext.cs
  9. 4
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AsyncLocalSimpleScopeExtensions.cs
  10. 2
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/CancellationTokenProviderBase.cs
  11. 4
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/IAmbientDataContext.cs
  12. 2
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/IAmbientScopeProvider.cs

2
framework/src/Volo.Abp.Threading/Volo.Abp.Threading.csproj

@ -5,6 +5,8 @@
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>Volo.Abp.Threading</AssemblyName>
<PackageId>Volo.Abp.Threading</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

122
framework/src/Volo.Abp.Threading/Volo/Abp/Linq/AsyncQueryableExecuter.cs

@ -17,7 +17,7 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende
Providers = providers;
}
protected virtual IAsyncQueryableProvider FindProvider<T>(IQueryable<T> queryable)
protected virtual IAsyncQueryableProvider? FindProvider<T>(IQueryable<T> queryable)
{
return Providers.FirstOrDefault(p => p.CanExecute(queryable));
}
@ -102,21 +102,29 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende
: Task.FromResult(queryable.First(predicate));
}
public Task<T> FirstOrDefaultAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
public Task<T?> FirstOrDefaultAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.FirstOrDefaultAsync(queryable, cancellationToken)
: Task.FromResult(queryable.FirstOrDefault());
if (provider != null)
{
return provider.FirstOrDefaultAsync(queryable, cancellationToken);
}
return Task.FromResult(queryable.FirstOrDefault())!;
}
public Task<T> FirstOrDefaultAsync<T>(IQueryable<T> queryable, Expression<Func<T, bool>> predicate,
public Task<T?> FirstOrDefaultAsync<T>(IQueryable<T> queryable, Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.FirstOrDefaultAsync(queryable, predicate, cancellationToken)
: Task.FromResult(queryable.FirstOrDefault(predicate));
if (provider != null)
{
return provider.FirstOrDefaultAsync(queryable, predicate, cancellationToken);
}
return Task.FromResult(queryable.FirstOrDefault(predicate))!;
}
public Task<T> LastAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
@ -135,21 +143,29 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende
: Task.FromResult(queryable.Last(predicate));
}
public Task<T> LastOrDefaultAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
public Task<T?> LastOrDefaultAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.LastOrDefaultAsync(queryable, cancellationToken)
: Task.FromResult(queryable.LastOrDefault());
if (provider != null)
{
return provider.LastOrDefaultAsync(queryable, cancellationToken);
}
return Task.FromResult(queryable.LastOrDefault())!;
}
public Task<T> LastOrDefaultAsync<T>(IQueryable<T> queryable, Expression<Func<T, bool>> predicate,
public Task<T?> LastOrDefaultAsync<T>(IQueryable<T> queryable, Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.LastOrDefaultAsync(queryable, predicate, cancellationToken)
: Task.FromResult(queryable.LastOrDefault(predicate));
if (provider != null)
{
return provider.LastOrDefaultAsync(queryable, predicate, cancellationToken);
}
return Task.FromResult(queryable.LastOrDefault(predicate))!;
}
public Task<T> SingleAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
@ -168,53 +184,77 @@ public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ISingletonDepende
: Task.FromResult(queryable.Single(predicate));
}
public Task<T> SingleOrDefaultAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
public Task<T?> SingleOrDefaultAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.SingleOrDefaultAsync(queryable, cancellationToken)
: Task.FromResult(queryable.SingleOrDefault());
if (provider != null)
{
return provider.SingleOrDefaultAsync(queryable, cancellationToken);
}
return Task.FromResult(queryable.SingleOrDefault())!;
}
public Task<T> SingleOrDefaultAsync<T>(IQueryable<T> queryable, Expression<Func<T, bool>> predicate,
public Task<T?> SingleOrDefaultAsync<T>(IQueryable<T> queryable, Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.SingleOrDefaultAsync(queryable, predicate, cancellationToken)
: Task.FromResult(queryable.SingleOrDefault(predicate));
if (provider != null)
{
return provider.SingleOrDefaultAsync(queryable, predicate, cancellationToken);
}
return Task.FromResult(queryable.SingleOrDefault(predicate))!;
}
public Task<T> MinAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
public Task<T?> MinAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.MinAsync(queryable, cancellationToken)
: Task.FromResult(queryable.Min());
if(provider != null)
{
return provider.MinAsync(queryable, cancellationToken);
}
return Task.FromResult(queryable.Min())!;
}
public Task<TResult> MinAsync<T, TResult>(IQueryable<T> queryable, Expression<Func<T, TResult>> selector, CancellationToken cancellationToken = default)
public Task<TResult?> MinAsync<T, TResult>(IQueryable<T> queryable, Expression<Func<T, TResult>> selector, CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.MinAsync(queryable, selector, cancellationToken)
: Task.FromResult(queryable.Min(selector));
if(provider != null)
{
return provider.MinAsync(queryable, selector, cancellationToken);
}
return Task.FromResult(queryable.Min(selector))!;
}
public Task<T> MaxAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
public Task<T?> MaxAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.MaxAsync(queryable, cancellationToken)
: Task.FromResult(queryable.Max());
if(provider != null)
{
return provider.MaxAsync(queryable, cancellationToken);
}
return Task.FromResult(queryable.Max())!;
}
public Task<TResult> MaxAsync<T, TResult>(IQueryable<T> queryable, Expression<Func<T, TResult>> selector, CancellationToken cancellationToken = default)
public Task<TResult?> MaxAsync<T, TResult>(IQueryable<T> queryable, Expression<Func<T, TResult>> selector, CancellationToken cancellationToken = default)
{
var provider = FindProvider(queryable);
return provider != null
? provider.MaxAsync(queryable, selector, cancellationToken)
: Task.FromResult(queryable.Max(selector));
if(provider != null)
{
return provider.MaxAsync(queryable, selector, cancellationToken);
}
return Task.FromResult(queryable.Max(selector))!;
}
public Task<decimal> SumAsync(IQueryable<decimal> queryable, CancellationToken cancellationToken = default)

20
framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableExecuter.cs

@ -75,12 +75,12 @@ public interface IAsyncQueryableExecuter
CancellationToken cancellationToken = default);
Task<T> FirstOrDefaultAsync<T>(
Task<T?> FirstOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<T> FirstOrDefaultAsync<T>(
Task<T?> FirstOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
@ -100,12 +100,12 @@ public interface IAsyncQueryableExecuter
CancellationToken cancellationToken = default);
Task<T> LastOrDefaultAsync<T>(
Task<T?> LastOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<T> LastOrDefaultAsync<T>(
Task<T?> LastOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
@ -124,11 +124,11 @@ public interface IAsyncQueryableExecuter
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
Task<T> SingleOrDefaultAsync<T>(
Task<T?> SingleOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<T> SingleOrDefaultAsync<T>(
Task<T?> SingleOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
@ -137,12 +137,12 @@ public interface IAsyncQueryableExecuter
#region Min
Task<T> MinAsync<T>(
Task<T?> MinAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<TResult> MinAsync<T, TResult>(
Task<TResult?> MinAsync<T, TResult>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, TResult>> selector,
CancellationToken cancellationToken = default);
@ -151,12 +151,12 @@ public interface IAsyncQueryableExecuter
#region Max
Task<T> MaxAsync<T>(
Task<T?> MaxAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<TResult> MaxAsync<T, TResult>(
Task<TResult?> MaxAsync<T, TResult>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, TResult>> selector,
CancellationToken cancellationToken = default);

20
framework/src/Volo.Abp.Threading/Volo/Abp/Linq/IAsyncQueryableProvider.cs

@ -77,12 +77,12 @@ public interface IAsyncQueryableProvider
CancellationToken cancellationToken = default);
Task<T> FirstOrDefaultAsync<T>(
Task<T?> FirstOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<T> FirstOrDefaultAsync<T>(
Task<T?> FirstOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
@ -102,12 +102,12 @@ public interface IAsyncQueryableProvider
CancellationToken cancellationToken = default);
Task<T> LastOrDefaultAsync<T>(
Task<T?> LastOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<T> LastOrDefaultAsync<T>(
Task<T?> LastOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
@ -126,11 +126,11 @@ public interface IAsyncQueryableProvider
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
Task<T> SingleOrDefaultAsync<T>(
Task<T?> SingleOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<T> SingleOrDefaultAsync<T>(
Task<T?> SingleOrDefaultAsync<T>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default);
@ -139,12 +139,12 @@ public interface IAsyncQueryableProvider
#region Min
Task<T> MinAsync<T>(
Task<T?> MinAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<TResult> MinAsync<T, TResult>(
Task<TResult?> MinAsync<T, TResult>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, TResult>> selector,
CancellationToken cancellationToken = default);
@ -153,12 +153,12 @@ public interface IAsyncQueryableProvider
#region Max
Task<T> MaxAsync<T>(
Task<T?> MaxAsync<T>(
[NotNull] IQueryable<T> queryable,
CancellationToken cancellationToken = default);
Task<TResult> MaxAsync<T, TResult>(
Task<TResult?> MaxAsync<T, TResult>(
[NotNull] IQueryable<T> queryable,
[NotNull] Expression<Func<T, TResult>> selector,
CancellationToken cancellationToken = default);

2
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpAsyncTimer.cs

@ -43,7 +43,7 @@ public class AbpAsyncTimer : ITransientDependency
Logger = NullLogger<AbpAsyncTimer>.Instance;
_taskTimer = new Timer(
TimerCallBack,
TimerCallBack!,
null,
Timeout.Infinite,
Timeout.Infinite

4
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpTimer.cs

@ -15,7 +15,7 @@ public class AbpTimer : ITransientDependency
/// <summary>
/// This event is raised periodically according to Period of Timer.
/// </summary>
public event EventHandler Elapsed;
public event EventHandler Elapsed = default!;
/// <summary>
/// Task period of timer (as milliseconds).
@ -42,7 +42,7 @@ public class AbpTimer : ITransientDependency
Logger = NullLogger<AbpTimer>.Instance;
_taskTimer = new Timer(
TimerCallBack,
TimerCallBack!,
null,
Timeout.Infinite,
Timeout.Infinite

13
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AmbientDataContextAmbientScopeProvider.cs

@ -24,7 +24,7 @@ public class AmbientDataContextAmbientScopeProvider<T> : IAmbientScopeProvider<T
Logger = NullLogger<AmbientDataContextAmbientScopeProvider<T>>.Instance;
}
public T GetValue(string contextKey)
public T? GetValue(string contextKey)
{
var item = GetCurrentItem(contextKey);
if (item == null)
@ -52,6 +52,11 @@ public class AmbientDataContextAmbientScopeProvider<T> : IAmbientScopeProvider<T
scopeDictionary.TryRemove(item.Id, out item);
if (item == null)
{
return;
}
if (item.Outer == null)
{
dataContext.SetData(contextKey, null);
@ -63,7 +68,7 @@ public class AmbientDataContextAmbientScopeProvider<T> : IAmbientScopeProvider<T
}, (ScopeDictionary, item, _dataContext, contextKey));
}
private ScopeItem GetCurrentItem(string contextKey)
private ScopeItem? GetCurrentItem(string contextKey)
{
return _dataContext.GetData(contextKey) is string objKey ? ScopeDictionary.GetOrDefault(objKey) : null;
}
@ -72,11 +77,11 @@ public class AmbientDataContextAmbientScopeProvider<T> : IAmbientScopeProvider<T
{
public string Id { get; }
public ScopeItem Outer { get; }
public ScopeItem? Outer { get; }
public T Value { get; }
public ScopeItem(T value, ScopeItem outer = null)
public ScopeItem(T value, ScopeItem? outer = null)
{
Id = Guid.NewGuid().ToString();

10
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AsyncLocalAmbientDataContext.cs

@ -6,17 +6,17 @@ namespace Volo.Abp.Threading;
public class AsyncLocalAmbientDataContext : IAmbientDataContext, ISingletonDependency
{
private static readonly ConcurrentDictionary<string, AsyncLocal<object>> AsyncLocalDictionary = new ConcurrentDictionary<string, AsyncLocal<object>>();
private static readonly ConcurrentDictionary<string, AsyncLocal<object?>> AsyncLocalDictionary = new ConcurrentDictionary<string, AsyncLocal<object?>>();
public void SetData(string key, object value)
public void SetData(string key, object? value)
{
var asyncLocal = AsyncLocalDictionary.GetOrAdd(key, (k) => new AsyncLocal<object>());
var asyncLocal = AsyncLocalDictionary.GetOrAdd(key, (k) => new AsyncLocal<object?>());
asyncLocal.Value = value;
}
public object GetData(string key)
public object? GetData(string key)
{
var asyncLocal = AsyncLocalDictionary.GetOrAdd(key, (k) => new AsyncLocal<object>());
var asyncLocal = AsyncLocalDictionary.GetOrAdd(key, (k) => new AsyncLocal<object?>());
return asyncLocal.Value;
}
}

4
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AsyncLocalSimpleScopeExtensions.cs

@ -5,11 +5,11 @@ namespace Volo.Abp.Threading;
public static class AsyncLocalSimpleScopeExtensions
{
public static IDisposable SetScoped<T>(this AsyncLocal<T> asyncLocal, T value)
public static IDisposable SetScoped<T>(this AsyncLocal<T?> asyncLocal, T value)
{
var previousValue = asyncLocal.Value;
asyncLocal.Value = value;
return new DisposeAction<ValueTuple<AsyncLocal<T>, T>>(static (state) =>
return new DisposeAction<ValueTuple<AsyncLocal<T?>, T?>>(static (state) =>
{
var (asyncLocal, previousValue) = state;
asyncLocal.Value = previousValue;

2
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/CancellationTokenProviderBase.cs

@ -11,7 +11,7 @@ public abstract class CancellationTokenProviderBase : ICancellationTokenProvider
protected IAmbientScopeProvider<CancellationTokenOverride> CancellationTokenOverrideScopeProvider { get; }
protected CancellationTokenOverride OverrideValue => CancellationTokenOverrideScopeProvider.GetValue(CancellationTokenOverrideContextKey);
protected CancellationTokenOverride? OverrideValue => CancellationTokenOverrideScopeProvider.GetValue(CancellationTokenOverrideContextKey);
protected CancellationTokenProviderBase(IAmbientScopeProvider<CancellationTokenOverride> cancellationTokenOverrideScopeProvider)
{

4
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/IAmbientDataContext.cs

@ -2,7 +2,7 @@
public interface IAmbientDataContext
{
void SetData(string key, object value);
void SetData(string key, object? value);
object GetData(string key);
object? GetData(string key);
}

2
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/IAmbientScopeProvider.cs

@ -4,7 +4,7 @@ namespace Volo.Abp.Threading;
public interface IAmbientScopeProvider<T>
{
T GetValue(string contextKey);
T? GetValue(string contextKey);
IDisposable BeginScope(string contextKey, T value);
}

Loading…
Cancel
Save