From bcbf82fbfc279d4b4b7dcede303b831cdc13989f Mon Sep 17 00:00:00 2001 From: Volosoft Agent <43883821+voloagent@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:26:21 +0300 Subject: [PATCH 01/24] Update latest-versions.json to version 7.3.0 --- latest-versions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/latest-versions.json b/latest-versions.json index 1e25f674d5..6046b25a92 100644 --- a/latest-versions.json +++ b/latest-versions.json @@ -1,6 +1,6 @@ [ { - "version": "7.2.3", + "version": "7.3.0", "releaseDate": "", "type": "stable", "message": "" From cf7b4171bbcea9476c26377dcd26d02377e21032 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 15:32:10 +0800 Subject: [PATCH 02/24] Enable nullable annotations for Volo.Abp.Background.Jobs --- .../Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.csproj | 2 ++ .../Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs | 4 ++-- .../Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs | 2 +- .../Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.csproj b/framework/src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.csproj index 0ef692a9f2..29a4ed2edc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.csproj +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundJobs Volo.Abp.BackgroundJobs $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs index deba940d12..0d5441a4bc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs @@ -12,12 +12,12 @@ public class BackgroundJobInfo /// /// Name of the job. /// - public virtual string JobName { get; set; } + public virtual string JobName { get; set; } = default!; /// /// Job arguments as serialized to string. /// - public virtual string JobArgs { get; set; } + public virtual string JobArgs { get; set; } = default!; /// /// Try count of this job. diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index a222f91362..7218776cfe 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -32,7 +32,7 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var jobName = BackgroundJobNameAttribute.GetName(); - var jobId = await EnqueueAsync(jobName, args, priority, delay); + var jobId = await EnqueueAsync(jobName, args!, priority, delay); return jobId.ToString(); } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs index 726d65d513..7abbc188ce 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/InMemoryBackgroundJobStore.cs @@ -25,7 +25,7 @@ public class InMemoryBackgroundJobStore : IBackgroundJobStore, ISingletonDepende public virtual Task FindAsync(Guid jobId) { - return Task.FromResult(_jobs.GetOrDefault(jobId)); + return Task.FromResult(_jobs.GetOrDefault(jobId))!; } public virtual Task InsertAsync(BackgroundJobInfo jobInfo) From 9b6c545bd78713537c042fb264aea0c2de968acf Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 15:36:26 +0800 Subject: [PATCH 03/24] Enable nullable annotations for Volo.Abp.BackgroundJobs.Abstractions --- .../Volo.Abp.BackgroundJobs.Abstractions.csproj | 2 ++ .../Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs | 4 ++-- .../BackgroundJobExecutionException.cs | 4 ++-- .../Abp/BackgroundJobs/BackgroundJobNameAttribute.cs | 12 ++++++------ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.csproj b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.csproj index 3633fd45e3..e12574e992 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.csproj +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundJobs.Abstractions Volo.Abp.BackgroundJobs.Abstractions $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index 7798a8d9a6..6b6d822c50 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -54,7 +54,7 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc { if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob.ExecuteAsync)) { - await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs })); + await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs })!); } else { @@ -74,7 +74,7 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc throw new BackgroundJobExecutionException("A background job execution is failed. See inner exception for details.", ex) { - JobType = context.JobType.AssemblyQualifiedName, + JobType = context.JobType.AssemblyQualifiedName!, JobArgs = context.JobArgs }; } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs index 6c2df10a4f..f8c98437dc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs @@ -6,9 +6,9 @@ namespace Volo.Abp.BackgroundJobs; [Serializable] public class BackgroundJobExecutionException : AbpException { - public string JobType { get; set; } + public string JobType { get; set; } = default!; - public object JobArgs { get; set; } + public object JobArgs { get; set; } = default!; public BackgroundJobExecutionException() { diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs index edac395039..012569c423 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs @@ -22,11 +22,11 @@ public class BackgroundJobNameAttribute : Attribute, IBackgroundJobNameProvider { Check.NotNull(jobArgsType, nameof(jobArgsType)); - return jobArgsType - .GetCustomAttributes(true) - .OfType() - .FirstOrDefault() - ?.Name - ?? jobArgsType.FullName; + return (jobArgsType + .GetCustomAttributes(true) + .OfType() + .FirstOrDefault() + ?.Name + ?? jobArgsType.FullName)!; } } From 66830904c8dd9f6c81224e022f1d47bb302efb6b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 15:53:04 +0800 Subject: [PATCH 04/24] Enable nullable annotations for Volo.Abp.BackgroundJobs.HangFire --- .../Volo.Abp.BackgroundJobs.HangFire.csproj | 2 ++ .../BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs | 2 +- .../Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj index 5823174e54..8e79738248 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundJobs.HangFire Volo.Abp.BackgroundJobs.HangFire $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs index ce2babaabc..ca874cd701 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs @@ -30,7 +30,7 @@ public class AbpBackgroundJobsHangfireModule : AbpModule } } - private BackgroundJobServer CreateOnlyEnqueueJobServer(IServiceProvider serviceProvider) + private BackgroundJobServer? CreateOnlyEnqueueJobServer(IServiceProvider serviceProvider) { serviceProvider.GetRequiredService(); return null; diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs index 58d2863618..8790243334 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs @@ -39,7 +39,7 @@ public class HangfireJobExecutionAdapter using (var scope = ServiceScopeFactory.CreateScope()) { var jobType = Options.GetJob(typeof(TArgs)).JobType; - var context = new JobExecutionContext(scope.ServiceProvider, jobType, args, cancellationToken: cancellationToken); + var context = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: cancellationToken); await JobExecuter.ExecuteAsync(context); } } From 6463dfe4ffcca930e8febf5d41b6ee7c5ba7d152 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 16:00:14 +0800 Subject: [PATCH 05/24] Enable nullable annotations for Volo.Abp.BackgroundJobs.Quartz --- .../Volo.Abp.BackgroundJobs.Quartz.csproj | 2 ++ .../BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs | 4 ++-- .../BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs | 4 ++-- .../Quartz/QuartzBackgroundJobManageExtensions.cs | 2 +- .../Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs | 2 +- .../Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs | 6 +++--- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.csproj b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.csproj index 1326926d55..47847d00c8 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.csproj +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundJobs.Quartz Volo.Abp.BackgroundJobs.Quartz $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs index fb0a7bb406..2aac41e885 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs @@ -30,7 +30,7 @@ public class AbpBackgroundJobQuartzOptions { exception.RefireImmediately = true; - var retryCount = executionContext.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + nameof(RetryCount)).To(); + var retryCount = executionContext.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + nameof(RetryCount))!.To(); if (retryIndex > retryCount) { exception.RefireImmediately = false; @@ -38,7 +38,7 @@ public class AbpBackgroundJobQuartzOptions return; } - var retryInterval = executionContext.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + nameof(RetryIntervalMillisecond)).To(); + var retryInterval = executionContext.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + nameof(RetryIntervalMillisecond))!.To(); await Task.Delay(retryInterval); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs index 500cc8538e..6b2d8f36e0 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs @@ -19,10 +19,10 @@ public class AbpBackgroundJobsQuartzModule : AbpModule public override void OnPreApplicationInitialization(ApplicationInitializationContext context) { - var options = context.ServiceProvider.GetService>().Value; + var options = context.ServiceProvider.GetRequiredService>().Value; if (!options.IsJobExecutionEnabled) { - var quartzOptions = context.ServiceProvider.GetService>().Value; + var quartzOptions = context.ServiceProvider.GetRequiredService>().Value; quartzOptions.StartSchedulerFactory = scheduler => Task.CompletedTask; } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs index 9eaa40574c..5c1e883888 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs @@ -6,7 +6,7 @@ namespace Volo.Abp.BackgroundJobs.Quartz; public static class QuartzBackgroundJobManageExtensions { - public static async Task EnqueueAsync(this IBackgroundJobManager backgroundJobManager, + public static async Task EnqueueAsync(this IBackgroundJobManager backgroundJobManager, TArgs args, int retryCount, int retryIntervalMillisecond, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs index 99ef72adf6..135c2fc6f7 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs @@ -37,7 +37,7 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen { var jobDataMap = new JobDataMap { - {nameof(TArgs), JsonSerializer.Serialize(args)}, + {nameof(TArgs), JsonSerializer.Serialize(args!)}, {JobDataPrefix+ nameof(Options.RetryCount), retryCount.ToString()}, {JobDataPrefix+ nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond.ToString()}, {JobDataPrefix+ RetryIndex, "0"} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs index 588e844153..9005164043 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs @@ -38,9 +38,9 @@ public class QuartzJobExecutionAdapter : IJob { using (var scope = ServiceScopeFactory.CreateScope()) { - var args = JsonSerializer.Deserialize(context.JobDetail.JobDataMap.GetString(nameof(TArgs))); + var args = JsonSerializer.Deserialize(context.JobDetail.JobDataMap.GetString(nameof(TArgs))!); var jobType = Options.GetJob(typeof(TArgs)).JobType; - var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args, cancellationToken: context.CancellationToken); + var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: context.CancellationToken); try { await JobExecuter.ExecuteAsync(jobContext); @@ -49,7 +49,7 @@ public class QuartzJobExecutionAdapter : IJob { var jobExecutionException = new JobExecutionException(exception); - var retryIndex = context.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + QuartzBackgroundJobManager.RetryIndex).To(); + var retryIndex = context.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + QuartzBackgroundJobManager.RetryIndex)!.To(); retryIndex++; context.JobDetail.JobDataMap.Put(QuartzBackgroundJobManager.JobDataPrefix + QuartzBackgroundJobManager.RetryIndex, retryIndex.ToString()); From 389e51d3fe45045e07d96f48891e1ceac24c6614 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 16:29:15 +0800 Subject: [PATCH 06/24] Enable nullable annotations for Volo.Abp.BackgroundJobsRabbitMQ --- .../Volo.Abp.BackgroundJobs.RabbitMQ.csproj | 2 ++ .../Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs | 2 +- .../Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 16 ++++++++-------- .../RabbitMQ/JobQueueConfiguration.cs | 4 ++-- .../RabbitMQ/RabbitMqBackgroundJobManager.cs | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.csproj b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.csproj index 40f87898ba..c4675f6039 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.csproj +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundJobs.RabbitMQ Volo.Abp.BackgroundJobs.RabbitMQ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs index b244707f04..b285f598cc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs @@ -6,7 +6,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ; public interface IJobQueue : IRunnable, IDisposable { - Task EnqueueAsync( + Task EnqueueAsync( TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 9c3bf26e62..621f181beb 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -21,8 +21,8 @@ public class JobQueue : IJobQueue protected BackgroundJobConfiguration JobConfiguration { get; } protected JobQueueConfiguration QueueConfiguration { get; } - protected IChannelAccessor ChannelAccessor { get; private set; } - protected AsyncEventingBasicConsumer Consumer { get; private set; } + protected IChannelAccessor? ChannelAccessor { get; private set; } + protected AsyncEventingBasicConsumer? Consumer { get; private set; } public ILogger> Logger { get; set; } @@ -71,7 +71,7 @@ public class JobQueue : IJobQueue ); } - public virtual async Task EnqueueAsync( + public virtual async Task EnqueueAsync( TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) @@ -176,7 +176,7 @@ public class JobQueue : IJobQueue basicProperties.Expiration = delay.Value.TotalMilliseconds.ToString(); } - ChannelAccessor.Channel.BasicPublish( + ChannelAccessor!.Channel.BasicPublish( exchange: "", routingKey: routingKey, basicProperties: basicProperties, @@ -188,7 +188,7 @@ public class JobQueue : IJobQueue protected virtual IBasicProperties CreateBasicPropertiesToPublish() { - var properties = ChannelAccessor.Channel.CreateBasicProperties(); + var properties = ChannelAccessor!.Channel.CreateBasicProperties(); properties.Persistent = true; return properties; } @@ -206,17 +206,17 @@ public class JobQueue : IJobQueue try { await JobExecuter.ExecuteAsync(context); - ChannelAccessor.Channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); + ChannelAccessor!.Channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); } catch (BackgroundJobExecutionException) { //TODO: Reject like that? - ChannelAccessor.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true); + ChannelAccessor!.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true); } catch (Exception) { //TODO: Reject like that? - ChannelAccessor.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: false); + ChannelAccessor!.Channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: false); } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs index ee706ab864..9425cd0604 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueConfiguration.cs @@ -9,7 +9,7 @@ public class JobQueueConfiguration : QueueDeclareConfiguration { public Type JobArgsType { get; } - public string ConnectionName { get; set; } + public string? ConnectionName { get; set; } public string DelayedQueueName { get; set; } @@ -17,7 +17,7 @@ public class JobQueueConfiguration : QueueDeclareConfiguration Type jobArgsType, string queueName, string delayedQueueName, - string connectionName = null, + string? connectionName = null, bool durable = true, bool exclusive = false, bool autoDelete = false, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs index ae550077e0..d81b2758b0 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs @@ -20,6 +20,6 @@ public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDep TimeSpan? delay = null) { var jobQueue = await _jobQueueManager.GetAsync(); - return await jobQueue.EnqueueAsync(args, priority, delay); + return (await jobQueue.EnqueueAsync(args, priority, delay))!; } } From 5d3610f9a532ecf51f710637294158bb92b2ca94 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 16:30:58 +0800 Subject: [PATCH 07/24] Enable nullable annotations for Volo.Abp.BackgroundWorkers --- .../Volo.Abp.BackgroundWorkers.csproj | 2 ++ .../Volo/Abp/BackgroundWorkers/BackgroundWorkerBase.cs | 8 ++++---- .../Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.csproj b/framework/src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.csproj index f01a73d7a1..48e4b5fdf7 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.csproj +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundWorkers Volo.Abp.BackgroundWorkers $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerBase.cs index dc32981d58..91bc360f72 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerBase.cs @@ -14,13 +14,13 @@ public abstract class BackgroundWorkerBase : IBackgroundWorker { //TODO: Add UOW, Localization and other useful properties..? - public IAbpLazyServiceProvider LazyServiceProvider { get; set; } + public IAbpLazyServiceProvider LazyServiceProvider { get; set; } = default!; - public IServiceProvider ServiceProvider { get; set; } + public IServiceProvider ServiceProvider { get; set; } = default!; protected ILoggerFactory LoggerFactory => LazyServiceProvider.LazyGetRequiredService(); - protected ILogger Logger => LazyServiceProvider.LazyGetService(provider => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance); + protected ILogger Logger => LazyServiceProvider.LazyGetService(provider => LoggerFactory?.CreateLogger(GetType().FullName!) ?? NullLogger.Instance); protected CancellationTokenSource StoppingTokenSource { get; } protected CancellationToken StoppingToken { get; } @@ -47,6 +47,6 @@ public abstract class BackgroundWorkerBase : IBackgroundWorker public override string ToString() { - return GetType().FullName; + return GetType().FullName!; } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs index 393a4766cf..9d78d9237d 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs @@ -37,7 +37,7 @@ public abstract class PeriodicBackgroundWorkerBase : BackgroundWorkerBase await base.StopAsync(cancellationToken); } - private void Timer_Elapsed(object sender, System.EventArgs e) + private void Timer_Elapsed(object? sender, System.EventArgs e) { using (var scope = ServiceScopeFactory.CreateScope()) { From 4ffbf69a6709edb80533e3c716c833cd1fc30368 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 16:49:42 +0800 Subject: [PATCH 08/24] Enable nullable annotations for Volo.Abp.BackgroundWorkers.Hangfire --- .../Volo.Abp.BackgroundWorkers.Hangfire.csproj | 2 ++ .../Hangfire/AbpBackgroundWorkersHangfireModule.cs | 2 +- .../Hangfire/HangfireBackgroundWorkerBase.cs | 6 +++--- .../Hangfire/HangfireBackgroundWorkerManager.cs | 6 +++--- .../Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs | 6 +++--- .../BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs | 4 ++-- 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.csproj b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.csproj index 9792dbf1ff..bec3d235e6 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.csproj +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundWorkers.Hangfire Volo.Abp.BackgroundWorkers.Hangfire $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs index 50f43736ff..afe9a90a8a 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs @@ -38,7 +38,7 @@ public class AbpBackgroundWorkersHangfireModule : AbpModule AsyncHelper.RunSync(() => OnPreApplicationInitializationAsync(context)); } - private BackgroundJobServer CreateOnlyEnqueueJobServer(IServiceProvider serviceProvider) + private BackgroundJobServer? CreateOnlyEnqueueJobServer(IServiceProvider serviceProvider) { serviceProvider.GetRequiredService(); return null; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs index c4cf1d6be0..e5cef1ce42 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerBase.cs @@ -6,11 +6,11 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire; public abstract class HangfireBackgroundWorkerBase : BackgroundWorkerBase, IHangfireBackgroundWorker { - public string RecurringJobId { get; set; } + public string? RecurringJobId { get; set; } - public string CronExpression { get; set; } + public string CronExpression { get; set; } = default!; - public TimeZoneInfo TimeZone { get; set; } + public TimeZoneInfo? TimeZone { get; set; } public string Queue { get; set; } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 594f01343e..4b6582d03d 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -14,7 +14,7 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire; [Dependency(ReplaceServices = true)] public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISingletonDependency { - protected AbpHangfireBackgroundJobServer BackgroundJobServer { get; set; } + protected AbpHangfireBackgroundJobServer BackgroundJobServer { get; set; } = default!; protected IServiceProvider ServiceProvider { get; } public HangfireBackgroundWorkerManager(IServiceProvider serviceProvider) @@ -57,7 +57,7 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet var timer = worker.GetType() .GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); - var period = worker is AsyncPeriodicBackgroundWorkerBase ? ((AbpAsyncTimer)timer)?.Period : ((AbpTimer)timer)?.Period; + var period = worker is AsyncPeriodicBackgroundWorkerBase ? ((AbpAsyncTimer?)timer)?.Period : ((AbpTimer?)timer)?.Period; if (period == null) { @@ -65,7 +65,7 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet } var adapterType = typeof(HangfirePeriodicBackgroundWorkerAdapter<>).MakeGenericType(ProxyHelper.GetUnProxiedType(worker)); - var workerAdapter = Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker; + var workerAdapter = (Activator.CreateInstance(adapterType) as IHangfireBackgroundWorker)!; RecurringJob.AddOrUpdate(() => workerAdapter.DoWorkAsync(cancellationToken), GetCron(period.Value), workerAdapter.TimeZone, workerAdapter.Queue); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs index e1cec7da85..d624966fe4 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs @@ -14,8 +14,8 @@ public class HangfirePeriodicBackgroundWorkerAdapter : HangfireBackgrou public HangfirePeriodicBackgroundWorkerAdapter() { _doWorkAsyncMethod = - typeof(TWorker).GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic); - _doWorkMethod = typeof(TWorker).GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic); + typeof(TWorker).GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic)!; + _doWorkMethod = typeof(TWorker).GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic)!; } public async override Task DoWorkAsync(CancellationToken cancellationToken = default) @@ -26,7 +26,7 @@ public class HangfirePeriodicBackgroundWorkerAdapter : HangfireBackgrou switch (worker) { case AsyncPeriodicBackgroundWorkerBase asyncPeriodicBackgroundWorker: - await (Task)_doWorkAsyncMethod.Invoke(asyncPeriodicBackgroundWorker, new object[] { workerContext }); + await (Task)(_doWorkAsyncMethod.Invoke(asyncPeriodicBackgroundWorker, new object[] { workerContext })!); break; case PeriodicBackgroundWorkerBase periodicBackgroundWorker: _doWorkMethod.Invoke(periodicBackgroundWorker, new object[] { workerContext }); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs index 883f488684..4371ceb8b3 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/IHangfireBackgroundWorker.cs @@ -6,11 +6,11 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire; public interface IHangfireBackgroundWorker : IBackgroundWorker { - string RecurringJobId { get; set; } + string? RecurringJobId { get; set; } string CronExpression { get; set; } - TimeZoneInfo TimeZone { get; set; } + TimeZoneInfo? TimeZone { get; set; } string Queue { get; set; } From f538a874d55c50f81f974e20e1c9256dbc56d9c5 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 16:58:26 +0800 Subject: [PATCH 09/24] Enable nullable annotations for Volo.Abp.BackgroundWorkers.Quartz --- .../Volo.Abp.BackgroundWorkers.Quartz.csproj | 2 ++ .../Quartz/IQuartzBackgroundWorker.cs | 2 +- .../Quartz/QuartzBackgroundWorkerBase.cs | 6 +++--- .../QuartzPeriodicBackgroundWorkerAdapter.cs | 17 +++++++++-------- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.csproj b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.csproj index 2c43a121d1..0f4d807456 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.csproj +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.csproj @@ -6,6 +6,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.BackgroundWorkers.Quartz Volo.Abp.BackgroundWorkers.Quartz $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs index 1e96efbe45..23ba05bc94 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs @@ -12,5 +12,5 @@ public interface IQuartzBackgroundWorker : IBackgroundWorker, IJob bool AutoRegister { get; set; } - Func ScheduleJob { get; set; } + Func? ScheduleJob { get; set; } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs index 0956dc2218..2ba8f6d8bd 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs @@ -6,13 +6,13 @@ namespace Volo.Abp.BackgroundWorkers.Quartz; public abstract class QuartzBackgroundWorkerBase : BackgroundWorkerBase, IQuartzBackgroundWorker { - public ITrigger Trigger { get; set; } + public ITrigger Trigger { get; set; } = default!; - public IJobDetail JobDetail { get; set; } + public IJobDetail JobDetail { get; set; } = default!; public bool AutoRegister { get; set; } = true; - public Func ScheduleJob { get; set; } = null; + public Func? ScheduleJob { get; set; } = null; public abstract Task Execute(IJobExecutionContext context); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs index fb94408bfe..767ac36412 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzPeriodicBackgroundWorkerAdapter.cs @@ -1,6 +1,7 @@ using System; using System.Reflection; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Quartz; using Volo.Abp.DynamicProxy; using Volo.Abp.Threading; @@ -12,8 +13,8 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo IQuartzBackgroundWorkerAdapter where TWorker : IBackgroundWorker { - private readonly MethodInfo _doWorkAsyncMethod; - private readonly MethodInfo _doWorkMethod; + private readonly MethodInfo? _doWorkAsyncMethod; + private readonly MethodInfo? _doWorkMethod; public QuartzPeriodicBackgroundWorkerAdapter() { @@ -40,11 +41,11 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo if (worker is AsyncPeriodicBackgroundWorkerBase) { - period = ((AbpAsyncTimer)timer)?.Period; + period = ((AbpAsyncTimer?)timer)?.Period; } else { - period = ((AbpTimer)timer)?.Period; + period = ((AbpTimer?)timer)?.Period; } } else @@ -59,17 +60,17 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo JobDetail = JobBuilder .Create>() - .WithIdentity(workerType.FullName) + .WithIdentity(workerType.FullName!) .Build(); Trigger = TriggerBuilder.Create() - .WithIdentity(workerType.FullName) + .WithIdentity(workerType.FullName!) .WithSimpleSchedule(builder => builder.WithInterval(TimeSpan.FromMilliseconds(period.Value)).RepeatForever()) .Build(); } public async override Task Execute(IJobExecutionContext context) { - var worker = (IBackgroundWorker) ServiceProvider.GetService(typeof(TWorker)); + var worker = (IBackgroundWorker) ServiceProvider.GetRequiredService(typeof(TWorker)); var workerContext = new PeriodicBackgroundWorkerContext(ServiceProvider, context.CancellationToken); switch (worker) @@ -78,7 +79,7 @@ public class QuartzPeriodicBackgroundWorkerAdapter : QuartzBackgroundWo { if (_doWorkAsyncMethod != null) { - await (Task) _doWorkAsyncMethod.Invoke(asyncWorker, new object[] {workerContext}); + await (Task) (_doWorkAsyncMethod.Invoke(asyncWorker, new object[] {workerContext})!); } break; From 5c38aa1b74cec7569f01d9ed6a7d532ecf130c9c Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 17:15:01 +0800 Subject: [PATCH 10/24] Enable nullable annotations for Volo.Abp.HangFire --- framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj | 2 ++ .../Volo/Abp/Hangfire/AbpHangfireAuthorizationFilter.cs | 6 +++--- .../Volo/Abp/Hangfire/AbpHangfireModule.cs | 2 +- .../Volo/Abp/Hangfire/AbpHangfireOptions.cs | 9 +++------ 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj b/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj index dfd64e0b1a..07e299f859 100644 --- a/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj +++ b/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.HangFire Volo.Abp.HangFire $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireAuthorizationFilter.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireAuthorizationFilter.cs index 9b6a6941ae..bd65b22dba 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireAuthorizationFilter.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireAuthorizationFilter.cs @@ -10,9 +10,9 @@ namespace Volo.Abp.Hangfire; public class AbpHangfireAuthorizationFilter : IDashboardAsyncAuthorizationFilter { private readonly bool _enableTenant; - private readonly string _requiredPermissionName; + private readonly string? _requiredPermissionName; - public AbpHangfireAuthorizationFilter(bool enableTenant = false, string requiredPermissionName = null) + public AbpHangfireAuthorizationFilter(bool enableTenant = false, string? requiredPermissionName = null) { _enableTenant = requiredPermissionName.IsNullOrWhiteSpace() ? enableTenant : true; _requiredPermissionName = requiredPermissionName; @@ -30,7 +30,7 @@ public class AbpHangfireAuthorizationFilter : IDashboardAsyncAuthorizationFilter return true; } - return await IsPermissionGrantedAsync(context, _requiredPermissionName); + return await IsPermissionGrantedAsync(context, _requiredPermissionName!); } private static bool IsLoggedIn(DashboardContext context, bool enableTenant) diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs index 13f36751aa..6c34b86904 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.Hangfire; [DependsOn(typeof(AbpAuthorizationAbstractionsModule))] public class AbpHangfireModule : AbpModule { - private AbpHangfireBackgroundJobServer _backgroundJobServer; + private AbpHangfireBackgroundJobServer? _backgroundJobServer; public override void ConfigureServices(ServiceConfigurationContext context) { diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs index 43c5554d55..31888ccc57 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs @@ -12,14 +12,11 @@ namespace Volo.Abp.Hangfire; public class AbpHangfireOptions { - [CanBeNull] - public BackgroundJobServerOptions ServerOptions { get; set; } + public BackgroundJobServerOptions? ServerOptions { get; set; } - [CanBeNull] - public IEnumerable AdditionalProcesses { get; set; } + public IEnumerable? AdditionalProcesses { get; set; } - [CanBeNull] - public JobStorage Storage { get; set; } + public JobStorage? Storage { get; set; } [NotNull] public Func BackgroundJobServerFactory { From 9cb675a6392667b3ad4b6d8175958be443d508ca Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 17:24:29 +0800 Subject: [PATCH 11/24] Enable nullable annotations for Volo.Abp.Quartz --- framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj | 2 ++ .../src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs | 2 +- .../src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj b/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj index 71c3dd4caf..0f72827fcb 100644 --- a/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj +++ b/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.Quartz Volo.Abp.Quartz $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs index 10e09444c5..1f0bfb0ff6 100644 --- a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs +++ b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.Quartz; public class AbpQuartzModule : AbpModule { - private IScheduler _scheduler; + private IScheduler _scheduler = default!; public override void ConfigureServices(ServiceConfigurationContext context) { diff --git a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs index 8f61f3c91d..5f6bb97fd1 100644 --- a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs +++ b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs @@ -13,7 +13,7 @@ public class AbpQuartzOptions /// public NameValueCollection Properties { get; set; } - public Action Configurator { get; set; } + public Action? Configurator { get; set; } /// /// How long Quartz should wait before starting. Default: 0. From 182607b7108cd8a02d0c844623a41bf64b79b8ed Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 17:33:27 +0800 Subject: [PATCH 12/24] Enable nullable annotations for Volo.Abp.RabbitMQ --- .../Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj | 2 ++ .../Volo/Abp/RabbitMQ/ChannelPool.cs | 4 ++-- .../Volo/Abp/RabbitMQ/ConnectionPool.cs | 2 +- .../Volo/Abp/RabbitMQ/IChannelPool.cs | 2 +- .../Volo/Abp/RabbitMQ/IConnectionPool.cs | 2 +- .../RabbitMQ/IRabbitMqMessageConsumerFactory.cs | 2 +- .../Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs | 16 ++++++++-------- .../RabbitMQ/RabbitMqMessageConsumerFactory.cs | 2 +- 8 files changed, 17 insertions(+), 15 deletions(-) diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj b/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj index eed4f273fd..0895e07153 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj +++ b/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.RabbitMQ Volo.Abp.RabbitMQ $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ChannelPool.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ChannelPool.cs index 541bc9b852..d795342c1d 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ChannelPool.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ChannelPool.cs @@ -29,7 +29,7 @@ public class ChannelPool : IChannelPool, ISingletonDependency Logger = NullLogger.Instance; } - public virtual IChannelAccessor Acquire(string channelName = null, string connectionName = null) + public virtual IChannelAccessor Acquire(string? channelName = null, string? connectionName = null) { CheckDisposed(); @@ -49,7 +49,7 @@ public class ChannelPool : IChannelPool, ISingletonDependency ); } - protected virtual IModel CreateChannel(string channelName, string connectionName) + protected virtual IModel CreateChannel(string channelName, string? connectionName) { return ConnectionPool .Get(connectionName) diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ConnectionPool.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ConnectionPool.cs index 3a228f5d10..8c046ffffd 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ConnectionPool.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/ConnectionPool.cs @@ -21,7 +21,7 @@ public class ConnectionPool : IConnectionPool, ISingletonDependency Connections = new ConcurrentDictionary>(); } - public virtual IConnection Get(string connectionName = null) + public virtual IConnection Get(string? connectionName = null) { connectionName ??= RabbitMqConnections.DefaultConnectionName; diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IChannelPool.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IChannelPool.cs index 75b6e77580..2ba6259fec 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IChannelPool.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IChannelPool.cs @@ -4,5 +4,5 @@ namespace Volo.Abp.RabbitMQ; public interface IChannelPool : IDisposable { - IChannelAccessor Acquire(string channelName = null, string connectionName = null); + IChannelAccessor Acquire(string? channelName = null, string? connectionName = null); } diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IConnectionPool.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IConnectionPool.cs index 09b8b407f9..dc97476c84 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IConnectionPool.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IConnectionPool.cs @@ -5,5 +5,5 @@ namespace Volo.Abp.RabbitMQ; public interface IConnectionPool : IDisposable { - IConnection Get(string connectionName = null); + IConnection Get(string? connectionName = null); } diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IRabbitMqMessageConsumerFactory.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IRabbitMqMessageConsumerFactory.cs index 31770e641b..33d0e5d07e 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IRabbitMqMessageConsumerFactory.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/IRabbitMqMessageConsumerFactory.cs @@ -14,6 +14,6 @@ public interface IRabbitMqMessageConsumerFactory IRabbitMqMessageConsumer Create( ExchangeDeclareConfiguration exchange, QueueDeclareConfiguration queue, - string connectionName = null + string? connectionName = null ); } diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs index 5c45b6aefc..1d94122008 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs @@ -23,15 +23,15 @@ public class RabbitMqMessageConsumer : IRabbitMqMessageConsumer, ITransientDepen protected AbpAsyncTimer Timer { get; } - protected ExchangeDeclareConfiguration Exchange { get; private set; } + protected ExchangeDeclareConfiguration Exchange { get; private set; } = default!; - protected QueueDeclareConfiguration Queue { get; private set; } + protected QueueDeclareConfiguration Queue { get; private set; } = default!; - protected string ConnectionName { get; private set; } + protected string? ConnectionName { get; private set; } protected ConcurrentBag> Callbacks { get; } - protected IModel Channel { get; private set; } + protected IModel? Channel { get; private set; } protected ConcurrentQueue QueueBindCommands { get; } @@ -58,7 +58,7 @@ public class RabbitMqMessageConsumer : IRabbitMqMessageConsumer, ITransientDepen public void Initialize( [NotNull] ExchangeDeclareConfiguration exchange, [NotNull] QueueDeclareConfiguration queue, - string connectionName = null) + string? connectionName = null) { Exchange = Check.NotNull(exchange, nameof(exchange)); Queue = Check.NotNull(queue, nameof(queue)); @@ -192,16 +192,16 @@ public class RabbitMqMessageConsumer : IRabbitMqMessageConsumer, ITransientDepen { foreach (var callback in Callbacks) { - await callback(Channel, basicDeliverEventArgs); + await callback(Channel!, basicDeliverEventArgs); } - Channel.BasicAck(basicDeliverEventArgs.DeliveryTag, multiple: false); + Channel?.BasicAck(basicDeliverEventArgs.DeliveryTag, multiple: false); } catch (Exception ex) { try { - Channel.BasicNack( + Channel?.BasicNack( basicDeliverEventArgs.DeliveryTag, multiple: false, requeue: true diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumerFactory.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumerFactory.cs index 1b3f1714e8..8dcdf7101f 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumerFactory.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumerFactory.cs @@ -16,7 +16,7 @@ public class RabbitMqMessageConsumerFactory : IRabbitMqMessageConsumerFactory, I public IRabbitMqMessageConsumer Create( ExchangeDeclareConfiguration exchange, QueueDeclareConfiguration queue, - string connectionName = null) + string? connectionName = null) { var consumer = ServiceScope.ServiceProvider.GetRequiredService(); consumer.Initialize(exchange, queue, connectionName); From faf581920eb58423e1d0c15577e3c8730f2562ca Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 17:37:17 +0800 Subject: [PATCH 13/24] Enable nullable annotations --- .../Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 2 +- .../Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs | 4 ++-- .../Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 621f181beb..9947ba64ac 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -180,7 +180,7 @@ public class JobQueue : IJobQueue exchange: "", routingKey: routingKey, basicProperties: basicProperties, - body: Serializer.Serialize(args) + body: Serializer.Serialize(args!) ); return Task.CompletedTask; diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs index e24042c87b..5f3e3deb96 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs @@ -4,9 +4,9 @@ namespace Volo.Abp.Hangfire; public class AbpHangfireBackgroundJobServer { - public BackgroundJobServer HangfireJobServer { get; } + public BackgroundJobServer? HangfireJobServer { get; } - public AbpHangfireBackgroundJobServer(BackgroundJobServer hangfireJobServer) + public AbpHangfireBackgroundJobServer(BackgroundJobServer? hangfireJobServer) { HangfireJobServer = hangfireJobServer; } diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs index 31888ccc57..98c45348c7 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireOptions.cs @@ -19,11 +19,11 @@ public class AbpHangfireOptions public JobStorage? Storage { get; set; } [NotNull] - public Func BackgroundJobServerFactory { + public Func BackgroundJobServerFactory { get => _backgroundJobServerFactory; set => _backgroundJobServerFactory = Check.NotNull(value, nameof(value)); } - private Func _backgroundJobServerFactory; + private Func _backgroundJobServerFactory; public AbpHangfireOptions() { From eaa0e41c1133f60c2b98c26654f9d96a72f12e42 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 13 Jul 2023 17:43:20 +0800 Subject: [PATCH 14/24] Enable nullable annotations for Volo.Abp.AzureServiceBus --- .../Volo.Abp.AzureServiceBus.csproj | 2 ++ .../Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs | 8 ++++---- .../Volo/Abp/AzureServiceBus/ClientConfig.cs | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.csproj b/framework/src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.csproj index 98a67869cf..aef38c1e10 100644 --- a/framework/src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.csproj +++ b/framework/src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.AzureServiceBus Volo.Abp.AzureServiceBus $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs index 71143b834e..4417a6ef79 100644 --- a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs +++ b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs @@ -20,9 +20,9 @@ public class AzureServiceBusMessageConsumer : IAzureServiceBusMessageConsumer, I private readonly IExceptionNotifier _exceptionNotifier; private readonly IProcessorPool _processorPool; private readonly ConcurrentBag> _callbacks; - private string _connectionName; - private string _subscriptionName; - private string _topicName; + private string _connectionName = default!; + private string _subscriptionName = default!; + private string _topicName = default!; public AzureServiceBusMessageConsumer( IExceptionNotifier exceptionNotifier, @@ -37,7 +37,7 @@ public class AzureServiceBusMessageConsumer : IAzureServiceBusMessageConsumer, I public virtual void Initialize( [NotNull] string topicName, [NotNull] string subscriptionName, - string connectionName) + string? connectionName) { Check.NotNull(topicName, nameof(topicName)); Check.NotNull(subscriptionName, nameof(subscriptionName)); diff --git a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ClientConfig.cs b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ClientConfig.cs index 9b9cbd6843..02b8397917 100644 --- a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ClientConfig.cs +++ b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/ClientConfig.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AzureServiceBus; public class ClientConfig { - public string ConnectionString { get; set; } + public string ConnectionString { get; set; } = default!; public ServiceBusAdministrationClientOptions Admin { get; set; } = new(); From afd2d8a759a436eb77bd8680e2b0975dcf3c97fe Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 14 Jul 2023 08:42:30 +0800 Subject: [PATCH 15/24] Upgrade OpenIddict to 4.6.0. https://github.com/openiddict/openiddict-core/releases/tag/4.6.0 --- Directory.Build.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 2b04bcc025..838ffcc995 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -43,7 +43,7 @@ true - 4.5.0 + 4.6.0 @@ -54,4 +54,4 @@ - \ No newline at end of file + From 110c83725e07c27edffb0bde6e08fcf7849e76e2 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 14 Jul 2023 08:43:41 +0800 Subject: [PATCH 16/24] Update build-and-test.yml --- .github/workflows/build-and-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index acbc322f12..c2b1557405 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -16,6 +16,7 @@ on: - 'templates/**/*.cshtml' - 'templates/**/*.csproj' - 'templates/**/*.razor' + - 'Directory.Build.props' pull_request: paths: @@ -31,6 +32,7 @@ on: - 'templates/**/*.cshtml' - 'templates/**/*.csproj' - 'templates/**/*.razor' + - 'Directory.Build.props' types: - opened - synchronize From 36019230d2af07d50ab3aed19b28125a685333e0 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Fri, 14 Jul 2023 07:48:05 +0300 Subject: [PATCH 17/24] Mention the community talks 2023.5 in the 7.3.0 release post --- .../2023-07-12 v7_3_Release_Stable/POST.md | 8 ++++++++ .../community-talks.png | Bin 0 -> 40236 bytes 2 files changed, 8 insertions(+) create mode 100644 docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/community-talks.png diff --git a/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/POST.md b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/POST.md index 5b1eba10ab..89cf9e340d 100644 --- a/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/POST.md +++ b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/POST.md @@ -51,6 +51,14 @@ Please see the following migration documents, if you are upgrading from v7.2: ## Community News +### ABP Community Talks 2023.5: Mobile Development with the ABP Framework + +![](community-talks.png) + +In this episode, we'll talk about Exploring Options for Mobile Development with the ABP Framework. + +> Join us to explore the options for Mobile Development in ABP Framework on July 27, 2023, at 17:00 UTC. You can register from [here](https://kommunity.com/volosoft/events/abp-community-talks-20235-mobile-development-with-the-abp-framework-68e64e59). + ### New ABP Community Posts There are exciting articles contributed by the ABP community as always. I will highlight some of them here: diff --git a/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/community-talks.png b/docs/en/Blog-Posts/2023-07-12 v7_3_Release_Stable/community-talks.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fded181f0adcb510348fad3af46d263a708c90 GIT binary patch literal 40236 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≻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 Date: Fri, 14 Jul 2023 14:21:01 +0800 Subject: [PATCH 18/24] Enable nullable annotations for Volo.Abp.BlazoriseUI --- .../Components/Messages/UiMessageEventArgs.cs | 6 +-- .../Notifications/UiNotificationEventArgs.cs | 4 +- .../AbpAutoMapperExtensibleDtoExtensions.cs | 4 +- .../Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs | 40 +++++++++---------- .../BlazoriseUiMessageService.cs | 12 +++--- .../BlazoriseUiNotificationService.cs | 10 ++--- ...UiObjectExtensionPropertyInfoExtensions.cs | 10 ++--- .../BlazoriseUiPageProgressService.cs | 4 +- .../Volo.Abp.BlazoriseUI/BreadcrumbItem.cs | 6 +-- .../Components/AbpExtensibleDataGrid.razor | 2 +- .../Components/AbpExtensibleDataGrid.razor.cs | 12 +++--- .../Components/AlertWrapper.cs | 2 +- .../DataGridEntityActionsColumn.razor.cs | 2 +- .../Components/EntityAction.razor.cs | 18 ++++----- .../Components/EntityActions.razor | 2 +- .../Components/EntityActions.razor.cs | 12 +++--- .../Components/ObjectExtending/EnumHelper.cs | 16 ++++---- .../ExtensionProperties.razor.cs | 6 +-- .../ExtensionPropertyComponentBase.cs | 12 +++--- .../LookupExtensionProperty.razor.cs | 12 +++--- .../SelectExtensionProperty.razor.cs | 6 +-- .../TextExtensionProperty.razor.cs | 2 +- .../Components/PageAlert.razor.cs | 10 ++--- .../Components/SubmitButton.razor.cs | 6 +-- .../Components/ToolbarButton.razor.cs | 8 ++-- .../Components/UiMessageAlert.razor.cs | 23 ++++++----- .../Components/UiNotificationAlert.razor.cs | 21 +++++----- .../Components/UiPageProgress.razor.cs | 13 +++--- .../Volo.Abp.BlazoriseUI.csproj | 2 + .../AbpInternalLocalizationHelper.cs | 2 +- .../Abp/Localization/IAbpEnumLocalizer.cs | 2 +- .../Volo/Abp/Data/ExtraPropertyDictionary.cs | 4 +- .../Data/ExtraPropertyDictionaryExtensions.cs | 16 ++++---- .../Abp/Data/HasExtraPropertiesExtensions.cs | 6 +-- .../ObjectExtending/ExtensibleObjectMapper.cs | 8 ++-- 35 files changed, 166 insertions(+), 155 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs index adae13a4c2..45bb66aaac 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Messages/UiMessageEventArgs.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.AspNetCore.Components.Messages; public class UiMessageEventArgs : EventArgs { - public UiMessageEventArgs(UiMessageType messageType, string message, string title, UiMessageOptions options) + public UiMessageEventArgs(UiMessageType messageType, string message, string? title, UiMessageOptions options) { MessageType = messageType; Message = message; @@ -13,7 +13,7 @@ public class UiMessageEventArgs : EventArgs Options = options; } - public UiMessageEventArgs(UiMessageType messageType, string message, string title, UiMessageOptions options, TaskCompletionSource callback) + public UiMessageEventArgs(UiMessageType messageType, string message, string? title, UiMessageOptions options, TaskCompletionSource callback) { MessageType = messageType; Message = message; @@ -26,7 +26,7 @@ public class UiMessageEventArgs : EventArgs public string Message { get; } - public string Title { get; } + public string? Title { get; } public UiMessageOptions Options { get; } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs index 554450d025..c12f7a0f06 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Notifications/UiNotificationEventArgs.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.AspNetCore.Components.Notifications; public class UiNotificationEventArgs : EventArgs { - public UiNotificationEventArgs(UiNotificationType notificationType, string message, string title, UiNotificationOptions options) + public UiNotificationEventArgs(UiNotificationType notificationType, string message, string? title, UiNotificationOptions options) { NotificationType = notificationType; Message = message; @@ -16,7 +16,7 @@ public class UiNotificationEventArgs : EventArgs public string Message { get; } - public string Title { get; } + public string? Title { get; } public UiNotificationOptions Options { get; } } diff --git a/framework/src/Volo.Abp.AutoMapper/AutoMapper/AbpAutoMapperExtensibleDtoExtensions.cs b/framework/src/Volo.Abp.AutoMapper/AutoMapper/AbpAutoMapperExtensibleDtoExtensions.cs index a564edf18f..f4697a443a 100644 --- a/framework/src/Volo.Abp.AutoMapper/AutoMapper/AbpAutoMapperExtensibleDtoExtensions.cs +++ b/framework/src/Volo.Abp.AutoMapper/AutoMapper/AbpAutoMapperExtensibleDtoExtensions.cs @@ -22,8 +22,8 @@ public static class AbpAutoMapperExtensibleDtoExtensions (source, destination, extraProps) => { var result = extraProps.IsNullOrEmpty() - ? new Dictionary() - : new Dictionary(extraProps); + ? new Dictionary() + : new Dictionary(extraProps); ExtensibleObjectMapper .MapExtraPropertiesTo( diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index f476ecad89..58867d6e5d 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -174,32 +174,32 @@ public abstract class AbpCrudPageBase< where TCreateViewModel : class, new() where TUpdateViewModel : class, new() { - [Inject] protected TAppService AppService { get; set; } - [Inject] protected IStringLocalizer UiLocalizer { get; set; } - [Inject] public IAbpEnumLocalizer AbpEnumLocalizer { get; set; } + [Inject] protected TAppService AppService { get; set; } = default!; + [Inject] protected IStringLocalizer UiLocalizer { get; set; } = default!; + [Inject] public IAbpEnumLocalizer AbpEnumLocalizer { get; set; } = default!; protected virtual int PageSize { get; } = LimitedResultRequestDto.DefaultMaxResultCount; protected int CurrentPage = 1; - protected string CurrentSorting; + protected string CurrentSorting = default!; protected int? TotalCount; protected TGetListInput GetListInput = new TGetListInput(); protected IReadOnlyList Entities = Array.Empty(); protected TCreateViewModel NewEntity; - protected TKey EditingEntityId; + protected TKey EditingEntityId = default!; protected TUpdateViewModel EditingEntity; - protected Modal CreateModal; - protected Modal EditModal; - protected Validations CreateValidationsRef; - protected Validations EditValidationsRef; + protected Modal? CreateModal; + protected Modal? EditModal; + protected Validations? CreateValidationsRef; + protected Validations? EditValidationsRef; protected List BreadcrumbItems = new List(2); - protected DataGridEntityActionsColumn EntityActionsColumn; + protected DataGridEntityActionsColumn EntityActionsColumn = default!; protected EntityActionDictionary EntityActions { get; set; } protected TableColumnDictionary TableColumns { get; set; } - protected string CreatePolicyName { get; set; } - protected string UpdatePolicyName { get; set; } - protected string DeletePolicyName { get; set; } + protected string? CreatePolicyName { get; set; } + protected string? UpdatePolicyName { get; set; } + protected string? DeletePolicyName { get; set; } public bool HasCreatePermission { get; set; } public bool HasUpdatePermission { get; set; } @@ -360,7 +360,7 @@ public abstract class AbpCrudPageBase< protected virtual Task CloseCreateModalAsync() { NewEntity = new TCreateViewModel(); - return InvokeAsync(CreateModal.Hide); + return InvokeAsync(CreateModal!.Hide); } protected virtual Task ClosingCreateModal(ModalClosingEventArgs eventArgs) @@ -429,7 +429,7 @@ public abstract class AbpCrudPageBase< protected virtual Task CloseEditModalAsync() { - InvokeAsync(EditModal.Hide); + InvokeAsync(EditModal!.Hide); return Task.CompletedTask; } @@ -477,7 +477,7 @@ public abstract class AbpCrudPageBase< NewEntity = new TCreateViewModel(); await GetEntitiesAsync(); - await InvokeAsync(CreateModal.Hide); + await InvokeAsync(CreateModal!.Hide); } protected virtual async Task UpdateEntityAsync() @@ -515,7 +515,7 @@ public abstract class AbpCrudPageBase< { await GetEntitiesAsync(); - await InvokeAsync(EditModal.Hide); + await InvokeAsync(EditModal!.Hide); } protected virtual async Task DeleteEntityAsync(TListViewModel entity) @@ -572,7 +572,7 @@ public abstract class AbpCrudPageBase< /// Does nothing if is null or empty. /// /// A policy name to check - protected virtual async Task CheckPolicyAsync([CanBeNull] string policyName) + protected virtual async Task CheckPolicyAsync(string? policyName) { if (string.IsNullOrEmpty(policyName)) { @@ -633,7 +633,7 @@ public abstract class AbpCrudPageBase< if (propertyInfo.Name.EndsWith("_Text")) { var lookupPropertyName = propertyInfo.Name.RemovePostFix("_Text"); - var lookupPropertyDefinition = properties.SingleOrDefault(t => t.Name == lookupPropertyName); + var lookupPropertyDefinition = properties.SingleOrDefault(t => t.Name == lookupPropertyName)!; yield return new TableColumn { Title = lookupPropertyDefinition.GetLocalizedDisplayName(StringLocalizerFactory), @@ -658,7 +658,7 @@ public abstract class AbpCrudPageBase< if (propertyInfo.Type.IsEnum) { column.ValueConverter = (val) => - AbpEnumLocalizer.GetString(propertyInfo.Type, val.As().ExtraProperties[propertyInfo.Name], new IStringLocalizer[]{ StringLocalizerFactory.CreateDefaultOrNull() }); + AbpEnumLocalizer.GetString(propertyInfo.Type, val.As().ExtraProperties[propertyInfo.Name]!, new IStringLocalizer?[]{ StringLocalizerFactory.CreateDefaultOrNull() }); } yield return column; diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiMessageService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiMessageService.cs index de72bdaae2..6631a2236b 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiMessageService.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiMessageService.cs @@ -15,7 +15,7 @@ public class BlazoriseUiMessageService : IUiMessageService, IScopedDependency /// /// An event raised after the message is received. Used to notify the message dialog. /// - public event EventHandler MessageReceived; + public event EventHandler? MessageReceived ; private readonly IStringLocalizer localizer; @@ -29,7 +29,7 @@ public class BlazoriseUiMessageService : IUiMessageService, IScopedDependency Logger = NullLogger.Instance; } - public Task Info(string message, string title = null, Action options = null) + public Task Info(string message, string? title = null, Action? options = null) { var uiMessageOptions = CreateDefaultOptions(); options?.Invoke(uiMessageOptions); @@ -39,7 +39,7 @@ public class BlazoriseUiMessageService : IUiMessageService, IScopedDependency return Task.CompletedTask; } - public Task Success(string message, string title = null, Action options = null) + public Task Success(string message, string? title = null, Action? options = null) { var uiMessageOptions = CreateDefaultOptions(); options?.Invoke(uiMessageOptions); @@ -49,7 +49,7 @@ public class BlazoriseUiMessageService : IUiMessageService, IScopedDependency return Task.CompletedTask; } - public Task Warn(string message, string title = null, Action options = null) + public Task Warn(string message, string? title = null, Action? options = null) { var uiMessageOptions = CreateDefaultOptions(); options?.Invoke(uiMessageOptions); @@ -59,7 +59,7 @@ public class BlazoriseUiMessageService : IUiMessageService, IScopedDependency return Task.CompletedTask; } - public Task Error(string message, string title = null, Action options = null) + public Task Error(string message, string? title = null, Action? options = null) { var uiMessageOptions = CreateDefaultOptions(); options?.Invoke(uiMessageOptions); @@ -69,7 +69,7 @@ public class BlazoriseUiMessageService : IUiMessageService, IScopedDependency return Task.CompletedTask; } - public Task Confirm(string message, string title = null, Action options = null) + public Task Confirm(string message, string? title = null, Action? options = null) { var uiMessageOptions = CreateDefaultOptions(); options?.Invoke(uiMessageOptions); diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiNotificationService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiNotificationService.cs index cd993f7f46..f34e34b890 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiNotificationService.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiNotificationService.cs @@ -11,9 +11,9 @@ public class BlazoriseUiNotificationService : IUiNotificationService, IScopedDep /// /// An event raised after the notification is received. /// - public event EventHandler NotificationReceived; + public event EventHandler? NotificationReceived; - public Task Info(string message, string title = null, Action options = null) + public Task Info(string message, string? title = null, Action? options = null) { var uiNotificationOptions = CreateDefaultOptions(); options?.Invoke(uiNotificationOptions); @@ -23,7 +23,7 @@ public class BlazoriseUiNotificationService : IUiNotificationService, IScopedDep return Task.CompletedTask; } - public Task Success(string message, string title = null, Action options = null) + public Task Success(string message, string? title = null, Action? options = null) { var uiNotificationOptions = CreateDefaultOptions(); options?.Invoke(uiNotificationOptions); @@ -33,7 +33,7 @@ public class BlazoriseUiNotificationService : IUiNotificationService, IScopedDep return Task.CompletedTask; } - public Task Warn(string message, string title = null, Action options = null) + public Task Warn(string message, string? title = null, Action? options = null) { var uiNotificationOptions = CreateDefaultOptions(); options?.Invoke(uiNotificationOptions); @@ -43,7 +43,7 @@ public class BlazoriseUiNotificationService : IUiNotificationService, IScopedDep return Task.CompletedTask; } - public Task Error(string message, string title = null, Action options = null) + public Task Error(string message, string? title = null, Action? options = null) { var uiNotificationOptions = CreateDefaultOptions(); options?.Invoke(uiNotificationOptions); diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs index a0516d8b4e..a3cd7372a6 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs @@ -44,7 +44,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions typeof(PhoneAttribute) }; - public static string GetDateEditInputFormatOrNull(this IBasicObjectExtensionPropertyInfo property) + public static string? GetDateEditInputFormatOrNull(this IBasicObjectExtensionPropertyInfo property) { if (property.IsDate()) { @@ -59,7 +59,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions return null; } - public static string GetTextInputValueOrNull(this IBasicObjectExtensionPropertyInfo property, object value) + public static string? GetTextInputValueOrNull(this IBasicObjectExtensionPropertyInfo property, object? value) { if (value == null) { @@ -74,7 +74,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions return value.ToString(); } - public static T GetInputValueOrDefault(this IBasicObjectExtensionPropertyInfo property, object value) + public static T? GetInputValueOrDefault(this IBasicObjectExtensionPropertyInfo property, object? value) { if (value == null) { @@ -204,7 +204,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions ?? typeof(TextExtensionProperty<,>); //default } - private static Type GetInputTypeFromAttributeOrNull(Attribute attribute) + private static Type? GetInputTypeFromAttributeOrNull(Attribute attribute) { var hasTextEditSupport = TextEditSupportedAttributeTypes.Any(t => t == attribute.GetType()); @@ -238,7 +238,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions return null; } - private static Type GetInputTypeFromTypeOrNull(Type type) + private static Type? GetInputTypeFromTypeOrNull(Type type) { if (type == typeof(bool)) { diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs index d2d82ad8a5..a49fc8aecc 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs @@ -12,9 +12,9 @@ public class BlazoriseUiPageProgressService : IUiPageProgressService, /// /// An event raised after the notification is received. /// - public event EventHandler ProgressChanged; + public event EventHandler? ProgressChanged; - public Task Go(int? percentage, Action options = null) + public Task Go(int? percentage, Action? options = null) { var uiPageProgressOptions = CreateDefaultOptions(); options?.Invoke(uiPageProgressOptions); diff --git a/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs b/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs index 3ccb68698f..7f02b02b85 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs @@ -6,11 +6,11 @@ public class BreadcrumbItem { public string Text { get; set; } - public object Icon { get; set; } + public object? Icon { get; set; } - public string Url { get; set; } + public string? Url { get; set; } - public BreadcrumbItem(string text, string url = null, object icon = null) + public BreadcrumbItem(string text, string? url = null, object? icon = null) { Text = text; Url = url; diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor index cbdfc25c99..522140811e 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor @@ -121,7 +121,7 @@ @{ var entity = context as IHasExtraProperties; var propertyName = ExtensionPropertiesRegex.Match(column.Data).Groups[1].Value; - var propertyValue = entity.GetProperty(propertyName); + var propertyValue = entity?.GetProperty(propertyName); if (propertyValue != null && propertyValue.GetType() == typeof(bool)) { if ((bool) propertyValue) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs index f9baf631f5..4642afcadd 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs @@ -18,7 +18,7 @@ public partial class AbpExtensibleDataGrid : ComponentBase protected Regex ExtensionPropertiesRegex = new Regex(@"ExtraProperties\[(.*?)\]"); - [Parameter] public IEnumerable Data { get; set; } + [Parameter] public IEnumerable Data { get; set; } = default!; [Parameter] public EventCallback> ReadData { get; set; } @@ -28,16 +28,16 @@ public partial class AbpExtensibleDataGrid : ComponentBase [Parameter] public int PageSize { get; set; } - [Parameter] public IEnumerable Columns { get; set; } + [Parameter] public IEnumerable Columns { get; set; } = default!; [Parameter] public int CurrentPage { get; set; } = 1; - [Parameter] public string Class { get; set; } + [Parameter] public string? Class { get; set; } [Parameter] public bool Responsive { get; set; } [Inject] - public IStringLocalizerFactory StringLocalizerFactory { get; set; } + public IStringLocalizerFactory StringLocalizerFactory { get; set; } = default!; protected virtual RenderFragment RenderCustomTableColumnComponent(Type type, object data) { @@ -51,10 +51,10 @@ public partial class AbpExtensibleDataGrid : ComponentBase protected virtual string GetConvertedFieldValue(TItem item, TableColumn columnDefinition) { - var convertedValue = columnDefinition.ValueConverter.Invoke(item); + var convertedValue = columnDefinition.ValueConverter!.Invoke(item!); if (!columnDefinition.DisplayFormat.IsNullOrEmpty()) { - return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat, + return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, convertedValue); } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AlertWrapper.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/AlertWrapper.cs index ba2024cecb..04b9f18a48 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/AlertWrapper.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AlertWrapper.cs @@ -4,6 +4,6 @@ namespace Volo.Abp.BlazoriseUI.Components; internal class AlertWrapper { - public AlertMessage AlertMessage { get; set; } + public AlertMessage AlertMessage { get; set; } = default!; public bool IsVisible { get; set; } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs index 3d52012efd..9a39acd4fc 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.BlazoriseUI.Components; public partial class DataGridEntityActionsColumn : DataGridColumn { [Inject] - public IStringLocalizer UiLocalizer { get; set; } + public IStringLocalizer UiLocalizer { get; set; } = default!; protected override async Task OnInitializedAsync() { diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor.cs index a38d915ff1..ef487bafcb 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityAction.razor.cs @@ -18,7 +18,7 @@ public partial class EntityAction : ComponentBase internal bool HasPermission { get; set; } = true; [Parameter] - public string Text { get; set; } + public string Text { get; set; } = default!; [Parameter] public bool Primary { get; set; } @@ -28,25 +28,25 @@ public partial class EntityAction : ComponentBase [Parameter] [Obsolete("Use Visible to hide actions based on permissions. Check the permission yourself. It is more performant. This option might be removed in future versions.")] - public string RequiredPolicy { get; set; } + public string? RequiredPolicy { get; set; } [Parameter] - public Color Color { get; set; } + public Color? Color { get; set; } [Parameter] - public Func ConfirmationMessage { get; set; } + public Func? ConfirmationMessage { get; set; } [Parameter] - public string Icon { get; set; } + public string? Icon { get; set; } [CascadingParameter] - public EntityActions ParentActions { get; set; } + public EntityActions ParentActions { get; set; } = default!; [Inject] - protected IAuthorizationService AuthorizationService { get; set; } + protected IAuthorizationService AuthorizationService { get; set; } = default!; [Inject] - protected IUiMessageService UiMessageService { get; set; } + protected IUiMessageService UiMessageService { get; set; } = default!; protected async override Task OnInitializedAsync() { @@ -55,7 +55,7 @@ public partial class EntityAction : ComponentBase if (!RequiredPolicy.IsNullOrEmpty()) { - HasPermission = await AuthorizationService.IsGrantedAsync(RequiredPolicy); + HasPermission = await AuthorizationService.IsGrantedAsync(RequiredPolicy!); } ParentActions.AddAction(this); } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor index b362358d70..844dea4950 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor @@ -6,7 +6,7 @@ @if ( HasPrimaryAction ) {