diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 16ce5acab0..3351b7d8cf 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -420,14 +420,16 @@ "CreateSolutionFolder": "Create Solution Folder", "CreateSolutionFolderOption": "Specifies if the project will be in a new folder in the output folder or directly the output folder.", "BooksPageTitle": "ABP Books", - "PackageDetailPage_NuGetPackageInstallationOptions": "There are two ways to install {0} NuGet package to your project", + "PackageDetailPage_NuGetPackageInstallationOptions": "There are three ways to install {0} NuGet package to your project", "PackageDetailPage_InstallingWithABPCLI": "1: Installing with the ABP CLI", "PackageDetailPage_InstallingWithABPCLIDescription1": "If you haven't installed the ABP CLI, first install by executing the following command in a command-line terminal", "PackageDetailPage_InstallingWithABPCLIDescription2": "Once you have installed the ABP CLI, open a command-line terminal in the location of the project (.csproj file) you want to install it and execute the following command", "PackageDetailPage_InstallingWithABPCLIDescription3": "It will add the {0} package reference to your project and the {1} dependency to your module class.", - "PackageDetailPage_ManualInstallation": "2: Manual Installation", - "PackageDetailPage_ManualInstallationDesription1": "Add {0} NuGet package reference to your project using your IDE or executing the following command", - "PackageDetailPage_ManualInstallationDesription2": "Then add the {0} dependency to your module class as shown in the following example", - "PackageDetailPage_SeeDocumentation": "See the documentation to learn how to use this package in your applications." + "PackageDetailPage_ManualInstallation": "2: Installing with the Dotnet CLI", + "PackageDetailPage_ManualInstallationDescription1": "Add {0} NuGet package reference to your project using your IDE or executing the following command", + "PackageDetailPage_ManualInstallationDescription2": "Then add the {0} dependency to your module class as shown in the following example", + "PackageDetailPage_SeeDocumentation": "See the documentation to learn how to use this package in your applications.", + "PackageDetailPage_InstallingUsingPMC": "3: Installing with the Package Manager Console", + "PackageDetailPage_InstallingUsingPMCDescription1": "Open the Package Manager Console in Visual Studio (Tools -> Nuget Package Manager -> Package Manager Console) and execute the following command" } } diff --git a/docs/en/Image-Manipulation.md b/docs/en/Image-Manipulation.md index 91f7c11c1e..7aff8cc1df 100644 --- a/docs/en/Image-Manipulation.md +++ b/docs/en/Image-Manipulation.md @@ -5,7 +5,7 @@ ABP Framework provides services to compress and resize images and implements the ## Installation -It is suggested to use the [ABP CLI](CLI.md) to install this package. +You can add this package to your application by either using the [ABP CLI](CLI.md) or manually installing it. Using the [ABP CLI](CLI.md) is the recommended approach. ### Using the ABP CLI @@ -116,6 +116,8 @@ public enum ImageResizeMode : byte } ``` +> See the [ImageSharp documentation](https://docs.sixlabors.com/api/ImageSharp/SixLabors.ImageSharp.Processing.ResizeMode.html) for more information about the resize modes. + ### ImageResizeResult The `ImageResizeResult` is a generic class that is used to return the result of the image resize operations. It has the following properties: @@ -196,7 +198,31 @@ public enum ImageProcessState : byte ## Magick.NET Provider -`Volo.Abp.Imaging.MagickNet` NuGet package implements the image operations using the [Magick.NET](https://github.com/dlemstra/Magick.NET) library. If you want to use that library as image process provider, add the `Volo.Abp.Imaging.MagickNet` NuGet package to your project, then add `AbpImagingMagickNetModule` to your [module](Module-Development-Basics.md)'s dependency list: +`Volo.Abp.Imaging.MagickNet` NuGet package implements the image operations using the [Magick.NET](https://github.com/dlemstra/Magick.NET) library. + +## Installation + +You can add this package to your application by either using the [ABP CLI](CLI.md) or manually installing it. Using the [ABP CLI](CLI.md) is the recommended approach. + +### Using the ABP CLI + +Open a command line terminal in the folder of your project (.csproj file) and type the following command: + +```bash +abp add-package Volo.Abp.Imaging.MagickNet +``` + +### Manual Installation + +If you want to manually install; + +1. Add the [Volo.Abp.Imaging.MagickNet](https://www.nuget.org/packages/Volo.Abp.Imaging.MagickNet) NuGet package to your project: + +``` +Install-Package Volo.Abp.Imaging.MagickNet +``` + +2. Add `AbpImagingMagickNetModule` to your [module](Module-Development-Basics.md)'s dependency list: ```csharp [DependsOn(typeof(AbpImagingMagickNetModule))] @@ -216,7 +242,32 @@ public class MyModule : AbpModule ## ImageSharp Provider -`Volo.Abp.Imaging.ImageSharp` NuGet package implements the image operations using the [ImageSharp](https://github.com/SixLabors/ImageSharp) library. If you want to use that library as image process provider, add the `Volo.Abp.Imaging.ImageSharp` NuGet package to your project, then add `AbpImagingImageSharpModule` to your [module](Module-Development-Basics.md)'s dependency list: +`Volo.Abp.Imaging.ImageSharp` NuGet package implements the image operations using the [ImageSharp](https://github.com/SixLabors/ImageSharp) library. + +## Installation + +You can add this package to your application by either using the [ABP CLI](CLI.md) or manually installing it. Using the [ABP CLI](CLI.md) is the recommended approach. + +### Using the ABP CLI + +Open a command line terminal in the folder of your project (.csproj file) and type the following command: + +```bash +abp add-package Volo.Abp.Imaging.ImageSharp +``` + +### Manual Installation + +If you want to manually install; + +1. Add the [Volo.Abp.Imaging.ImageSharp](https://www.nuget.org/packages/Volo.Abp.Imaging.ImageSharp) NuGet package to your project: + +``` +Install-Package Volo.Abp.Imaging.ImageSharp +``` + +2. Add `AbpImagingImageSharpModule` to your [module](Module-Development-Basics.md)'s dependency list: + ```csharp [DependsOn(typeof(AbpImagingImageSharpModule))] @@ -259,7 +310,29 @@ Configure(options => `Volo.Abp.Imaging.AspNetCore` NuGet package defines attributes for controller actions that can automatically compress and/or resize uploaded files. -To use the ASP.NET Core integration, add the `Volo.Abp.Imaging.AspNetCore` NuGet package to your project and add the `AbpImagingAspNetCoreModule` module to your module's dependency list: +## Installation + +You can add this package to your application by either using the [ABP CLI](CLI.md) or manually installing it. Using the [ABP CLI](CLI.md) is the recommended approach. + +### Using the ABP CLI + +Open a command line terminal in the folder of your project (.csproj file) and type the following command: + +```bash +abp add-package Volo.Abp.Imaging.AspNetCore +``` + +### Manual Installation + +If you want to manually install; + +1. Add the [Volo.Abp.Imaging.AspNetCore](https://www.nuget.org/packages/Volo.Abp.Imaging.AspNetCore) NuGet package to your project: + +``` +Install-Package Volo.Abp.Imaging.AspNetCore +``` + +2. Add `AbpImagingAspNetCoreModule` to your [module](Module-Development-Basics.md)'s dependency list: ```csharp [DependsOn(typeof(AbpImagingAspNetCoreModule))] diff --git a/docs/en/Local-Event-Bus.md b/docs/en/Local-Event-Bus.md index 57c12d4c3b..81c0c5a171 100644 --- a/docs/en/Local-Event-Bus.md +++ b/docs/en/Local-Event-Bus.md @@ -149,7 +149,7 @@ namespace AbpDemo } ```` -That's all. `MyHandler` is **automatically discovered** by the ABP Framework and `HandleEventAsync` is called whenever a `StockCountChangedEvent` occurs. You can inject any service and perform any required logic in your handler class. +That's all. `MyHandler` is **automatically discovered** by the ABP Framework and `HandleEventAsync` is called whenever a `StockCountChangedEvent` occurs. You can inject any service and perform any required logic in your handler class. * **One or more handlers** can subscribe to the same event. * A single event handler class can **subscribe to multiple events** by implementing the `ILocalEventHandler` interface for each event type. @@ -158,6 +158,29 @@ If you perform **database operations** and use the [repositories](Repositories.m > The handler class must be registered to the dependency injection (DI). The sample above uses the `ITransientDependency` to accomplish it. See the [DI document](Dependency-Injection.md) for more options. +### LocalEventHandlerOrder Attribute + +`LocalEventHandlerOrder` attribute can be used to set the execution order for the event handlers, which can be helpful if you want to handle your event handlers in a specific order. + +````csharp +[LocalEventHandlerOrder(-1)] +public class MyHandler + : ILocalEventHandler, + ITransientDependency +{ + public async Task HandleEventAsync(StockCountChangedEvent eventData) + { + //TODO: your code that does something on the event + } +} +```` + +> By default, all event handlers have an order value of 0. Thus, if you want to take certain event handlers to be executed before other event handlers, you can set the order value as a negative value. + +#### LocalEventHandlerOrderAttribute Properties + +* `Order` (`int`): Used to set the execution order for a certain event handler. + ### Transaction & Exception Behavior Event handlers are always executed in the same [unit of work](Unit-Of-Work.md) scope, that means in the same database transaction with the code that published the event. If an event handler throws an exception, the unit of work (database transaction) is rolled back. So, **use try-catch yourself** in the event handler if you want to hide the error. @@ -205,7 +228,7 @@ The pre-built event types are; * `EntityDeletedEventData` is published just after an entity was successfully deleted. * `EntityChangedEventData` is published just after an entity was successfully created, updated or deleted. It can be a shortcut if you need to listen any type of change - instead of subscribing to the individual events. -#### How It Was Implemented? +### How It Was Implemented? Pre-build events are published when you save changes to the database; diff --git a/docs/zh-Hans/Deployment/Index.md b/docs/zh-Hans/Deployment/Index.md index 9df24e56f0..6c58358eee 100644 --- a/docs/zh-Hans/Deployment/Index.md +++ b/docs/zh-Hans/Deployment/Index.md @@ -6,4 +6,4 @@ ## 指南 -* [部署到群集环境](Clustered-Environment.md): 讲解了当你希望同时运行应用程序的多个实例时, 如何来配置应用程序. +* [部署到集群环境](Clustered-Environment.md): 讲解了当你希望同时运行应用程序的多个实例时, 如何来配置应用程序. diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj index 4ee09824cf..9f1051fbd5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj @@ -8,10 +8,6 @@ - - - - diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs index 61c064b376..48065bbac2 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Microsoft/AspNetCore/Authentication/Cookies/CookieAuthenticationOptionsExtensions.cs @@ -1,7 +1,9 @@ using System; +using System.Threading.Tasks; using IdentityModel.Client; using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.Authentication.Cookies; @@ -16,41 +18,67 @@ public static class CookieAuthenticationOptionsExtensions /// public static CookieAuthenticationOptions IntrospectAccessToken(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc") { - var originalHandler = options.Events.OnValidatePrincipal; options.Events.OnValidatePrincipal = async principalContext => { - originalHandler?.Invoke(principalContext); + if (principalContext.Principal == null || principalContext.Principal.Identity == null || !principalContext.Principal.Identity.IsAuthenticated) + { + return; + } + + var logger = principalContext.HttpContext.RequestServices.GetRequiredService>(); - if (principalContext.Principal != null && principalContext.Principal.Identity != null && principalContext.Principal.Identity.IsAuthenticated) + var accessToken = principalContext.Properties.GetTokenValue("access_token"); + if (!accessToken.IsNullOrWhiteSpace()) { - var accessToken = principalContext.Properties.GetTokenValue("access_token"); - if (!accessToken.IsNullOrWhiteSpace()) + var openIdConnectOptions = await GetOpenIdConnectOptions(principalContext, oidcAuthenticationScheme); + var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest + { + Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority.EnsureEndsWith('/') + "connect/introspect", + ClientId = openIdConnectOptions.ClientId, + ClientSecret = openIdConnectOptions.ClientSecret, + Token = accessToken + }); + + if (response.IsError) { - var openIdConnectOptions = principalContext.HttpContext.RequestServices.GetRequiredService>().Get(oidcAuthenticationScheme); - if (openIdConnectOptions.Configuration == null && openIdConnectOptions.ConfigurationManager != null) - { - openIdConnectOptions.Configuration = await openIdConnectOptions.ConfigurationManager.GetConfigurationAsync(principalContext.HttpContext.RequestAborted); - } - - var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest - { - Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority.EnsureEndsWith('/') + "connect/introspect", - ClientId = openIdConnectOptions.ClientId, - ClientSecret = openIdConnectOptions.ClientSecret, - Token = accessToken - }); - - if (response.IsActive) - { - return; - } + logger.LogError(response.Error); + await SignOutAsync(principalContext); + return; } - principalContext.RejectPrincipal(); - await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name); + if (!response.IsActive) + { + logger.LogError("The access_token is not active."); + await SignOutAsync(principalContext); + return; + } + + logger.LogInformation("The access_token is active."); + } + else + { + logger.LogError("The access_token is not found in the cookie properties, Please make sure SaveTokens of OpenIdConnectOptions is set as true."); + await SignOutAsync(principalContext); } }; return options; } + + private async static Task GetOpenIdConnectOptions(CookieValidatePrincipalContext principalContext, string oidcAuthenticationScheme) + { + var openIdConnectOptions = principalContext.HttpContext.RequestServices.GetRequiredService>().Get(oidcAuthenticationScheme); + if (openIdConnectOptions.Configuration == null && openIdConnectOptions.ConfigurationManager != null) + { + openIdConnectOptions.Configuration = await openIdConnectOptions.ConfigurationManager.GetConfigurationAsync(principalContext.HttpContext.RequestAborted); + } + + return openIdConnectOptions; + } + + private async static Task SignOutAsync(CookieValidatePrincipalContext principalContext) + { + principalContext.RejectPrincipal(); + await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj index 5ddfd202a5..4618f31b6c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj @@ -23,6 +23,7 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs index b18fdab82e..2657e5bca7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly; typeof(AbpAspNetCoreMvcClientCommonModule), typeof(AbpUiModule), typeof(AbpAspNetCoreComponentsWebModule) - )] +)] public class AbpAspNetCoreComponentsWebAssemblyModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ClientProxyExceptionEventHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ClientProxyExceptionEventHandler.cs new file mode 100644 index 0000000000..252012feb5 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ClientProxyExceptionEventHandler.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.WebAssembly.Authentication; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus; +using Volo.Abp.Http; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly; + +public class ClientProxyExceptionEventHandler : ILocalEventHandler, ITransientDependency +{ + protected NavigationManager NavigationManager { get; } + protected IAccessTokenProvider AccessTokenProvider { get; } + + public ClientProxyExceptionEventHandler(NavigationManager navigationManager, IAccessTokenProvider accessTokenProvider) + { + NavigationManager = navigationManager; + AccessTokenProvider = accessTokenProvider; + } + + public virtual async Task HandleEventAsync(ClientProxyExceptionEventData eventData) + { + if (eventData.StatusCode == 401) + { + var result = await AccessTokenProvider.RequestAccessToken(); + if (result.Status != AccessTokenResultStatus.Success) + { + NavigationManager.NavigateToLogout("authentication/logout"); + return; + } + + result.TryGetToken(out var token); + if (token != null && DateTimeOffset.Now >= token.Expires.AddMinutes(-5)) + { + NavigationManager.NavigateToLogout("authentication/logout"); + } + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs new file mode 100644 index 0000000000..f873f3762b --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs @@ -0,0 +1,100 @@ +using System; +using System.Globalization; +using System.Threading.Tasks; +using IdentityModel.Client; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authentication.OpenIdConnect; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace Microsoft.Extensions.DependencyInjection; + +public static class CookieAuthenticationOptionsExtensions +{ + /// + /// Check the access_token is expired or inactive. + /// + public static CookieAuthenticationOptions CheckTokenExpiration(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc", TimeSpan? advance = null, TimeSpan? validationInterval = null) + { + advance ??= TimeSpan.FromMinutes(3); + validationInterval ??= TimeSpan.FromMinutes(1); + options.Events.OnValidatePrincipal = async principalContext => + { + if (principalContext.Principal == null || principalContext.Principal.Identity == null || !principalContext.Principal.Identity.IsAuthenticated) + { + return; + } + + var logger = principalContext.HttpContext.RequestServices.GetRequiredService>(); + + var tokenExpiresAt = principalContext.Properties.Items[".Token.expires_at"]; + if (DateTimeOffset.TryParseExact(tokenExpiresAt, "o", null, DateTimeStyles.RoundtripKind, out var expiresAt) && + expiresAt < DateTimeOffset.UtcNow.Subtract(advance.Value)) + { + logger.LogInformation("The access_token is expired."); + await SignOutAsync(principalContext); + return; + } + + if (principalContext.Properties.IssuedUtc != null && DateTimeOffset.UtcNow.Subtract(principalContext.Properties.IssuedUtc.Value) > validationInterval) + { + logger.LogInformation($"Check the access_token is active every {validationInterval.Value.TotalSeconds} seconds."); + var accessToken = principalContext.Properties.GetTokenValue("access_token"); + if (!accessToken.IsNullOrWhiteSpace()) + { + var openIdConnectOptions = await GetOpenIdConnectOptions(principalContext, oidcAuthenticationScheme); + + var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest + { + Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority.EnsureEndsWith('/') + "connect/introspect", + ClientId = openIdConnectOptions.ClientId, + ClientSecret = openIdConnectOptions.ClientSecret, + Token = accessToken + }); + + if (response.IsError) + { + logger.LogError(response.Error); + await SignOutAsync(principalContext); + return; + } + + if (!response.IsActive) + { + logger.LogError("The access_token is not active."); + await SignOutAsync(principalContext); + return; + } + + logger.LogInformation("The access_token is active."); + principalContext.ShouldRenew = true; + } + else + { + logger.LogError("The access_token is not found in the cookie properties, Please make sure SaveTokens of OpenIdConnectOptions is set as true."); + await SignOutAsync(principalContext); + } + } + }; + + return options; + } + + private async static Task GetOpenIdConnectOptions(CookieValidatePrincipalContext principalContext, string oidcAuthenticationScheme) + { + var openIdConnectOptions = principalContext.HttpContext.RequestServices.GetRequiredService>().Get(oidcAuthenticationScheme); + if (openIdConnectOptions.Configuration == null && openIdConnectOptions.ConfigurationManager != null) + { + openIdConnectOptions.Configuration = await openIdConnectOptions.ConfigurationManager.GetConfigurationAsync(principalContext.HttpContext.RequestAborted); + } + + return openIdConnectOptions; + } + + private async static Task SignOutAsync(CookieValidatePrincipalContext principalContext) + { + principalContext.RejectPrincipal(); + await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index aa1090e204..0fe01e9f2b 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -26,6 +26,8 @@ + + diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj index e2bfd7549a..33ee65ee04 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.Caching.StackExchangeRedis Volo.Abp.Caching.StackExchangeRedis $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs index d6c0d8b916..817c42af18 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpCachingStackExchangeRedisModule.cs @@ -16,7 +16,7 @@ public class AbpCachingStackExchangeRedisModule : AbpModule var configuration = context.Services.GetConfiguration(); var redisEnabled = configuration["Redis:IsEnabled"]; - if (redisEnabled.IsNullOrEmpty() || bool.Parse(redisEnabled)) + if (string.IsNullOrEmpty(redisEnabled) || bool.Parse(redisEnabled)) { context.Services.AddStackExchangeRedisCache(options => { diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs index ecad8b16d5..650ff1a562 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs @@ -28,8 +28,8 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems private readonly static MethodInfo GetAbsoluteExpirationMethod; private readonly static MethodInfo GetExpirationInSecondsMethod; - protected IDatabase RedisDatabase => GetRedisDatabase(); - private IDatabase _redisDatabase; + protected IDatabase RedisDatabase => GetRedisDatabase()!; + private IDatabase? _redisDatabase; protected string Instance { get; } @@ -37,28 +37,27 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems { var type = typeof(RedisCache); - RedisDatabaseField = Check.NotNull(type.GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic), nameof(RedisDatabaseField)); + RedisDatabaseField = Check.NotNull(type.GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic), nameof(RedisDatabaseField))!; - SetScriptField = Check.NotNull(type.GetField("_setScript", BindingFlags.Instance | BindingFlags.NonPublic), nameof(SetScriptField)); + SetScriptField = Check.NotNull(type.GetField("_setScript", BindingFlags.Instance | BindingFlags.NonPublic), nameof(SetScriptField))!; + + ConnectMethod = Check.NotNull(type.GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic), nameof(ConnectMethod))!; - ConnectMethod = Check.NotNull(type.GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic), nameof(ConnectMethod)); + ConnectAsyncMethod = Check.NotNull(type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic), nameof(ConnectAsyncMethod))!; - ConnectAsyncMethod = Check.NotNull(type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic), nameof(ConnectAsyncMethod)); + MapMetadataMethod = Check.NotNull(type.GetMethod("MapMetadata", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static), nameof(MapMetadataMethod))!; - MapMetadataMethod = Check.NotNull(type.GetMethod("MapMetadata", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static), nameof(MapMetadataMethod)); + GetAbsoluteExpirationMethod = Check.NotNull(type.GetMethod("GetAbsoluteExpiration", BindingFlags.Static | BindingFlags.NonPublic), nameof(GetAbsoluteExpirationMethod))!; - GetAbsoluteExpirationMethod = Check.NotNull(type.GetMethod("GetAbsoluteExpiration", BindingFlags.Static | BindingFlags.NonPublic), nameof(GetAbsoluteExpirationMethod)); + GetExpirationInSecondsMethod = Check.NotNull(type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic), nameof(GetExpirationInSecondsMethod))!; - GetExpirationInSecondsMethod = Check.NotNull(type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic), nameof(GetExpirationInSecondsMethod)); + AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic)!.GetValue(null)!.ToString()!; - AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null).ToString(); + SlidingExpirationKey = type.GetField("SlidingExpirationKey", BindingFlags.Static | BindingFlags.NonPublic)!.GetValue(null)!.ToString()!; - SlidingExpirationKey = type.GetField("SlidingExpirationKey", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null).ToString(); + DataKey = type.GetField("DataKey", BindingFlags.Static | BindingFlags.NonPublic)!.GetValue(null)!.ToString()!; - DataKey = type.GetField("DataKey", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null).ToString(); - - // ReSharper disable once PossibleNullReferenceException - NotPresent = Check.NotNull(type.GetField("NotPresent", BindingFlags.Static | BindingFlags.NonPublic), nameof(NotPresent)).GetValue(null).To(); + NotPresent = type.GetField("NotPresent", BindingFlags.Static | BindingFlags.NonPublic)!.GetValue(null).To(); } public AbpRedisCache(IOptions optionsAccessor) @@ -84,10 +83,10 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems return; } - await (Task)ConnectAsyncMethod.Invoke(this, new object[] { token }); + await (Task)ConnectAsyncMethod.Invoke(this, new object[] { token })!; } - public byte[][] GetMany( + public byte[]?[] GetMany( IEnumerable keys) { keys = Check.NotNull(keys, nameof(keys)); @@ -95,7 +94,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems return GetAndRefreshMany(keys, true); } - public async Task GetManyAsync( + public async Task GetManyAsync( IEnumerable keys, CancellationToken token = default) { @@ -161,7 +160,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems await RedisDatabase.KeyDeleteAsync(keys.Select(key => (RedisKey)(Instance + key)).ToArray()); } - protected virtual byte[][] GetAndRefreshMany( + protected virtual byte[]?[] GetAndRefreshMany( IEnumerable keys, bool getData) { @@ -186,7 +185,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems return bytes; } - protected virtual async Task GetAndRefreshManyAsync( + protected virtual async Task GetAndRefreshManyAsync( IEnumerable keys, bool getData, CancellationToken token = default) @@ -217,7 +216,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems protected virtual Task[] PipelineRefreshManyAndOutData( string[] keys, RedisValue[][] results, - out byte[][] bytes) + out byte[]?[] bytes) { bytes = new byte[keys.Length][]; var tasks = new Task[keys.Length]; @@ -226,7 +225,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems { if (results[i].Length >= 2) { - MapMetadata(results[i], out DateTimeOffset? absExpr, out TimeSpan? sldExpr); + MapMetadata(results[i], out var absExpr, out var sldExpr); if (sldExpr.HasValue) { @@ -295,7 +294,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems out DateTimeOffset? absoluteExpiration, out TimeSpan? slidingExpiration) { - var parameters = new object[] { results, null, null }; + var parameters = new object?[] { results, null, null }; MapMetadataMethod.Invoke(this, parameters); absoluteExpiration = (DateTimeOffset?)parameters[1]; @@ -308,7 +307,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems DistributedCacheEntryOptions options) { return (long?)GetExpirationInSecondsMethod.Invoke(null, - new object[] { creationTime, absoluteExpiration, options }); + new object?[] { creationTime, absoluteExpiration, options }); } protected virtual DateTimeOffset? GetAbsoluteExpiration( @@ -318,18 +317,13 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems return (DateTimeOffset?)GetAbsoluteExpirationMethod.Invoke(null, new object[] { creationTime, options }); } - private IDatabase GetRedisDatabase() + private IDatabase? GetRedisDatabase() { - if (_redisDatabase == null) - { - _redisDatabase = RedisDatabaseField.GetValue(this) as IDatabase; - } - - return _redisDatabase; + return _redisDatabase ??= RedisDatabaseField.GetValue(this) as IDatabase; } - + private string GetSetScript() { - return SetScriptField?.GetValue(this).ToString(); + return SetScriptField.GetValue(this)!.ToString()!; } } diff --git a/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj b/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj index 52d6a3381d..adc2ef921d 100644 --- a/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj +++ b/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj @@ -5,6 +5,7 @@ netstandard2.0;netstandard2.1;net7.0 + enable Volo.Abp.Caching Volo.Abp.Caching $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpDistributedCacheOptions.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpDistributedCacheOptions.cs index 26b2ef506b..9cb42fdf96 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpDistributedCacheOptions.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/AbpDistributedCacheOptions.cs @@ -25,26 +25,26 @@ public class AbpDistributedCacheOptions /// List of all cache configurators. /// (func argument:Name of cache) /// - public List> CacheConfigurators { get; set; } //TODO: use a configurator interface instead? + public List> CacheConfigurators { get; set; } //TODO: use a configurator interface instead? public AbpDistributedCacheOptions() { - CacheConfigurators = new List>(); + CacheConfigurators = new List>(); GlobalCacheEntryOptions = new DistributedCacheEntryOptions(); KeyPrefix = ""; } - public void ConfigureCache(DistributedCacheEntryOptions options) + public void ConfigureCache(DistributedCacheEntryOptions? options) { ConfigureCache(typeof(TCacheItem), options); } - public void ConfigureCache(Type cacheItemType, DistributedCacheEntryOptions options) + public void ConfigureCache(Type cacheItemType, DistributedCacheEntryOptions? options) { ConfigureCache(CacheNameAttribute.GetCacheName(cacheItemType), options); } - public void ConfigureCache(string cacheName, DistributedCacheEntryOptions options) + public void ConfigureCache(string cacheName, DistributedCacheEntryOptions? options) { CacheConfigurators.Add(name => cacheName != name ? null : options); } diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheNameAttribute.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheNameAttribute.cs index ff162921c9..c49225acbf 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheNameAttribute.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheNameAttribute.cs @@ -33,6 +33,6 @@ public class CacheNameAttribute : Attribute return cacheNameAttribute.Name; } - return cacheItemType.FullName.RemovePostFix("CacheItem"); + return cacheItemType.FullName.RemovePostFix("CacheItem")!; } } diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs index a72a369655..03e42b5d92 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using JetBrains.Annotations; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -31,62 +30,62 @@ public class DistributedCache : InternalCache = internalCache; } - public TCacheItem Get(string key, bool? hideErrors = null, bool considerUow = false) + public TCacheItem? Get(string key, bool? hideErrors = null, bool considerUow = false) { return InternalCache.Get(key, hideErrors, considerUow); } - public KeyValuePair[] GetMany(IEnumerable keys, bool? hideErrors = null, bool considerUow = false) + public KeyValuePair[] GetMany(IEnumerable keys, bool? hideErrors = null, bool considerUow = false) { return InternalCache.GetMany(keys, hideErrors, considerUow); } - public Task[]> GetManyAsync(IEnumerable keys, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) + public Task[]> GetManyAsync(IEnumerable keys, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) { return InternalCache.GetManyAsync(keys, hideErrors, considerUow, token); } - public Task GetAsync(string key, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) + public Task GetAsync(string key, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) { return InternalCache.GetAsync(key, hideErrors, considerUow, token); } - public TCacheItem GetOrAdd(string key, Func factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false) + public TCacheItem? GetOrAdd(string key, Func factory, Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false) { return InternalCache.GetOrAdd(key, factory, optionsFactory, hideErrors, considerUow); } - public Task GetOrAddAsync(string key, Func> factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) + public Task GetOrAddAsync(string key, Func> factory, Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) { return InternalCache.GetOrAddAsync(key, factory, optionsFactory, hideErrors, considerUow, token); } - public KeyValuePair[] GetOrAddMany(IEnumerable keys, Func, List>> factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false) + public KeyValuePair[] GetOrAddMany(IEnumerable keys, Func, List>> factory, Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false) { return InternalCache.GetOrAddMany(keys, factory, optionsFactory, hideErrors, considerUow); } - public Task[]> GetOrAddManyAsync(IEnumerable keys, Func, Task>>> factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) + public Task[]> GetOrAddManyAsync(IEnumerable keys, Func, Task>>> factory, Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) { return InternalCache.GetOrAddManyAsync(keys, factory, optionsFactory, hideErrors, considerUow, token); } - public void Set(string key, TCacheItem value, DistributedCacheEntryOptions options = null, bool? hideErrors = null, bool considerUow = false) + public void Set(string key, TCacheItem value, DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false) { InternalCache.Set(key, value, options, hideErrors, considerUow); } - public Task SetAsync(string key, TCacheItem value, DistributedCacheEntryOptions options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) + public Task SetAsync(string key, TCacheItem value, DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) { return InternalCache.SetAsync(key, value, options, hideErrors, considerUow, token); } - public void SetMany(IEnumerable> items, DistributedCacheEntryOptions options = null, bool? hideErrors = null, bool considerUow = false) + public void SetMany(IEnumerable> items, DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false) { InternalCache.SetMany(items, options, hideErrors, considerUow); } - public Task SetManyAsync(IEnumerable> items, DistributedCacheEntryOptions options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) + public Task SetManyAsync(IEnumerable> items, DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) { return InternalCache.SetManyAsync(items, options, hideErrors, considerUow, token); } @@ -141,12 +140,13 @@ public class DistributedCache : /// The type of cache key being used. public class DistributedCache : IDistributedCache where TCacheItem : class + where TCacheKey : notnull { public const string UowCacheName = "AbpDistributedCache"; public ILogger> Logger { get; set; } - protected string CacheName { get; set; } + protected string CacheName { get; set; } = default!; protected bool IgnoreMultiTenancy { get; set; } @@ -164,7 +164,7 @@ public class DistributedCache : IDistributedCache : IDistributedCache : IDistributedCacheIndicates to throw or hide the exceptions for the distributed cache. /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The cache item, or null. - public virtual TCacheItem Get( + public virtual TCacheItem? Get( TCacheKey key, bool? hideErrors = null, bool considerUow = false) @@ -250,7 +250,7 @@ public class DistributedCache : IDistributedCache : IDistributedCache[] GetMany( + public virtual KeyValuePair[] GetMany( IEnumerable keys, bool? hideErrors = null, bool considerUow = false) @@ -288,7 +288,7 @@ public class DistributedCache : IDistributedCache(); - var cachedValues = new List>(); + var cachedValues = new List>(); if (ShouldConsiderUow(considerUow)) { var uowCache = GetUnitOfWorkCache(); @@ -297,7 +297,7 @@ public class DistributedCache : IDistributedCache(key, value)); + cachedValues.Add(new KeyValuePair(key, value)); } } @@ -309,7 +309,7 @@ public class DistributedCache : IDistributedCache : IDistributedCache[] GetManyFallback( + protected virtual KeyValuePair[] GetManyFallback( TCacheKey[] keys, bool? hideErrors = null, bool considerUow = false) @@ -340,7 +340,7 @@ public class DistributedCache : IDistributedCache new KeyValuePair( + .Select(key => new KeyValuePair( key, Get(key, false, considerUow) ) @@ -358,7 +358,7 @@ public class DistributedCache : IDistributedCache[]> GetManyAsync( + public virtual async Task[]> GetManyAsync( IEnumerable keys, bool? hideErrors = null, bool considerUow = false, @@ -378,7 +378,7 @@ public class DistributedCache : IDistributedCache(); - var cachedValues = new List>(); + var cachedValues = new List>(); if (ShouldConsiderUow(considerUow)) { var uowCache = GetUnitOfWorkCache(); @@ -387,7 +387,7 @@ public class DistributedCache : IDistributedCache(key, value)); + cachedValues.Add(new KeyValuePair(key, value)); } } @@ -399,7 +399,7 @@ public class DistributedCache : IDistributedCache : IDistributedCache[]> GetManyFallbackAsync( + protected virtual async Task[]> GetManyFallbackAsync( TCacheKey[] keys, bool? hideErrors = null, bool considerUow = false, @@ -434,11 +434,11 @@ public class DistributedCache : IDistributedCache>(); + var result = new List>(); foreach (var key in keys) { - result.Add(new KeyValuePair( + result.Add(new KeyValuePair( key, await GetAsync(key, false, considerUow, token: token)) ); @@ -466,7 +466,7 @@ public class DistributedCache : IDistributedCacheThis will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The for the task. /// The cache item, or null. - public virtual async Task GetAsync( + public virtual async Task GetAsync( TCacheKey key, bool? hideErrors = null, bool considerUow = false, @@ -483,7 +483,7 @@ public class DistributedCache : IDistributedCache : IDistributedCacheIndicates to throw or hide the exceptions for the distributed cache. /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The cache item. - public virtual TCacheItem GetOrAdd( + public virtual TCacheItem? GetOrAdd( TCacheKey key, Func factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false) { @@ -574,10 +574,10 @@ public class DistributedCache : IDistributedCacheThis will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The for the task. /// The cache item. - public virtual async Task GetOrAddAsync( + public virtual async Task GetOrAddAsync( TCacheKey key, Func> factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) @@ -618,15 +618,15 @@ public class DistributedCache : IDistributedCache[] GetOrAddMany( + public KeyValuePair[] GetOrAddMany( IEnumerable keys, Func, List>> factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false) { - KeyValuePair[] result; + KeyValuePair[] result; var keyArray = keys.ToArray(); var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems; @@ -641,7 +641,7 @@ public class DistributedCache : IDistributedCache(); - var cachedValues = new List>(); + var cachedValues = new List>(); if (ShouldConsiderUow(considerUow)) { var uowCache = GetUnitOfWorkCache(); @@ -650,7 +650,7 @@ public class DistributedCache : IDistributedCache(key, value)); + cachedValues.Add(new KeyValuePair(key, value)); } } @@ -662,7 +662,7 @@ public class DistributedCache : IDistributedCache : IDistributedCache x.Value != null)) { - return result; + return result!; } var missingKeys = new List(); @@ -708,22 +708,22 @@ public class DistributedCache : IDistributedCache[]> GetOrAddManyAsync( + public async Task[]> GetOrAddManyAsync( IEnumerable keys, Func, Task>>> factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) { - KeyValuePair[] result; + KeyValuePair[] result; var keyArray = keys.ToArray(); var cacheSupportsMultipleItems = Cache as ICacheSupportsMultipleItems; @@ -737,7 +737,7 @@ public class DistributedCache : IDistributedCache(); - var cachedValues = new List>(); + var cachedValues = new List>(); if (ShouldConsiderUow(considerUow)) { var uowCache = GetUnitOfWorkCache(); @@ -746,7 +746,7 @@ public class DistributedCache : IDistributedCache(key, value)); + cachedValues.Add(new KeyValuePair(key, value)); } } @@ -758,7 +758,7 @@ public class DistributedCache : IDistributedCache : IDistributedCache : IDistributedCache : IDistributedCache : IDistributedCache> items, - DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false) { @@ -1012,7 +1012,7 @@ public class DistributedCache : IDistributedCache[] items, - DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false) { @@ -1045,7 +1045,7 @@ public class DistributedCache : IDistributedCache> items, - DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) @@ -1117,7 +1117,7 @@ public class DistributedCache : IDistributedCache[] items, - DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default) @@ -1516,19 +1516,19 @@ public class DistributedCache : IDistributedCache[] ToCacheItems(byte[][] itemBytes, TCacheKey[] itemKeys) + protected virtual KeyValuePair[] ToCacheItems(byte[]?[] itemBytes, TCacheKey[] itemKeys) { if (itemBytes.Length != itemKeys.Length) { throw new AbpException("count of the item bytes should be same with the count of the given keys"); } - var result = new List>(); + var result = new List>(); - for (int i = 0; i < itemKeys.Length; i++) + for (var i = 0; i < itemKeys.Length; i++) { result.Add( - new KeyValuePair( + new KeyValuePair( itemKeys[i], ToCacheItem(itemBytes[i]) ) @@ -1538,8 +1538,7 @@ public class DistributedCache : IDistributedCache : IDistributedCache[] ToCacheItemsWithDefaultValues(TCacheKey[] keys) + private static KeyValuePair[] ToCacheItemsWithDefaultValues(TCacheKey[] keys) { return keys - .Select(key => new KeyValuePair(key, default)) + .Select(key => new KeyValuePair(key, default)) .ToArray(); } diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs index f11b8b56c6..80857aed17 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/ICacheSupportsMultipleItems.cs @@ -7,11 +7,11 @@ namespace Volo.Abp.Caching; public interface ICacheSupportsMultipleItems { - byte[][] GetMany( + byte[]?[] GetMany( IEnumerable keys ); - Task GetManyAsync( + Task GetManyAsync( IEnumerable keys, CancellationToken token = default ); diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs index ab3ca560a8..af654c8d9a 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs @@ -33,7 +33,7 @@ public interface IDistributedCache /// Indicates to throw or hide the exceptions for the distributed cache. /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The cache item, or null. - TCacheItem Get( + TCacheItem? Get( TCacheKey key, bool? hideErrors = null, bool considerUow = false @@ -50,7 +50,7 @@ public interface IDistributedCache /// Indicates to throw or hide the exceptions for the distributed cache. /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// List of cache items. - KeyValuePair[] GetMany( + KeyValuePair[] GetMany( IEnumerable keys, bool? hideErrors = null, bool considerUow = false @@ -69,7 +69,7 @@ public interface IDistributedCache /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// /// The for the task. /// List of cache items. - Task[]> GetManyAsync( + Task[]> GetManyAsync( IEnumerable keys, bool? hideErrors = null, bool considerUow = false, @@ -84,7 +84,7 @@ public interface IDistributedCache /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The for the task. /// The cache item, or null. - Task GetAsync( + Task GetAsync( [NotNull] TCacheKey key, bool? hideErrors = null, bool considerUow = false, @@ -101,10 +101,10 @@ public interface IDistributedCache /// Indicates to throw or hide the exceptions for the distributed cache. /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The cache item. - TCacheItem GetOrAdd( + TCacheItem? GetOrAdd( TCacheKey key, Func factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false ); @@ -120,10 +120,10 @@ public interface IDistributedCache /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The for the task. /// The cache item. - Task GetOrAddAsync( + Task GetOrAddAsync( [NotNull] TCacheKey key, Func> factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default @@ -139,10 +139,10 @@ public interface IDistributedCache /// Indicates to throw or hide the exceptions for the distributed cache. /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The cache items. - KeyValuePair[] GetOrAddMany( + KeyValuePair[] GetOrAddMany( IEnumerable keys, Func, List>> factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false ); @@ -158,10 +158,10 @@ public interface IDistributedCache /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. /// The for the task. /// The cache items. - Task[]> GetOrAddManyAsync( + Task[]> GetOrAddManyAsync( IEnumerable keys, Func, Task>>> factory, - Func optionsFactory = null, + Func? optionsFactory = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default @@ -178,7 +178,7 @@ public interface IDistributedCache void Set( TCacheKey key, TCacheItem value, - DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false ); @@ -196,7 +196,7 @@ public interface IDistributedCache Task SetAsync( [NotNull] TCacheKey key, [NotNull] TCacheItem value, - [CanBeNull] DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default @@ -212,7 +212,7 @@ public interface IDistributedCache /// This will store the cache in the current unit of work until the end of the current unit of work does not really affect the cache. void SetMany( IEnumerable> items, - DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false ); @@ -229,7 +229,7 @@ public interface IDistributedCache /// The indicating that the operation is asynchronous. Task SetManyAsync( IEnumerable> items, - DistributedCacheEntryOptions options = null, + DistributedCacheEntryOptions? options = null, bool? hideErrors = null, bool considerUow = false, CancellationToken token = default diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItem.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItem.cs index 2c0622eed2..4dee5d97fc 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItem.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItem.cs @@ -8,7 +8,7 @@ public class UnitOfWorkCacheItem { public bool IsRemoved { get; set; } - public TValue Value { get; set; } + public TValue? Value { get; set; } public UnitOfWorkCacheItem() { diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItemExtensions.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItemExtensions.cs index 6dc7909fa8..860e9cfb27 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItemExtensions.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/UnitOfWorkCacheItemExtensions.cs @@ -2,7 +2,7 @@ public static class UnitOfWorkCacheItemExtensions { - public static TValue GetUnRemovedValueOrNull(this UnitOfWorkCacheItem item) + public static TValue? GetUnRemovedValueOrNull(this UnitOfWorkCacheItem? item) where TValue : class { return item != null && !item.IsRemoved ? item.Value : null; diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs index f9f2ca23ad..1956c64f65 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationBuilderOptions.cs @@ -8,13 +8,13 @@ public class AbpConfigurationBuilderOptions /// Used to set assembly which is used to get the user secret id for the application. /// Use this or (higher priority) /// - public Assembly UserSecretsAssembly { get; set; } + public Assembly? UserSecretsAssembly { get; set; } /// /// Used to set user secret id for the application. /// Use this (higher priority) or /// - public string UserSecretsId { get; set; } + public string? UserSecretsId { get; set; } /// /// Default value: "appsettings". @@ -34,20 +34,20 @@ public class AbpConfigurationBuilderOptions /// /// Environment name. Generally used "Development", "Staging" or "Production". /// - public string EnvironmentName { get; set; } + public string? EnvironmentName { get; set; } /// /// Base path to read the configuration file indicated by . /// - public string BasePath { get; set; } + public string? BasePath { get; set; } /// /// Prefix for the environment variables. /// - public string EnvironmentVariablesPrefix { get; set; } + public string? EnvironmentVariablesPrefix { get; set; } /// /// Command line arguments. /// - public string[] CommandLineArgs { get; set; } + public string[]? CommandLineArgs { get; set; } } diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs index 28ea8326ac..f31feff873 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/ConfigurationHelper.cs @@ -6,8 +6,8 @@ namespace Microsoft.Extensions.Configuration; public static class ConfigurationHelper { public static IConfigurationRoot BuildConfiguration( - AbpConfigurationBuilderOptions options = null, - Action builderAction = null) + AbpConfigurationBuilderOptions? options = null, + Action? builderAction = null) { options ??= new AbpConfigurationBuilderOptions(); @@ -17,7 +17,7 @@ public static class ConfigurationHelper } var builder = new ConfigurationBuilder() - .SetBasePath(options.BasePath) + .SetBasePath(options.BasePath!) .AddJsonFile(options.FileName + ".json", optional: options.Optional, reloadOnChange: options.ReloadOnChange); if (!options.EnvironmentName.IsNullOrEmpty()) diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs index 3ad02c7f1d..5b81be3285 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs @@ -10,7 +10,7 @@ public static class ServiceCollectionApplicationExtensions { public static IAbpApplicationWithExternalServiceProvider AddApplication( [NotNull] this IServiceCollection services, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) where TStartupModule : IAbpModule { return AbpApplicationFactory.Create(services, optionsAction); @@ -19,14 +19,14 @@ public static class ServiceCollectionApplicationExtensions public static IAbpApplicationWithExternalServiceProvider AddApplication( [NotNull] this IServiceCollection services, [NotNull] Type startupModuleType, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) { return AbpApplicationFactory.Create(startupModuleType, services, optionsAction); } public async static Task AddApplicationAsync( [NotNull] this IServiceCollection services, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) where TStartupModule : IAbpModule { return await AbpApplicationFactory.CreateAsync(services, optionsAction); @@ -35,13 +35,12 @@ public static class ServiceCollectionApplicationExtensions public async static Task AddApplicationAsync( [NotNull] this IServiceCollection services, [NotNull] Type startupModuleType, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) { return await AbpApplicationFactory.CreateAsync(startupModuleType, services, optionsAction); } - [CanBeNull] - public static string GetApplicationName(this IServiceCollection services) + public static string? GetApplicationName(this IServiceCollection services) { return services.GetSingletonInstance().ApplicationName; } diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs index 9cf4200788..7301b0b7a9 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs @@ -24,9 +24,9 @@ public static class ServiceCollectionCommonExtensions return services.GetSingletonInstance(); } - public static T GetSingletonInstanceOrNull(this IServiceCollection services) + public static T? GetSingletonInstanceOrNull(this IServiceCollection services) { - return (T)services + return (T?)services .FirstOrDefault(d => d.ServiceType == typeof(T)) ?.ImplementationInstance; } @@ -65,13 +65,13 @@ public static class ServiceCollectionCommonExtensions .GetMethods() .Single(m => m.Name == nameof(BuildServiceProviderFromFactory) && m.IsGenericMethod) .MakeGenericMethod(containerBuilderType) - .Invoke(null, new object[] { services, null }); + .Invoke(null, new object?[] { services, null })!; } return services.BuildServiceProvider(); } - public static IServiceProvider BuildServiceProviderFromFactory([NotNull] this IServiceCollection services, Action builderAction = null) + public static IServiceProvider BuildServiceProviderFromFactory([NotNull] this IServiceCollection services, Action? builderAction = null) where TContainerBuilder : notnull { Check.NotNull(services, nameof(services)); @@ -90,7 +90,7 @@ public static class ServiceCollectionCommonExtensions /// Resolves a dependency using given . /// This method should be used only after dependency injection registration phase completed. /// - internal static T GetService(this IServiceCollection services) + internal static T? GetService(this IServiceCollection services) { return services .GetSingletonInstance() @@ -102,7 +102,7 @@ public static class ServiceCollectionCommonExtensions /// Resolves a dependency using given . /// This method should be used only after dependency injection registration phase completed. /// - internal static object GetService(this IServiceCollection services, Type type) + internal static object? GetService(this IServiceCollection services, Type type) { return services .GetSingletonInstance() @@ -115,7 +115,7 @@ public static class ServiceCollectionCommonExtensions /// Throws exception if service is not registered. /// This method should be used only after dependency injection registration phase completed. /// - public static T GetRequiredService(this IServiceCollection services) + public static T GetRequiredService(this IServiceCollection services) where T : notnull { return services .GetSingletonInstance() @@ -140,25 +140,25 @@ public static class ServiceCollectionCommonExtensions /// Returns a to resolve a service from given /// once dependency injection registration phase completed. /// - public static Lazy GetServiceLazy(this IServiceCollection services) + public static Lazy GetServiceLazy(this IServiceCollection services) { - return new Lazy(services.GetService, true); + return new Lazy(services.GetService, true); } /// /// Returns a to resolve a service from given /// once dependency injection registration phase completed. /// - public static Lazy GetServiceLazy(this IServiceCollection services, Type type) + public static Lazy GetServiceLazy(this IServiceCollection services, Type type) { - return new Lazy(() => services.GetService(type), true); + return new Lazy(() => services.GetService(type), true); } /// /// Returns a to resolve a service from given /// once dependency injection registration phase completed. /// - public static Lazy GetRequiredServiceLazy(this IServiceCollection services) + public static Lazy GetRequiredServiceLazy(this IServiceCollection services) where T : notnull { return new Lazy(services.GetRequiredService, true); } @@ -172,7 +172,7 @@ public static class ServiceCollectionCommonExtensions return new Lazy(() => services.GetRequiredService(type), true); } - public static IServiceProvider GetServiceProviderOrNull(this IServiceCollection services) + public static IServiceProvider? GetServiceProviderOrNull(this IServiceCollection services) { return services.GetObjectOrNull(); } diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs index 61cde24347..e9dd5cdb66 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs @@ -21,7 +21,7 @@ public static class ServiceCollectionConfigurationExtensions } [CanBeNull] - public static IConfiguration GetConfigurationOrNull(this IServiceCollection services) + public static IConfiguration? GetConfigurationOrNull(this IServiceCollection services) { var hostBuilderContext = services.GetSingletonInstanceOrNull(); if (hostBuilderContext?.Configuration != null) diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs index 52f26fd75e..1c3692274a 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionObjectAccessorExtensions.cs @@ -40,7 +40,7 @@ public static class ServiceCollectionObjectAccessorExtensions return accessor; } - public static T GetObjectOrNull(this IServiceCollection services) + public static T? GetObjectOrNull(this IServiceCollection services) where T : class { return services.GetSingletonInstanceOrNull>()?.Value; diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs index daa017d385..18a93f7348 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Logging/AbpLoggerExtensions.cs @@ -83,7 +83,7 @@ public static class AbpLoggerExtensions private static void LogData(ILogger logger, Exception exception, LogLevel logLevel) { - if (exception.Data == null || exception.Data.Count <= 0) + if (exception.Data.Count <= 0) { return; } @@ -102,23 +102,22 @@ public static class AbpLoggerExtensions { var loggingExceptions = new List(); - if (exception is IExceptionWithSelfLogging) + if (exception is IExceptionWithSelfLogging logging) { - loggingExceptions.Add(exception as IExceptionWithSelfLogging); + loggingExceptions.Add(logging); } - else if (exception is AggregateException && exception.InnerException != null) + else if (exception is AggregateException aggException && aggException.InnerException != null) { - var aggException = exception as AggregateException; - if (aggException.InnerException is IExceptionWithSelfLogging) + if (aggException.InnerException is IExceptionWithSelfLogging selfLogging) { - loggingExceptions.Add(aggException.InnerException as IExceptionWithSelfLogging); + loggingExceptions.Add(selfLogging); } foreach (var innerException in aggException.InnerExceptions) { - if (innerException is IExceptionWithSelfLogging) + if (innerException is IExceptionWithSelfLogging withSelfLogging) { - loggingExceptions.AddIfNotContains(innerException as IExceptionWithSelfLogging); + loggingExceptions.AddIfNotContains(withSelfLogging); } } } diff --git a/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs b/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs index 24ece0e52e..d098a1602b 100644 --- a/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs @@ -36,7 +36,7 @@ public static class AbpObjectExtensions { if (typeof(T) == typeof(Guid)) { - return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(obj.ToString()); + return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(obj.ToString()!)!; } return (T)Convert.ChangeType(obj, typeof(T), CultureInfo.InvariantCulture); diff --git a/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs b/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs index 57f2c59d57..c7153264ae 100644 --- a/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs @@ -47,7 +47,7 @@ public static class AbpStringExtensions /// Indicates whether this string is null or an System.String.Empty string. /// [ContractAnnotation("str:null => true")] - public static bool IsNullOrEmpty(this string str) + public static bool IsNullOrEmpty(this string? str) { return string.IsNullOrEmpty(str); } @@ -56,7 +56,7 @@ public static class AbpStringExtensions /// indicates whether this string is null, empty, or consists only of white-space characters. /// [ContractAnnotation("str:null => true")] - public static bool IsNullOrWhiteSpace(this string str) + public static bool IsNullOrWhiteSpace(this string? str) { return string.IsNullOrWhiteSpace(str); } @@ -482,7 +482,7 @@ public static class AbpStringExtensions /// Gets a substring of a string from beginning of the string if it exceeds maximum length. /// [ContractAnnotation("null <= str:null")] - public static string Truncate(this string str, int maxLength) + public static string? Truncate(this string? str, int maxLength) { if (str == null) { @@ -501,7 +501,7 @@ public static class AbpStringExtensions /// Gets a substring of a string from Ending of the string if it exceeds maximum length. /// [ContractAnnotation("null <= str:null")] - public static string TruncateFromBeginning(this string str, int maxLength) + public static string? TruncateFromBeginning(this string? str, int maxLength) { if (str == null) { @@ -522,7 +522,7 @@ public static class AbpStringExtensions /// Returning string can not be longer than maxLength. /// /// Thrown if is null - public static string TruncateWithPostfix(this string str, int maxLength) + public static string? TruncateWithPostfix(this string? str, int maxLength) { return TruncateWithPostfix(str, maxLength, "..."); } @@ -534,7 +534,7 @@ public static class AbpStringExtensions /// /// Thrown if is null [ContractAnnotation("null <= str:null")] - public static string TruncateWithPostfix(this string str, int maxLength, string postfix) + public static string? TruncateWithPostfix(this string? str, int maxLength, string postfix) { if (str == null) { diff --git a/framework/src/Volo.Abp.Core/System/AbpTypeExtensions.cs b/framework/src/Volo.Abp.Core/System/AbpTypeExtensions.cs index 956b2be1af..4d6d6c5d7a 100644 --- a/framework/src/Volo.Abp.Core/System/AbpTypeExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/AbpTypeExtensions.cs @@ -72,9 +72,9 @@ public static class AbpTypeExtensions private static void AddTypeAndBaseTypesRecursively( [NotNull] List types, - [CanBeNull] Type type, + Type? type, bool includeObject, - [CanBeNull] Type stoppingType = null) + Type? stoppingType = null) { if (type == null || type == stoppingType) { diff --git a/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpCollectionExtensions.cs b/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpCollectionExtensions.cs index 83fbf59629..af6fc698f4 100644 --- a/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpCollectionExtensions.cs @@ -13,7 +13,7 @@ public static class AbpCollectionExtensions /// Checks whatever given collection object is null or has no item. /// [ContractAnnotation("source:null => true")] - public static bool IsNullOrEmpty([CanBeNull] this ICollection source) + public static bool IsNullOrEmpty(this ICollection? source) { return source == null || source.Count <= 0; } diff --git a/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpDictionaryExtensions.cs b/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpDictionaryExtensions.cs index 6ac5601f7d..61c87864ad 100644 --- a/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpDictionaryExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpDictionaryExtensions.cs @@ -16,9 +16,9 @@ public static class AbpDictionaryExtensions /// Key /// Value of the key (or default value if key not exists) /// True if key does exists in the dictionary - internal static bool TryGetValue(this IDictionary dictionary, string key, out T value) + internal static bool TryGetValue(this IDictionary dictionary, string key, out T? value) { - object valueObj; + object? valueObj; if (dictionary.TryGetValue(key, out valueObj) && valueObj is T) { value = (T)valueObj; @@ -37,9 +37,9 @@ public static class AbpDictionaryExtensions /// Type of the key /// Type of the value /// Value if found, default if can not found. - public static TValue GetOrDefault(this Dictionary dictionary, TKey key) + public static TValue? GetOrDefault(this Dictionary dictionary, TKey key) where TKey : notnull { - TValue obj; + TValue? obj; return dictionary.TryGetValue(key, out obj) ? obj : default; } @@ -51,7 +51,7 @@ public static class AbpDictionaryExtensions /// Type of the key /// Type of the value /// Value if found, default if can not found. - public static TValue GetOrDefault(this IDictionary dictionary, TKey key) + public static TValue? GetOrDefault(this IDictionary dictionary, TKey key) { return dictionary.TryGetValue(key, out var obj) ? obj : default; } @@ -64,7 +64,7 @@ public static class AbpDictionaryExtensions /// Type of the key /// Type of the value /// Value if found, default if can not found. - public static TValue GetOrDefault(this IReadOnlyDictionary dictionary, TKey key) + public static TValue? GetOrDefault(this IReadOnlyDictionary dictionary, TKey key) { return dictionary.TryGetValue(key, out var obj) ? obj : default; } @@ -77,7 +77,7 @@ public static class AbpDictionaryExtensions /// Type of the key /// Type of the value /// Value if found, default if can not found. - public static TValue GetOrDefault(this ConcurrentDictionary dictionary, TKey key) + public static TValue? GetOrDefault(this ConcurrentDictionary dictionary, TKey key) where TKey : notnull { return dictionary.TryGetValue(key, out var obj) ? obj : default; } @@ -93,7 +93,7 @@ public static class AbpDictionaryExtensions /// Value if found, default if can not found. public static TValue GetOrAdd(this IDictionary dictionary, TKey key, Func factory) { - TValue obj; + TValue? obj; if (dictionary.TryGetValue(key, out obj)) { return obj; @@ -125,7 +125,7 @@ public static class AbpDictionaryExtensions /// Type of the key /// Type of the value /// Value if found, default if can not found. - public static TValue GetOrAdd(this ConcurrentDictionary dictionary, TKey key, Func factory) + public static TValue GetOrAdd(this ConcurrentDictionary dictionary, TKey key, Func factory) where TKey : notnull { return dictionary.GetOrAdd(key, k => factory()); } @@ -138,7 +138,7 @@ public static class AbpDictionaryExtensions public static dynamic ConvertToDynamicObject(this Dictionary dictionary) { var expandoObject = new ExpandoObject(); - var expendObjectCollection = (ICollection>)expandoObject; + var expendObjectCollection = (ICollection>)expandoObject!; foreach (var keyValuePair in dictionary) { diff --git a/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpListExtensions.cs b/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpListExtensions.cs index 679876412f..84a12e7008 100644 --- a/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpListExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/Collections/Generic/AbpListExtensions.cs @@ -196,7 +196,7 @@ public static class AbpListExtensions public static List SortByDependencies( this IEnumerable source, Func> getDependencies, - IEqualityComparer comparer = null) + IEqualityComparer? comparer = null) where T : notnull { /* See: http://www.codeproject.com/Articles/869059/Topological-sorting-in-Csharp * http://en.wikipedia.org/wiki/Topological_sorting @@ -222,7 +222,7 @@ public static class AbpListExtensions /// List with the sortet items /// Dictionary with the visited items private static void SortByDependenciesVisit(T item, Func> getDependencies, List sorted, - Dictionary visited) + Dictionary visited) where T : notnull { bool inProcess; var alreadyVisited = visited.TryGetValue(item, out inProcess); diff --git a/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs b/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs index 4d8284f858..df66790ca2 100644 --- a/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs +++ b/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs @@ -42,7 +42,7 @@ public static class PredicateBuilder } /// Start an expression - public static ExpressionStarter New(Expression> expr = null) + public static ExpressionStarter New(Expression>? expr = null) { return new ExpressionStarter(expr); } @@ -58,7 +58,7 @@ public static class PredicateBuilder [NotNull] Expression> expr2) { var expr2Body = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body); - return Expression.Lambda>(Expression.OrElse(expr1.Body, expr2Body), expr1.Parameters); + return Expression.Lambda>(Expression.OrElse(expr1.Body, expr2Body!), expr1.Parameters); } /// AND @@ -66,7 +66,7 @@ public static class PredicateBuilder [NotNull] Expression> expr2) { var expr2Body = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body); - return Expression.Lambda>(Expression.AndAlso(expr1.Body, expr2Body), expr1.Parameters); + return Expression.Lambda>(Expression.AndAlso(expr1.Body, expr2Body!), expr1.Parameters); } /// @@ -120,16 +120,16 @@ public class ExpressionStarter } } - public ExpressionStarter(Expression> exp) : this(false) + public ExpressionStarter(Expression>? exp) : this(false) { _predicate = exp; } /// The actual Predicate. It can only be set by calling Start. private Expression> Predicate => - (IsStarted || !UseDefaultExpression) ? _predicate : DefaultExpression; + ((IsStarted || !UseDefaultExpression) ? _predicate : DefaultExpression)!; - private Expression> _predicate; + private Expression>? _predicate; /// Determines if the predicate is started. public bool IsStarted => _predicate != null; @@ -138,7 +138,7 @@ public class ExpressionStarter public bool UseDefaultExpression => DefaultExpression != null; /// The default expression - public Expression> DefaultExpression { get; set; } + public Expression>? DefaultExpression { get; set; } /// Set the Expression predicate /// The first expression @@ -165,7 +165,7 @@ public class ExpressionStarter } /// Show predicate string - public override string ToString() + public override string? ToString() { return Predicate?.ToString(); } @@ -176,7 +176,7 @@ public class ExpressionStarter /// Allows this object to be implicitely converted to an Expression{Func{T, bool}}. /// /// - public static implicit operator Expression>(ExpressionStarter right) + public static implicit operator Expression>?(ExpressionStarter? right) { return right?.Predicate; } @@ -185,7 +185,7 @@ public class ExpressionStarter /// Allows this object to be implicitely converted to an Expression{Func{T, bool}}. /// /// - public static implicit operator Func(ExpressionStarter right) + public static implicit operator Func?(ExpressionStarter? right) { return right == null ? null : (right.IsStarted || right.UseDefaultExpression) ? right.Predicate.Compile() : null; @@ -195,7 +195,7 @@ public class ExpressionStarter /// Allows this object to be implicitely converted to an Expression{Func{T, bool}}. /// /// - public static implicit operator ExpressionStarter(Expression> right) + public static implicit operator ExpressionStarter?(Expression>? right) { return right == null ? null : new ExpressionStarter(right); } @@ -240,7 +240,7 @@ public class ExpressionStarter #if !(NET35) /// - public string Name => Predicate.Name; + public string? Name => Predicate.Name; /// public Type ReturnType => Predicate.ReturnType; diff --git a/framework/src/Volo.Abp.Core/System/Reflection/AbpAssemblyExtensions.cs b/framework/src/Volo.Abp.Core/System/Reflection/AbpAssemblyExtensions.cs index d8cf8c01ab..7f66460099 100644 --- a/framework/src/Volo.Abp.Core/System/Reflection/AbpAssemblyExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/Reflection/AbpAssemblyExtensions.cs @@ -6,6 +6,6 @@ public static class AbpAssemblyExtensions { public static string GetFileVersion(this Assembly assembly) { - return FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion; + return FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion!; } } diff --git a/framework/src/Volo.Abp.Core/System/Reflection/AbpMemberInfoExtensions.cs b/framework/src/Volo.Abp.Core/System/Reflection/AbpMemberInfoExtensions.cs index 12bf926fbd..c0bb5694e3 100644 --- a/framework/src/Volo.Abp.Core/System/Reflection/AbpMemberInfoExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/Reflection/AbpMemberInfoExtensions.cs @@ -14,7 +14,7 @@ public static class AbpMemberInfoExtensions /// The member that will be checked for the attribute /// Include inherited attributes /// Returns the attribute object if found. Returns null if not found. - public static TAttribute GetSingleAttributeOrNull(this MemberInfo memberInfo, bool inherit = true) + public static TAttribute? GetSingleAttributeOrNull(this MemberInfo memberInfo, bool inherit = true) where TAttribute : Attribute { if (memberInfo == null) @@ -32,7 +32,7 @@ public static class AbpMemberInfoExtensions } - public static TAttribute GetSingleAttributeOfTypeOrBaseTypesOrNull(this Type type, bool inherit = true) + public static TAttribute? GetSingleAttributeOfTypeOrBaseTypesOrNull(this Type type, bool inherit = true) where TAttribute : Attribute { var attr = type.GetTypeInfo().GetSingleAttributeOrNull(); @@ -46,6 +46,6 @@ public static class AbpMemberInfoExtensions return null; } - return type.GetTypeInfo().BaseType.GetSingleAttributeOfTypeOrBaseTypesOrNull(inherit); + return type.GetTypeInfo().BaseType?.GetSingleAttributeOfTypeOrBaseTypesOrNull(inherit); } } diff --git a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj index 8bf90f7767..bf8c9a209d 100644 --- a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj +++ b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj @@ -5,6 +5,8 @@ netstandard2.0;netstandard2.1;net7.0 + enable + Nullable Volo.Abp.Core Volo.Abp.Core $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index 609b880566..0ccff2db23 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -19,13 +19,13 @@ public abstract class AbpApplicationBase : IAbpApplication [NotNull] public Type StartupModuleType { get; } - public IServiceProvider ServiceProvider { get; private set; } + public IServiceProvider ServiceProvider { get; private set; } = default!; public IServiceCollection Services { get; } public IReadOnlyList Modules { get; } - public string ApplicationName { get; } + public string? ApplicationName { get; } public string InstanceId { get; } = Guid.NewGuid().ToString(); @@ -34,7 +34,7 @@ public abstract class AbpApplicationBase : IAbpApplication internal AbpApplicationBase( [NotNull] Type startupModuleType, [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction) + Action? optionsAction) { Check.NotNull(startupModuleType, nameof(startupModuleType)); Check.NotNull(services, nameof(services)); @@ -224,7 +224,7 @@ public abstract class AbpApplicationBase : IAbpApplication { if (module.Instance is AbpModule abpModule) { - abpModule.ServiceConfigurationContext = null; + abpModule.ServiceConfigurationContext = null!; } } @@ -315,7 +315,7 @@ public abstract class AbpApplicationBase : IAbpApplication { if (module.Instance is AbpModule abpModule) { - abpModule.ServiceConfigurationContext = null; + abpModule.ServiceConfigurationContext = null!; } } @@ -324,11 +324,11 @@ public abstract class AbpApplicationBase : IAbpApplication TryToSetEnvironment(Services); } - private static string GetApplicationName(AbpApplicationCreationOptions options) + private static string? GetApplicationName(AbpApplicationCreationOptions options) { if (!string.IsNullOrWhiteSpace(options.ApplicationName)) { - return options.ApplicationName; + return options.ApplicationName!; } var configuration = options.Services.GetConfigurationOrNull(); @@ -337,7 +337,7 @@ public abstract class AbpApplicationBase : IAbpApplication var appNameConfig = configuration["ApplicationName"]; if (!string.IsNullOrWhiteSpace(appNameConfig)) { - return appNameConfig; + return appNameConfig!; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs index e1f7f4c997..f0b8f0e06e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs @@ -21,11 +21,9 @@ public class AbpApplicationCreationOptions public bool SkipConfigureServices { get; set; } - [CanBeNull] - public string ApplicationName { get; set; } + public string? ApplicationName { get; set; } - [CanBeNull] - public string Environment { get; set; } + public string? Environment { get; set; } public AbpApplicationCreationOptions([NotNull] IServiceCollection services) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs index 3d64b39b7c..accf892f7e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs @@ -9,7 +9,7 @@ namespace Volo.Abp; public static class AbpApplicationFactory { public async static Task CreateAsync( - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) where TStartupModule : IAbpModule { var app = Create(typeof(TStartupModule), options => @@ -23,7 +23,7 @@ public static class AbpApplicationFactory public async static Task CreateAsync( [NotNull] Type startupModuleType, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) { var app = new AbpApplicationWithInternalServiceProvider(startupModuleType, options => { @@ -36,7 +36,7 @@ public static class AbpApplicationFactory public async static Task CreateAsync( [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) where TStartupModule : IAbpModule { var app = Create(typeof(TStartupModule), services, options => @@ -51,7 +51,7 @@ public static class AbpApplicationFactory public async static Task CreateAsync( [NotNull] Type startupModuleType, [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) { var app = new AbpApplicationWithExternalServiceProvider(startupModuleType, services, options => { @@ -63,7 +63,7 @@ public static class AbpApplicationFactory } public static IAbpApplicationWithInternalServiceProvider Create( - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) where TStartupModule : IAbpModule { return Create(typeof(TStartupModule), optionsAction); @@ -71,14 +71,14 @@ public static class AbpApplicationFactory public static IAbpApplicationWithInternalServiceProvider Create( [NotNull] Type startupModuleType, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) { return new AbpApplicationWithInternalServiceProvider(startupModuleType, optionsAction); } public static IAbpApplicationWithExternalServiceProvider Create( [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) where TStartupModule : IAbpModule { return Create(typeof(TStartupModule), services, optionsAction); @@ -87,7 +87,7 @@ public static class AbpApplicationFactory public static IAbpApplicationWithExternalServiceProvider Create( [NotNull] Type startupModuleType, [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction = null) + Action? optionsAction = null) { return new AbpApplicationWithExternalServiceProvider(startupModuleType, services, optionsAction); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs index fbb9d611cf..d80e46c5d7 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs @@ -10,7 +10,7 @@ internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, I public AbpApplicationWithExternalServiceProvider( [NotNull] Type startupModuleType, [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction + Action? optionsAction ) : base( startupModuleType, services, @@ -23,6 +23,7 @@ internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, I { Check.NotNull(serviceProvider, nameof(serviceProvider)); + // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract if (ServiceProvider != null) { if (ServiceProvider != serviceProvider) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs index 5f09157fcc..c5e5eccc83 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs @@ -7,11 +7,11 @@ namespace Volo.Abp; internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, IAbpApplicationWithInternalServiceProvider { - public IServiceScope ServiceScope { get; private set; } + public IServiceScope? ServiceScope { get; private set; } public AbpApplicationWithInternalServiceProvider( [NotNull] Type startupModuleType, - [CanBeNull] Action optionsAction + Action? optionsAction ) : this( startupModuleType, new ServiceCollection(), @@ -23,7 +23,7 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I private AbpApplicationWithInternalServiceProvider( [NotNull] Type startupModuleType, [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction + Action? optionsAction ) : base( startupModuleType, services, @@ -34,6 +34,7 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I public IServiceProvider CreateServiceProvider() { + // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract if (ServiceProvider != null) { return ServiceProvider; @@ -42,7 +43,7 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I ServiceScope = Services.BuildServiceProviderFromFactory().CreateScope(); SetServiceProvider(ServiceScope.ServiceProvider); - return ServiceProvider; + return ServiceProvider!; } public async Task InitializeAsync() diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpHostEnvironment.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpHostEnvironment.cs index a2682909a1..a16e563767 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpHostEnvironment.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpHostEnvironment.cs @@ -2,5 +2,5 @@ public class AbpHostEnvironment : IAbpHostEnvironment { - public string EnvironmentName { get; set; } + public string? EnvironmentName { get; set; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs index 70cf98303a..ab30160866 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs @@ -14,7 +14,7 @@ public class BundleContext } public void Add(string source, bool excludeFromBundle = false, - Dictionary additionalProperties = null) + Dictionary? additionalProperties = null) { var bundleDefinition = new BundleDefinition { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs index 7fa2a70f85..750b11be75 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.Bundling; public class BundleDefinition { - public string Source { get; set; } + public string Source { get; set; } = default!; public Dictionary AdditionalProperties { get; set; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/BusinessException.cs b/framework/src/Volo.Abp.Core/Volo/Abp/BusinessException.cs index 2faac22046..268985014f 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/BusinessException.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/BusinessException.cs @@ -13,17 +13,17 @@ public class BusinessException : Exception, IHasErrorDetails, IHasLogLevel { - public string Code { get; set; } + public string? Code { get; set; } - public string Details { get; set; } + public string? Details { get; set; } public LogLevel LogLevel { get; set; } public BusinessException( - string code = null, - string message = null, - string details = null, - Exception innerException = null, + string? code = null, + string? message = null, + string? details = null, + Exception? innerException = null, LogLevel logLevel = LogLevel.Warning) : base(message, innerException) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs index a2448190a5..dbb8dc20fb 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Check.cs @@ -136,8 +136,8 @@ public static class Check return type; } - public static string Length( - [CanBeNull] string value, + public static string? Length( + string? value, [InvokerParameterName][NotNull] string parameterName, int maxLength, int minLength = 0) @@ -149,7 +149,7 @@ public static class Check throw new ArgumentException(parameterName + " can not be null or empty!", parameterName); } - if (value.Length < minLength) + if (value!.Length < minLength) { throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs index 6cefb68855..7d7cca4297 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.Content; public interface IRemoteStreamContent : IDisposable { - string FileName { get; } + string? FileName { get; } string ContentType { get; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs index 02ca48a2b1..bc67fac38f 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs @@ -8,13 +8,13 @@ public class RemoteStreamContent : IRemoteStreamContent private readonly bool _disposeStream; private bool _disposed; - public virtual string FileName { get; } + public virtual string? FileName { get; } public virtual string ContentType { get; } = "application/octet-stream"; public virtual long? ContentLength { get; } - public RemoteStreamContent(Stream stream, string fileName = null, string contentType = null, long? readOnlyLength = null, bool disposeStream = true) + public RemoteStreamContent(Stream stream, string? fileName = null, string? contentType = null, long? readOnlyLength = null, bool disposeStream = true) { _stream = stream; diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs index a180592a01..431546a234 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs @@ -28,12 +28,12 @@ public class AbpLazyServiceProvider : return this.GetRequiredService(serviceType); } - public virtual T LazyGetService() + public virtual T? LazyGetService() { - return (T)LazyGetService(typeof(T)); + return (T?)LazyGetService(typeof(T)); } - public virtual object LazyGetService(Type serviceType) + public virtual object? LazyGetService(Type serviceType) { return GetService(serviceType); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs index 21f2b1c516..5e8d9d251a 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs @@ -6,26 +6,26 @@ namespace Volo.Abp.DependencyInjection; public abstract class CachedServiceProviderBase : ICachedServiceProviderBase { protected IServiceProvider ServiceProvider { get; } - protected ConcurrentDictionary> CachedServices { get; } + protected ConcurrentDictionary> CachedServices { get; } protected CachedServiceProviderBase(IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; - CachedServices = new ConcurrentDictionary>(); - CachedServices.TryAdd(typeof(IServiceProvider), new Lazy(() => ServiceProvider)); + CachedServices = new ConcurrentDictionary>(); + CachedServices.TryAdd(typeof(IServiceProvider), new Lazy(() => ServiceProvider)); } - public virtual object GetService(Type serviceType) + public virtual object? GetService(Type serviceType) { return CachedServices.GetOrAdd( serviceType, - _ => new Lazy(() => ServiceProvider.GetService(serviceType)) + _ => new Lazy(() => ServiceProvider.GetService(serviceType)) ).Value; } public T GetService(T defaultValue) { - return (T)GetService(typeof(T), defaultValue); + return (T)GetService(typeof(T), defaultValue!); } public object GetService(Type serviceType, object defaultValue) @@ -42,7 +42,7 @@ public abstract class CachedServiceProviderBase : ICachedServiceProviderBase { return CachedServices.GetOrAdd( serviceType, - _ => new Lazy(() => factory(ServiceProvider)) - ).Value; + _ => new Lazy(() => factory(ServiceProvider)) + ).Value!; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs index dc116903df..c7190e6c4d 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs @@ -52,12 +52,12 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar } } - protected virtual DependencyAttribute GetDependencyAttributeOrNull(Type type) + protected virtual DependencyAttribute? GetDependencyAttributeOrNull(Type type) { return type.GetCustomAttribute(true); } - protected virtual ServiceLifetime? GetLifeTimeOrNull(Type type, [CanBeNull] DependencyAttribute dependencyAttribute) + protected virtual ServiceLifetime? GetLifeTimeOrNull(Type type, DependencyAttribute? dependencyAttribute) { return dependencyAttribute?.Lifetime ?? GetServiceLifetimeFromClassHierarchy(type) ?? GetDefaultLifeTimeOrNull(type); } @@ -110,7 +110,7 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar { return ServiceDescriptor.Describe( exposingServiceType, - provider => provider.GetService(redirectedType), + provider => provider.GetService(redirectedType)!, lifeTime ); } @@ -123,7 +123,7 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar ); } - protected virtual Type GetRedirectedTypeOrNull( + protected virtual Type? GetRedirectedTypeOrNull( Type implementationType, Type exposingServiceType, List allExposingServiceTypes) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs index cd5f1da67f..4d32c88f1b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs @@ -24,13 +24,13 @@ public interface IAbpLazyServiceProvider : ICachedServiceProviderBase /// This method is equivalent of the GetService method. /// It does exists for backward compatibility. /// - T LazyGetService(); + T? LazyGetService(); /// /// This method is equivalent of the GetService method. /// It does exists for backward compatibility. /// - object LazyGetService(Type serviceType); + object? LazyGetService(Type serviceType); /// /// This method is equivalent of the method. diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs index 328b008f54..5286c4672e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs @@ -4,6 +4,5 @@ namespace Volo.Abp.DependencyInjection; public interface IObjectAccessor { - [CanBeNull] - T Value { get; } + T? Value { get; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs index 3e3014507c..612732b370 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs @@ -4,14 +4,14 @@ namespace Volo.Abp.DependencyInjection; public class ObjectAccessor : IObjectAccessor { - public T Value { get; set; } + public T? Value { get; set; } public ObjectAccessor() { } - public ObjectAccessor([CanBeNull] T obj) + public ObjectAccessor(T? obj) { Value = obj; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs index cbb6fb8984..a406bc5597 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProvider.cs @@ -9,10 +9,10 @@ public class RootServiceProvider : IRootServiceProvider, ISingletonDependency public RootServiceProvider(IObjectAccessor objectAccessor) { - ServiceProvider = objectAccessor.Value; + ServiceProvider = objectAccessor.Value!; } - public virtual object GetService(Type serviceType) + public virtual object? GetService(Type serviceType) { return ServiceProvider.GetService(serviceType); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DisposeAction.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DisposeAction.cs index 0bb9cf46a8..7edb18485c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DisposeAction.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DisposeAction.cs @@ -37,8 +37,7 @@ public class DisposeAction : IDisposable { private readonly Action _action; - [CanBeNull] - private readonly T _parameter; + private readonly T? _parameter; /// /// Creates a new object. @@ -55,6 +54,9 @@ public class DisposeAction : IDisposable public void Dispose() { - _action(_parameter); + if (_parameter != null) + { + _action(_parameter); + } } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs index 2bf147573f..5b4f6c6349 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/ProxyHelper.cs @@ -28,7 +28,7 @@ public static class ProxyHelper return obj; } - return targetField.GetValue(obj); + return targetField.GetValue(obj)!; } public static Type GetUnProxiedType(object obj) @@ -36,15 +36,12 @@ public static class ProxyHelper if (obj.GetType().Namespace == ProxyNamespace) { var target = UnProxy(obj); - if (target != null) + if (target == obj) { - if (target == obj) - { - return obj.GetType().GetTypeInfo().BaseType; - } - - return target.GetType(); + return obj.GetType().GetTypeInfo().BaseType!; } + + return target.GetType(); } return obj.GetType(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorCode.cs b/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorCode.cs index 6ab509230d..10f6d39c0b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorCode.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorCode.cs @@ -2,5 +2,5 @@ public interface IHasErrorCode { - string Code { get; } + string? Code { get; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorDetails.cs b/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorDetails.cs index aa79ec6fd6..c6e7214031 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorDetails.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorDetails.cs @@ -2,5 +2,5 @@ namespace Volo.Abp.ExceptionHandling; public interface IHasErrorDetails { - string Details { get; } + string? Details { get; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpHostEnvironment.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpHostEnvironment.cs index 383361b9ed..2d111173ea 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpHostEnvironment.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpHostEnvironment.cs @@ -2,5 +2,5 @@ public interface IAbpHostEnvironment { - string EnvironmentName { get; set; } + string? EnvironmentName { get; set; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationInfoAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationInfoAccessor.cs index 01d20cfbc7..f9b45a4515 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationInfoAccessor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationInfoAccessor.cs @@ -9,8 +9,7 @@ public interface IApplicationInfoAccessor /// This is useful for systems with multiple applications, to distinguish /// resources of the applications located together. /// - [CanBeNull] - string ApplicationName { get; } + string? ApplicationName { get; } /// /// A unique identifier for this application instance. diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs index cfd9407470..c4daaed745 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs @@ -36,8 +36,7 @@ public static class FileHelper /// Returns extension without dot. /// Returns null if given does not include dot. /// - [CanBeNull] - public static string GetExtension([NotNull] string fileNameWithExtension) + public static string? GetExtension([NotNull] string fileNameWithExtension) { Check.NotNull(fileNameWithExtension, nameof(fileNameWithExtension)); @@ -90,7 +89,7 @@ public static class FileHelper /// Indicates FileStream options. Default is Asynchronous (The file is to be used for asynchronous reading.) and SequentialScan (The file is to be accessed sequentially from beginning to end.) /// A string containing all lines of the file. public static async Task ReadAllLinesAsync(string path, - Encoding encoding = null, + Encoding? encoding = null, FileMode fileMode = FileMode.Open, FileAccess fileAccess = FileAccess.Read, FileShare fileShare = FileShare.Read, @@ -114,7 +113,7 @@ public static class FileHelper { using (var reader = new StreamReader(stream, encoding)) { - string line; + string? line; while ((line = await reader.ReadLineAsync()) != null) { lines.Add(line); @@ -134,6 +133,6 @@ public static class FileHelper { var content = await ReadAllBytesAsync(path); - return StringHelper.ConvertFromBytesWithoutBom(content); + return StringHelper.ConvertFromBytesWithoutBom(content)!; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs index d2e15fdf25..7f12dce8bd 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs @@ -7,7 +7,7 @@ namespace Volo.Abp.Localization; public static class CultureHelper { - public static IDisposable Use([NotNull] string culture, string uiCulture = null) + public static IDisposable Use([NotNull] string culture, string? uiCulture = null) { Check.NotNull(culture, nameof(culture)); @@ -19,7 +19,7 @@ public static class CultureHelper ); } - public static IDisposable Use([NotNull] CultureInfo culture, CultureInfo uiCulture = null) + public static IDisposable Use([NotNull] CultureInfo culture, CultureInfo? uiCulture = null) { Check.NotNull(culture, nameof(culture)); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Logging/AbpInitLogEntry.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Logging/AbpInitLogEntry.cs index 3624f1da2e..ea17388b9f 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Logging/AbpInitLogEntry.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Logging/AbpInitLogEntry.cs @@ -9,11 +9,11 @@ public class AbpInitLogEntry public EventId EventId { get; set; } - public object State { get; set; } + public object State { get; set; } = default!; - public Exception Exception { get; set; } + public Exception? Exception { get; set; } - public Func Formatter { get; set; } + public Func Formatter { get; set; } = default!; public string Message => Formatter(State, Exception); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLogger.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLogger.cs index ca6901a628..98264aab74 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLogger.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Logging/DefaultInitLogger.cs @@ -13,13 +13,13 @@ public class DefaultInitLogger : IInitLogger Entries = new List(); } - public virtual void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + public virtual void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { Entries.Add(new AbpInitLogEntry { LogLevel = logLevel, EventId = eventId, - State = state, + State = state!, Exception = exception, Formatter = (s, e) => formatter((TState)s, e), }); @@ -30,7 +30,7 @@ public class DefaultInitLogger : IInitLogger return logLevel != LogLevel.None; } - public virtual IDisposable BeginScope(TState state) + public virtual IDisposable BeginScope(TState state) where TState : notnull { return NullDisposable.Instance; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs index ae2bec3112..11e69bd920 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs @@ -29,7 +29,7 @@ public abstract class AbpModule : internal set => _serviceConfigurationContext = value; } - private ServiceConfigurationContext _serviceConfigurationContext; + private ServiceConfigurationContext? _serviceConfigurationContext; public virtual Task PreConfigureServicesAsync(ServiceConfigurationContext context) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DependsOnAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DependsOnAttribute.cs index eefa03a438..89970859e8 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DependsOnAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DependsOnAttribute.cs @@ -12,7 +12,7 @@ public class DependsOnAttribute : Attribute, IDependedTypesProvider [NotNull] public Type[] DependedTypes { get; } - public DependsOnAttribute(params Type[] dependedTypes) + public DependsOnAttribute(params Type[]? dependedTypes) { DependedTypes = dependedTypes ?? new Type[0]; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLoader.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLoader.cs index a44bf0cf22..5a2f31a972 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLoader.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLoader.cs @@ -85,7 +85,7 @@ public class ModuleLoader : IModuleLoader protected virtual IAbpModule CreateAndRegisterModule(IServiceCollection services, Type moduleType) { - var module = (IAbpModule)Activator.CreateInstance(moduleType); + var module = (IAbpModule)Activator.CreateInstance(moduleType)!; services.AddSingleton(moduleType, module); return module; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FilePlugInSource.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FilePlugInSource.cs index 9a0d3a47f6..49132629d0 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FilePlugInSource.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FilePlugInSource.cs @@ -8,7 +8,7 @@ public class FilePlugInSource : IPlugInSource { public string[] FilePaths { get; } - public FilePlugInSource(params string[] filePaths) + public FilePlugInSource(params string[]? filePaths) { FilePaths = filePaths ?? new string[0]; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs index d1756ef3c8..0dec6db303 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/FolderPlugInSource.cs @@ -15,7 +15,7 @@ public class FolderPlugInSource : IPlugInSource public SearchOption SearchOption { get; set; } - public Func Filter { get; set; } + public Func? Filter { get; set; } public FolderPlugInSource( [NotNull] string folder, diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/TypePlugInSource.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/TypePlugInSource.cs index 78065f5442..78f9a215ab 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/TypePlugInSource.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/TypePlugInSource.cs @@ -7,7 +7,7 @@ public class TypePlugInSource : IPlugInSource { private readonly Type[] _moduleTypes; - public TypePlugInSource(params Type[] moduleTypes) + public TypePlugInSource(params Type[]? moduleTypes) { _moduleTypes = moduleTypes ?? new Type[0]; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ServiceConfigurationContext.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ServiceConfigurationContext.cs index efb2f5fc74..6141777cec 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ServiceConfigurationContext.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ServiceConfigurationContext.cs @@ -8,7 +8,7 @@ public class ServiceConfigurationContext { public IServiceCollection Services { get; } - public IDictionary Items { get; } + public IDictionary Items { get; } /// /// Gets/sets arbitrary named objects those can be stored during @@ -19,7 +19,7 @@ public class ServiceConfigurationContext /// /// /// - public object this[string key] { + public object? this[string key] { get => Items.GetOrDefault(key); set => Items[key] = value; } @@ -27,6 +27,6 @@ public class ServiceConfigurationContext public ServiceConfigurationContext([NotNull] IServiceCollection services) { Services = Check.NotNull(services, nameof(services)); - Items = new Dictionary(); + Items = new Dictionary(); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/NameValue.cs b/framework/src/Volo.Abp.Core/Volo/Abp/NameValue.cs index 224976b3d9..721d6330ad 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/NameValue.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/NameValue.cs @@ -29,12 +29,12 @@ public class NameValue /// /// Name. /// - public string Name { get; set; } + public string Name { get; set; } = default!; /// /// Value. /// - public T Value { get; set; } + public T Value { get; set; } = default!; public NameValue() { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs index a8471b90c4..3ba332afab 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs @@ -9,8 +9,8 @@ namespace Volo.Abp; public static class ObjectHelper { - private static readonly ConcurrentDictionary CachedObjectProperties = - new ConcurrentDictionary(); + private static readonly ConcurrentDictionary CachedObjectProperties = + new ConcurrentDictionary(); public static void TrySetProperty( TObject obj, @@ -25,9 +25,9 @@ public static class ObjectHelper TObject obj, Expression> propertySelector, Func valueFactory, - params Type[] ignoreAttributeTypes) + params Type[]? ignoreAttributeTypes) { - var cacheKey = $"{obj.GetType().FullName}-" + + var cacheKey = $"{obj?.GetType().FullName}-" + $"{propertySelector}-" + $"{(ignoreAttributeTypes != null ? "-" + string.Join("-", ignoreAttributeTypes.Select(x => x.FullName)) : "")}"; @@ -40,7 +40,7 @@ public static class ObjectHelper var memberExpression = propertySelector.Body.As(); - var propertyInfo = obj.GetType().GetProperties().FirstOrDefault(x => + var propertyInfo = obj?.GetType().GetProperties().FirstOrDefault(x => x.Name == memberExpression.Member.Name && x.GetSetMethod(true) != null); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpOptionsFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpOptionsFactory.cs index 754d3914ad..1f86e73eb3 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpOptionsFactory.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Options/AbpOptionsFactory.cs @@ -9,7 +9,7 @@ public class AbpOptionsFactory : IOptionsFactory where TOpti { private readonly IEnumerable> _setups; private readonly IEnumerable> _postConfigures; - private readonly IEnumerable> _validations; + private readonly IEnumerable>? _validations; public AbpOptionsFactory( IEnumerable> setups, @@ -22,7 +22,7 @@ public class AbpOptionsFactory : IOptionsFactory where TOpti public AbpOptionsFactory( IEnumerable> setups, IEnumerable> postConfigures, - IEnumerable> validations) + IEnumerable>? validations) { _setups = setups; _postConfigures = postConfigures; diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs index 8b855476e4..8e71f011fe 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs @@ -31,7 +31,7 @@ internal static class AssemblyHelper } catch (ReflectionTypeLoadException ex) { - return ex.Types; + return ex.Types!; } } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs index bb10a13a68..ab26313736 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs @@ -80,7 +80,7 @@ public static class ReflectionHelper /// MemberInfo /// Default value (null as default) /// Inherit attribute from base classes - public static TAttribute GetSingleAttributeOrDefault(MemberInfo memberInfo, TAttribute defaultValue = default, bool inherit = true) + public static TAttribute? GetSingleAttributeOrDefault(MemberInfo memberInfo, TAttribute? defaultValue = default, bool inherit = true) where TAttribute : Attribute { //Get attribute on the member @@ -100,7 +100,7 @@ public static class ReflectionHelper /// MemberInfo /// Default value (null as default) /// Inherit attribute from base classes - public static TAttribute GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(MemberInfo memberInfo, TAttribute defaultValue = default, bool inherit = true) + public static TAttribute? GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(MemberInfo memberInfo, TAttribute? defaultValue = default, bool inherit = true) where TAttribute : class { return memberInfo.GetCustomAttributes(true).OfType().FirstOrDefault() @@ -128,7 +128,7 @@ public static class ReflectionHelper /// /// Gets value of a property by it's full path from given object /// - public static object GetValueByPath(object obj, Type objectType, string propertyPath) + public static object? GetValueByPath(object obj, Type objectType, string propertyPath) { var value = obj; var currentType = objectType; @@ -167,7 +167,7 @@ public static class ReflectionHelper { var currentType = objectType; PropertyInfo property; - var objectPath = currentType.FullName; + var objectPath = currentType.FullName!; var absolutePropertyPath = propertyPath; if (absolutePropertyPath.StartsWith(objectPath)) { @@ -178,19 +178,19 @@ public static class ReflectionHelper if (properties.Length == 1) { - property = objectType.GetProperty(properties.First()); + property = objectType.GetProperty(properties.First())!; property.SetValue(obj, value); return; } for (int i = 0; i < properties.Length - 1; i++) { - property = currentType.GetProperty(properties[i]); - obj = property.GetValue(obj, null); + property = currentType.GetProperty(properties[i])!; + obj = property.GetValue(obj, null)!; currentType = property.PropertyType; } - property = currentType.GetProperty(properties.Last()); + property = currentType.GetProperty(properties.Last())!; property.SetValue(obj, value); } @@ -215,7 +215,7 @@ public static class ReflectionHelper constants.AddRange(targetType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(x => x.IsLiteral && !x.IsInitOnly) - .Select(x => x.GetValue(null).ToString())); + .Select(x => x.GetValue(null)!.ToString()!)); var nestedTypes = targetType.GetNestedTypes(BindingFlags.Public); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs index 4828dc1b32..b439a5a07b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeHelper.cs @@ -43,7 +43,7 @@ public static class TypeHelper return NonNullablePrimitiveTypes.Contains(type); } - public static bool IsFunc(object obj) + public static bool IsFunc(object? obj) { if (obj == null) { @@ -59,7 +59,7 @@ public static class TypeHelper return type.GetGenericTypeDefinition() == typeof(Func<>); } - public static bool IsFunc(object obj) + public static bool IsFunc(object? obj) { return obj != null && obj.GetType() == typeof(Func); } @@ -88,13 +88,13 @@ public static class TypeHelper { if (t.GetGenericArguments().Length > 0 && t.GetGenericTypeDefinition() == typeof(Nullable<>)) { - return t.GetGenericArguments().FirstOrDefault(); + return t.GetGenericArguments().First(); } return t; } - public static bool IsEnumerable(Type type, out Type itemType, bool includePrimitives = true) + public static bool IsEnumerable(Type type, out Type? itemType, bool includePrimitives = true) { if (!includePrimitives && IsPrimitiveExtended(type)) { @@ -119,7 +119,7 @@ public static class TypeHelper return false; } - public static bool IsDictionary(Type type, out Type keyType, out Type valueType) + public static bool IsDictionary(Type type, out Type? keyType, out Type? valueType) { var dictionaryTypes = ReflectionHelper .GetImplementedGenericTypes( @@ -167,12 +167,12 @@ public static class TypeHelper type == typeof(Guid); } - public static T GetDefaultValue() + public static T? GetDefaultValue() { return default; } - public static object GetDefaultValue(Type type) + public static object? GetDefaultValue(Type type) { if (type.IsValueType) { @@ -194,7 +194,8 @@ public static class TypeHelper if (type.IsGenericType) { var genericType = type.GetGenericTypeDefinition(); - return $"{genericType.FullName.Left(genericType.FullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetFullNameHandlingNullableAndGenerics).JoinAsString(",")}>"; + var genericTypeFullName = genericType.FullName!; + return $"{genericTypeFullName.Left(genericTypeFullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetFullNameHandlingNullableAndGenerics).JoinAsString(",")}>"; } return type.FullName ?? type.Name; @@ -212,7 +213,8 @@ public static class TypeHelper if (type.IsGenericType) { var genericType = type.GetGenericTypeDefinition(); - return $"{genericType.FullName.Left(genericType.FullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetSimplifiedName).JoinAsString(",")}>"; + var genericTypeFullName = genericType.FullName!; + return $"{genericTypeFullName.Left(genericTypeFullName.IndexOf('`'))}<{type.GenericTypeArguments.Select(GetSimplifiedName).JoinAsString(",")}>"; } if (type == typeof(string)) @@ -303,12 +305,12 @@ public static class TypeHelper return type.FullName ?? type.Name; } - public static object ConvertFromString(string value) + public static object? ConvertFromString(string value) { return ConvertFromString(typeof(TTargetType), value); } - public static object ConvertFromString(Type targetType, string value) + public static object? ConvertFromString(Type targetType, string? value) { if (value == null) { @@ -354,7 +356,7 @@ public static class TypeHelper { return TypeDescriptor .GetConverter(targetType) - .ConvertFrom(value); + .ConvertFrom(value)!; } public static Type StripNullable(Type type) @@ -364,7 +366,7 @@ public static class TypeHelper : type; } - public static bool IsDefaultValue([CanBeNull] object obj) + public static bool IsDefaultValue(object? obj) { if (obj == null) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/RemoteServiceAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/RemoteServiceAttribute.cs index 7d2c3ac3a2..21ccb458bb 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/RemoteServiceAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/RemoteServiceAttribute.cs @@ -22,7 +22,7 @@ public class RemoteServiceAttribute : Attribute //TODO: Can we move this to anot /// Group names of all services of a module expected to be the same. /// This name is also used to distinguish the service endpoint of this group. /// - public string Name { get; set; } + public string Name { get; set; } = default!; public RemoteServiceAttribute(bool isEnabled = true) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs index ffbed53cf7..96c0785d6e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializer.cs @@ -4,9 +4,9 @@ namespace Volo.Abp.SimpleStateChecking; public interface ISimpleStateCheckerSerializer { - public string Serialize(ISimpleStateChecker checker) + public string? Serialize(ISimpleStateChecker checker) where TState : IHasSimpleStateCheckers; - public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + public ISimpleStateChecker? Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers; } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs index d65c90eee6..588e138f42 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs @@ -5,11 +5,9 @@ namespace Volo.Abp.SimpleStateChecking; public interface ISimpleStateCheckerSerializerContributor { - [CanBeNull] - public string SerializeToJson(ISimpleStateChecker checker) + public string? SerializeToJson(ISimpleStateChecker checker) where TState : IHasSimpleStateCheckers; - [CanBeNull] - public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + public ISimpleStateChecker? Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers; } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs index d5d931ffae..0cdd300050 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs @@ -16,8 +16,7 @@ public class SimpleStateCheckerSerializer : _contributors = contributors; } - [CanBeNull] - public string Serialize(ISimpleStateChecker checker) + public string? Serialize(ISimpleStateChecker checker) where TState : IHasSimpleStateCheckers { foreach (var contributor in _contributors) @@ -32,8 +31,7 @@ public class SimpleStateCheckerSerializer : return null; } - [CanBeNull] - public ISimpleStateChecker Deserialize(JsonObject jsonObject, TState state) + public ISimpleStateChecker? Deserialize(JsonObject jsonObject, TState state) where TState : IHasSimpleStateCheckers { foreach (var contributor in _contributors) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs index 3594261741..8d06c7cfc3 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializerExtensions.cs @@ -7,7 +7,7 @@ namespace Volo.Abp.SimpleStateChecking; public static class SimpleStateCheckerSerializerExtensions { - public static string Serialize( + public static string? Serialize( this ISimpleStateCheckerSerializer serializer, IList> stateCheckers) where TState : IHasSimpleStateCheckers @@ -73,7 +73,7 @@ public static class SimpleStateCheckerSerializerExtensions return new[] { checker }; } - var checkers = new List>(); + var checkers = new List?>(); for (var i = 0; i < array.Count; i++) { @@ -85,6 +85,6 @@ public static class SimpleStateCheckerSerializerExtensions checkers.Add(serializer.Deserialize(jsonObject, state)); } - return checkers.Where(x => x != null).ToArray(); + return checkers.Where(x => x != null).ToArray()!; } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Text/Formatting/FormattedStringValueExtracter.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Text/Formatting/FormattedStringValueExtracter.cs index 4cf476f56b..280fe100fe 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Text/Formatting/FormattedStringValueExtracter.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Text/Formatting/FormattedStringValueExtracter.cs @@ -68,7 +68,7 @@ public class FormattedStringValueExtracter Debug.Assert(previousToken != null, "previousToken can not be null since i > 0 here"); - result.Matches.Add(new NameValue(previousToken.Text, str.Substring(0, matchIndex))); + result.Matches.Add(new NameValue(previousToken!.Text, str.Substring(0, matchIndex))); str = str.Substring(matchIndex + currentToken.Text.Length); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Text/StringHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Text/StringHelper.cs index 6b84220257..d45baa86d7 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Text/StringHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Text/StringHelper.cs @@ -10,7 +10,7 @@ public class StringHelper /// The byte[] to be converted to string /// The encoding to get string. Default is UTF8 /// - public static string ConvertFromBytesWithoutBom(byte[] bytes, Encoding encoding = null) + public static string? ConvertFromBytesWithoutBom(byte[]? bytes, Encoding? encoding = null) { if (bytes == null) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Threading/InternalAsyncHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/InternalAsyncHelper.cs index 827d59c79f..48a468098c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Threading/InternalAsyncHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/InternalAsyncHelper.cs @@ -9,9 +9,9 @@ namespace Volo.Abp.Threading; //TODO: Cache GetMethod reflection! public static class InternalAsyncHelper { - public static async Task AwaitTaskWithFinally(Task actualReturnValue, Action finalAction) + public static async Task AwaitTaskWithFinally(Task actualReturnValue, Action finalAction) { - Exception exception = null; + Exception? exception = null; try { @@ -28,9 +28,9 @@ public static class InternalAsyncHelper } } - public static async Task AwaitTaskWithPostActionAndFinally(Task actualReturnValue, Func postAction, Action finalAction) + public static async Task AwaitTaskWithPostActionAndFinally(Task actualReturnValue, Func postAction, Action finalAction) { - Exception exception = null; + Exception? exception = null; try { @@ -48,9 +48,9 @@ public static class InternalAsyncHelper } } - public static async Task AwaitTaskWithPreActionAndPostActionAndFinally(Func actualReturnValue, Func preAction = null, Func postAction = null, Action finalAction = null) + public static async Task AwaitTaskWithPreActionAndPostActionAndFinally(Func actualReturnValue, Func? preAction = null, Func? postAction = null, Action? finalAction = null) { - Exception exception = null; + Exception? exception = null; try { @@ -80,9 +80,9 @@ public static class InternalAsyncHelper } } - public static async Task AwaitTaskWithFinallyAndGetResult(Task actualReturnValue, Action finalAction) + public static async Task AwaitTaskWithFinallyAndGetResult(Task actualReturnValue, Action finalAction) { - Exception exception = null; + Exception? exception = null; try { @@ -103,14 +103,14 @@ public static class InternalAsyncHelper { return typeof(InternalAsyncHelper) .GetTypeInfo() - .GetMethod("AwaitTaskWithFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static) + .GetMethod("AwaitTaskWithFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)! .MakeGenericMethod(taskReturnType) - .Invoke(null, new object[] { actualReturnValue, finalAction }); + .Invoke(null, new object[] { actualReturnValue, finalAction })!; } - public static async Task AwaitTaskWithPostActionAndFinallyAndGetResult(Task actualReturnValue, Func postAction, Action finalAction) + public static async Task AwaitTaskWithPostActionAndFinallyAndGetResult(Task actualReturnValue, Func postAction, Action finalAction) { - Exception exception = null; + Exception? exception = null; try { @@ -133,14 +133,14 @@ public static class InternalAsyncHelper { return typeof(InternalAsyncHelper) .GetTypeInfo() - .GetMethod("AwaitTaskWithPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static) + .GetMethod("AwaitTaskWithPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)! .MakeGenericMethod(taskReturnType) - .Invoke(null, new object[] { actualReturnValue, action, finalAction }); + .Invoke(null, new object[] { actualReturnValue, action, finalAction })!; } - public static async Task AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult(Func> actualReturnValue, Func preAction = null, Func postAction = null, Action finalAction = null) + public static async Task AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult(Func> actualReturnValue, Func? preAction = null, Func? postAction = null, Action? finalAction = null) { - Exception exception = null; + Exception? exception = null; try { @@ -169,19 +169,19 @@ public static class InternalAsyncHelper } } - public static object CallAwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult(Type taskReturnType, Func actualReturnValue, Func preAction = null, Func postAction = null, Action finalAction = null) + public static object CallAwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult(Type taskReturnType, Func actualReturnValue, Func? preAction = null, Func? postAction = null, Action? finalAction = null) { var returnFunc = typeof(InternalAsyncHelper) .GetTypeInfo() - .GetMethod("ConvertFuncOfObjectToFuncOfTask", BindingFlags.NonPublic | BindingFlags.Static) + .GetMethod("ConvertFuncOfObjectToFuncOfTask", BindingFlags.NonPublic | BindingFlags.Static)! .MakeGenericMethod(taskReturnType) .Invoke(null, new object[] { actualReturnValue }); return typeof(InternalAsyncHelper) .GetTypeInfo() - .GetMethod("AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static) + .GetMethod("AwaitTaskWithPreActionAndPostActionAndFinallyAndGetResult", BindingFlags.Public | BindingFlags.Static)! .MakeGenericMethod(taskReturnType) - .Invoke(null, new object[] { returnFunc, preAction, postAction, finalAction }); + .Invoke(null, new object?[] { returnFunc, preAction, postAction, finalAction })!; } [UsedImplicitly] diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/UserFriendlyException.cs b/framework/src/Volo.Abp.Core/Volo/Abp/UserFriendlyException.cs index 5adbe4db54..83640afd7b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/UserFriendlyException.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/UserFriendlyException.cs @@ -12,9 +12,9 @@ public class UserFriendlyException : BusinessException, IUserFriendlyException { public UserFriendlyException( string message, - string code = null, - string details = null, - Exception innerException = null, + string? code = null, + string? details = null, + Exception? innerException = null, LogLevel logLevel = LogLevel.Warning) : base( code, diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs index b8bbfbbd7c..c20b1ea729 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicMaxLengthAttribute.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.Validation; public class DynamicMaxLengthAttribute : MaxLengthAttribute { - private static readonly FieldInfo MaximumLengthField; + private static readonly FieldInfo? MaximumLengthField; static DynamicMaxLengthAttribute() { @@ -21,7 +21,7 @@ public class DynamicMaxLengthAttribute : MaxLengthAttribute public DynamicMaxLengthAttribute( [NotNull] Type sourceType, - [CanBeNull] string maximumLengthPropertyName) + string? maximumLengthPropertyName) { Check.NotNull(sourceType, nameof(sourceType)); @@ -32,7 +32,7 @@ public class DynamicMaxLengthAttribute : MaxLengthAttribute BindingFlags.Static | BindingFlags.Public ); Debug.Assert(maximumLengthProperty != null, nameof(maximumLengthProperty) + " != null"); - MaximumLengthField.SetValue(this, (int)maximumLengthProperty.GetValue(null)); + MaximumLengthField?.SetValue(this, (int)maximumLengthProperty?.GetValue(null)!); } } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs index 7b30da692a..64b25eda65 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicRangeAttribute.cs @@ -8,8 +8,8 @@ namespace Volo.Abp.Validation; public class DynamicRangeAttribute : RangeAttribute { - private static readonly FieldInfo MaximumField; - private static readonly FieldInfo MinimumField; + private static readonly FieldInfo? MaximumField; + private static readonly FieldInfo? MinimumField; static DynamicRangeAttribute() { @@ -33,8 +33,8 @@ public class DynamicRangeAttribute : RangeAttribute public DynamicRangeAttribute( [NotNull] Type sourceType, [NotNull] Type operandType, - [CanBeNull] string minimumPropertyName, - [CanBeNull] string maximumPropertyName + string? minimumPropertyName, + string? maximumPropertyName ) : base(operandType, string.Empty, string.Empty) { @@ -47,7 +47,7 @@ public class DynamicRangeAttribute : RangeAttribute BindingFlags.Static | BindingFlags.Public ); Debug.Assert(minimumProperty != null, nameof(minimumProperty) + " != null"); - MinimumField.SetValue(this, minimumProperty.GetValue(null)); + MinimumField?.SetValue(this, minimumProperty?.GetValue(null)); } if (maximumPropertyName != null) @@ -57,7 +57,7 @@ public class DynamicRangeAttribute : RangeAttribute BindingFlags.Static | BindingFlags.Public ); Debug.Assert(maximumProperty != null, nameof(maximumProperty) + " != null"); - MaximumField.SetValue(this, maximumProperty.GetValue(null)); + MaximumField?.SetValue(this, maximumProperty?.GetValue(null)); } } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs index bdb8525a03..5f1b0d1214 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Validation/DynamicStringLengthAttribute.cs @@ -12,7 +12,7 @@ namespace Volo.Abp.Validation; /// public class DynamicStringLengthAttribute : StringLengthAttribute { - private static readonly FieldInfo MaximumLengthField; + private static readonly FieldInfo? MaximumLengthField; static DynamicStringLengthAttribute() { @@ -28,8 +28,8 @@ public class DynamicStringLengthAttribute : StringLengthAttribute /// The name of the public static property for the public DynamicStringLengthAttribute( [NotNull] Type sourceType, - [CanBeNull] string maximumLengthPropertyName, - [CanBeNull] string minimumLengthPropertyName = null) + string? maximumLengthPropertyName, + string? minimumLengthPropertyName = null) : base(0) { Check.NotNull(sourceType, nameof(sourceType)); @@ -41,7 +41,7 @@ public class DynamicStringLengthAttribute : StringLengthAttribute BindingFlags.Static | BindingFlags.Public ); Debug.Assert(maximumLengthProperty != null, nameof(maximumLengthProperty) + " != null"); - MaximumLengthField.SetValue(this, (int)maximumLengthProperty.GetValue(null)); + MaximumLengthField?.SetValue(this, (int)maximumLengthProperty?.GetValue(null)!); } if (minimumLengthPropertyName != null) @@ -51,7 +51,7 @@ public class DynamicStringLengthAttribute : StringLengthAttribute BindingFlags.Static | BindingFlags.Public ); Debug.Assert(minimumLengthProperty != null, nameof(minimumLengthProperty) + " != null"); - MinimumLength = (int)minimumLengthProperty.GetValue(null); + MinimumLength = (int)minimumLengthProperty?.GetValue(null)!; } } } diff --git a/framework/src/Volo.Abp.Http.Abstractions/Volo/Abp/Http/ClientProxyExceptionEventData.cs b/framework/src/Volo.Abp.Http.Abstractions/Volo/Abp/Http/ClientProxyExceptionEventData.cs new file mode 100644 index 0000000000..1bc17c7b65 --- /dev/null +++ b/framework/src/Volo.Abp.Http.Abstractions/Volo/Abp/Http/ClientProxyExceptionEventData.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.Http; + +public class ClientProxyExceptionEventData +{ + public int? StatusCode { get; set; } + + public string ReasonPhrase { get; set; } +} diff --git a/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj b/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj index 26708da6b7..0b4e3ad76f 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj +++ b/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj @@ -20,6 +20,7 @@ + diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs index a164f9587e..dc14ee4203 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Castle; +using Volo.Abp.EventBus; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.Threading; @@ -17,7 +18,8 @@ namespace Volo.Abp.Http.Client; typeof(AbpMultiTenancyModule), typeof(AbpValidationModule), typeof(AbpExceptionHandlingModule), - typeof(AbpRemoteServicesModule) + typeof(AbpRemoteServicesModule), + typeof(AbpEventBusModule) )] public class AbpHttpClientModule : AbpModule { diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs index 8c0ab4f538..5c1d893bfd 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -10,6 +10,7 @@ using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; using Volo.Abp.Content; using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Local; using Volo.Abp.Http.Client.Authentication; using Volo.Abp.Http.Client.Proxying; using Volo.Abp.Http.Modeling; @@ -39,6 +40,7 @@ public class ClientProxyBase : ITransientDependency protected ClientProxyRequestPayloadBuilder ClientProxyRequestPayloadBuilder => LazyServiceProvider.LazyGetRequiredService(); protected ClientProxyUrlBuilder ClientProxyUrlBuilder => LazyServiceProvider.LazyGetRequiredService(); protected ICurrentApiVersionInfo CurrentApiVersionInfo => LazyServiceProvider.LazyGetRequiredService(); + protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService(); protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue arguments = null) { @@ -66,7 +68,7 @@ public class ClientProxyBase : ITransientDependency var actionArguments = action.Parameters.GroupBy(x => x.NameOnMethod).ToList(); if (action.SupportedVersions.Any()) - { + { //TODO: make names configurable actionArguments.RemoveAll(x => x.Key == "api-version" || x.Key == "apiVersion"); } @@ -216,6 +218,12 @@ public class ClientProxyBase : ITransientDependency protected virtual async Task ThrowExceptionForResponseAsync(HttpResponseMessage response) { + await LocalEventBus.PublishAsync(new ClientProxyExceptionEventData() + { + StatusCode = (int?)response?.StatusCode, + ReasonPhrase = response?.ReasonPhrase + }); + if (response.Headers.Contains(AbpHttpConsts.AbpErrorFormat)) { RemoteServiceErrorResponse errorResponse; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs index 55302dde61..8e8ac6c694 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs @@ -145,6 +145,7 @@ public class MyProjectNameWebModule : AbpModule .AddCookie("Cookies", options => { options.ExpireTimeSpan = TimeSpan.FromDays(365); + options.CheckTokenExpiration(); }) .AddAbpOpenIdConnect("oidc", options => { @@ -232,7 +233,7 @@ public class MyProjectNameWebModule : AbpModule dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys"); } } - + private void ConfigureDistributedLocking( ServiceConfigurationContext context, IConfiguration configuration)