From e5f1812e4405da127bef17180e08fe3c8e2d2c84 Mon Sep 17 00:00:00 2001 From: Mladen Macanovic Date: Fri, 2 Oct 2020 11:05:28 +0200 Subject: [PATCH 1/5] Formating settings for ABP solution based on the default C# settings --- framework/.editorconfig | 131 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 framework/.editorconfig diff --git a/framework/.editorconfig b/framework/.editorconfig new file mode 100644 index 0000000000..9f20b90112 --- /dev/null +++ b/framework/.editorconfig @@ -0,0 +1,131 @@ +# Rules in this file were initially inferred by Visual Studio IntelliCode from the D:\Projects\Volosoft\abp\framework codebase based on best match to current usage at 2.10.2020. +# You can modify the rules from these initially generated values to suit your own policies +# You can learn more about editorconfig here: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference +[*.cs] + + +#Core editorconfig formatting - indentation + +#use soft tabs (spaces) for indentation +indent_style = space + +#Formatting - indentation options + +#indent switch case contents. +csharp_indent_case_contents = true +#indent switch labels +csharp_indent_switch_labels = true + +#Formatting - new line options + +#place catch statements on a new line +csharp_new_line_before_catch = true +#place else statements on a new line +csharp_new_line_before_else = true +#require members of object intializers to be on separate lines +csharp_new_line_before_members_in_object_initializers = true +#require braces to be on a new line for accessors, methods, lambdas, object_collection_array_initializers, control_blocks, types, and properties (also known as "Allman" style) +csharp_new_line_before_open_brace = accessors, methods, lambdas, object_collection_array_initializers, control_blocks, types, properties + +#Formatting - organize using options + +#sort System.* using directives alphabetically, and place them before other usings +dotnet_sort_system_directives_first = true + +#Formatting - spacing options + +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +#Formatting - wrapping options + +#leave code block on single line +csharp_preserve_single_line_blocks = true + +#Style - Code block preferences + +#prefer curly braces even for one line of code +csharp_prefer_braces = true:suggestion + +#Style - expression bodied member options + +#prefer block bodies for constructors +csharp_style_expression_bodied_constructors = false:suggestion +#prefer block bodies for methods +csharp_style_expression_bodied_methods = false:suggestion +#prefer expression-bodied members for properties +csharp_style_expression_bodied_properties = true:suggestion + +#Style - expression level options + +#prefer out variables to be declared inline in the argument list of a method call when possible +csharp_style_inlined_variable_declaration = true:suggestion +#prefer the language keyword for member access expressions, instead of the type name, for types that have a keyword to represent them +dotnet_style_predefined_type_for_member_access = true:suggestion + +#Style - Expression-level preferences + +#prefer default over default(T) +csharp_prefer_simple_default_expression = true:suggestion +#prefer objects to be initialized using object initializers when possible +dotnet_style_object_initializer = true:suggestion +#prefer inferred tuple element names +dotnet_style_prefer_inferred_tuple_names = true:suggestion + +#Style - implicit and explicit types + +#prefer var over explicit type in all cases, unless overridden by another code style rule +csharp_style_var_elsewhere = true:suggestion +#prefer var is used to declare variables with built-in system types such as int +csharp_style_var_for_built_in_types = true:suggestion +#prefer var when the type is already mentioned on the right-hand side of a declaration expression +csharp_style_var_when_type_is_apparent = true:suggestion + +#Style - language keyword and framework type options + +#prefer the language keyword for local variables, method parameters, and class members, instead of the type name, for types that have a keyword to represent them +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion + +#Style - modifier options + +#prefer accessibility modifiers to be declared except for public interface members. This will currently not differ from always and will act as future proofing for if C# adds default interface methods. +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion + +#Style - Modifier preferences + +#when this rule is set to a list of modifiers, prefer the specified ordering. +csharp_preferred_modifier_order = public,protected,private,virtual,async,static,override,readonly,abstract:suggestion + +#Style - Pattern matching + +#prefer pattern matching instead of is expression with type casts +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +#Style - qualification options + +#prefer fields not to be prefaced with this. or Me. in Visual Basic +dotnet_style_qualification_for_field = false:suggestion +#prefer methods not to be prefaced with this. or Me. in Visual Basic +dotnet_style_qualification_for_method = false:suggestion +#prefer properties not to be prefaced with this. or Me. in Visual Basic +dotnet_style_qualification_for_property = false:suggestion From 9d12427545c5754cb9f1960495434e44e05af35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 5 Oct 2020 12:09:57 +0300 Subject: [PATCH 2/5] Show message to the user instead of bottom error line. --- .gitignore | 1 + ...pWebAssemblyServiceCollectionExtensions.cs | 17 +++++ ...bpAspNetCoreComponentsWebAssemblyModule.cs | 9 +++ .../AbpExceptionHandlingLogger.cs | 70 +++++++++++++++++++ .../AbpExceptionHandlingLoggerProvider.cs | 38 ++++++++++ .../ServiceCollectionCommonExtensions.cs | 9 ++- .../wwwroot/index.html | 5 -- 7 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs diff --git a/.gitignore b/.gitignore index 5b47e32794..6e767c8f76 100644 --- a/.gitignore +++ b/.gitignore @@ -304,3 +304,4 @@ modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Logs/ /templates/app/angular/package-lock.json /modules/client-simulation/demo/Volo.ClientSimulation.Demo/package-lock.json abp-build-config.json +/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Test/ diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs new file mode 100644 index 0000000000..2f541265d1 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs @@ -0,0 +1,17 @@ +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Volo.Abp; + +namespace Microsoft.Extensions.DependencyInjection +{ + public static class AbpWebAssemblyServiceCollectionExtensions + { + public static WebAssemblyHostBuilder GetHostBuilder( + [NotNull] this IServiceCollection services) + { + Check.NotNull(services, nameof(services)); + + return services.GetSingletonInstance(); + } + } +} 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 db6109e55a..707952f7c4 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 @@ -1,4 +1,6 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling; using Volo.Abp.AspNetCore.Mvc.Client; using Volo.Abp.Http.Client; using Volo.Abp.Modularity; @@ -22,5 +24,12 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly }); }); } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services + .GetHostBuilder().Logging + .AddProvider(new AbpExceptionHandlingLoggerProvider(context.Services)); + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs new file mode 100644 index 0000000000..896031aaaf --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs @@ -0,0 +1,70 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling +{ + public class AbpExceptionHandlingLogger : ILogger, IDisposable + { + private readonly IServiceCollection _serviceCollection; + private IServiceScope _serviceScope; + private IUiMessageService _messageService; + + public AbpExceptionHandlingLogger(IServiceCollection serviceCollection) + { + _serviceCollection = serviceCollection; + } + + public void Log( + LogLevel logLevel, + EventId eventId, + TState state, + Exception exception, + Func formatter) + { + if (logLevel != LogLevel.Critical && logLevel != LogLevel.Error) + { + return; + } + + TryInitialize(); + + if (_messageService == null) + { + return; + } + + //TODO: handle exception types + _messageService.ErrorAsync( + exception?.Message ?? state?.ToString() ?? "Unknown error!" + ); + } + + private void TryInitialize() + { + var serviceProvider = _serviceCollection.GetServiceProviderOrNull(); + if (serviceProvider == null) + { + return; + } + + _serviceScope = serviceProvider.CreateScope(); + _messageService = _serviceScope.ServiceProvider.GetRequiredService(); + } + + public bool IsEnabled(LogLevel logLevel) + { + return logLevel == LogLevel.Critical || logLevel == LogLevel.Error; + } + + public IDisposable BeginScope(TState state) + { + return NullDisposable.Instance; + } + + public void Dispose() + { + _serviceScope?.Dispose(); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs new file mode 100644 index 0000000000..d295559284 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling +{ + public class AbpExceptionHandlingLoggerProvider : ILoggerProvider + { + private AbpExceptionHandlingLogger _logger; + private static readonly object SyncObj = new object(); + private readonly IServiceCollection _serviceCollection; + + public AbpExceptionHandlingLoggerProvider(IServiceCollection serviceCollection) + { + _serviceCollection = serviceCollection; + } + + public ILogger CreateLogger(string categoryName) + { + if (_logger == null) + { + lock (SyncObj) + { + if (_logger == null) + { + _logger = new AbpExceptionHandlingLogger(_serviceCollection); + } + } + } + + return _logger; + } + + public void Dispose() + { + _logger.Dispose(); + } + } +} 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 1b2d2c4652..88e73c67e8 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs @@ -24,7 +24,7 @@ namespace Microsoft.Extensions.DependencyInjection .FirstOrDefault(d => d.ServiceType == typeof(T)) ?.ImplementationInstance; } - + public static T GetSingletonInstance(this IServiceCollection services) { var service = services.GetSingletonInstanceOrNull(); @@ -165,5 +165,10 @@ namespace Microsoft.Extensions.DependencyInjection { return new Lazy(() => services.GetRequiredService(type), true); } + + public static IServiceProvider GetServiceProviderOrNull(this IServiceCollection services) + { + return services.GetObjectOrNull(); + } } -} \ No newline at end of file +} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html index 9edbaa4185..4566bec3c1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html @@ -19,11 +19,6 @@ Loading... -
- An unhandled error has occurred. - Reload - 🗙 -
From 7f94a4ed9fad8c15ac2b2eb4919326214fa5543a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 5 Oct 2020 12:31:08 +0300 Subject: [PATCH 3/5] Make Volo.Abp.BlazoriseUI Razor SDK --- framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj index f7875a0f4a..e3df9ee763 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj +++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj @@ -1,10 +1,11 @@ - + netstandard2.1 + 3.0 $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; false false From d294ba8cb8ccb2e877971808d94bb7b51017cff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 5 Oct 2020 13:35:06 +0300 Subject: [PATCH 4/5] Fix the solution structure problem for the Volo.Abp.BlazoriseUI package. --- .../{Volo/Abp/BlazoriseUI => }/AbpBlazoriseModule.cs | 0 .../{Volo/Abp/BlazoriseUI => }/AbpCrudPageBase.cs | 0 .../Abp/BlazoriseUI => }/BlazoriseUiNotificationService.cs | 0 .../src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj | 5 ----- 4 files changed, 5 deletions(-) rename framework/src/Volo.Abp.BlazoriseUI/{Volo/Abp/BlazoriseUI => }/AbpBlazoriseModule.cs (100%) rename framework/src/Volo.Abp.BlazoriseUI/{Volo/Abp/BlazoriseUI => }/AbpCrudPageBase.cs (100%) rename framework/src/Volo.Abp.BlazoriseUI/{Volo/Abp/BlazoriseUI => }/BlazoriseUiNotificationService.cs (100%) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo/Abp/BlazoriseUI/AbpBlazoriseModule.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseModule.cs similarity index 100% rename from framework/src/Volo.Abp.BlazoriseUI/Volo/Abp/BlazoriseUI/AbpBlazoriseModule.cs rename to framework/src/Volo.Abp.BlazoriseUI/AbpBlazoriseModule.cs diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo/Abp/BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs similarity index 100% rename from framework/src/Volo.Abp.BlazoriseUI/Volo/Abp/BlazoriseUI/AbpCrudPageBase.cs rename to framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo/Abp/BlazoriseUI/BlazoriseUiNotificationService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiNotificationService.cs similarity index 100% rename from framework/src/Volo.Abp.BlazoriseUI/Volo/Abp/BlazoriseUI/BlazoriseUiNotificationService.cs rename to framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiNotificationService.cs diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj index e3df9ee763..12628b1440 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj +++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj @@ -6,11 +6,6 @@ netstandard2.1 3.0 - $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; - false - false - false - From 97f07310dd8127eb8c8e97098c4b0738b51247b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 5 Oct 2020 14:17:01 +0300 Subject: [PATCH 5/5] Introduce UserExceptionInformer --- .../AbpExceptionHandlingLogger.cs | 26 +++++----- .../IUserExceptionInformer.cs | 10 ++++ .../UserExceptionInformer.cs | 47 +++++++++++++++++++ .../UserExceptionInformerContext.cs | 16 +++++++ .../Volo/Abp/Http/RemoteServiceErrorInfo.cs | 1 - 5 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs index 896031aaaf..445ccbaba0 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs @@ -8,20 +8,25 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling { private readonly IServiceCollection _serviceCollection; private IServiceScope _serviceScope; - private IUiMessageService _messageService; + private IUserExceptionInformer _userExceptionInformer; public AbpExceptionHandlingLogger(IServiceCollection serviceCollection) { _serviceCollection = serviceCollection; } - public void Log( + public virtual void Log( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { + if (exception == null) + { + return; + } + if (logLevel != LogLevel.Critical && logLevel != LogLevel.Error) { return; @@ -29,18 +34,15 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling TryInitialize(); - if (_messageService == null) + if (_userExceptionInformer == null) { return; } - //TODO: handle exception types - _messageService.ErrorAsync( - exception?.Message ?? state?.ToString() ?? "Unknown error!" - ); + _userExceptionInformer.InformAsync(new UserExceptionInformerContext(exception)); } - private void TryInitialize() + protected virtual void TryInitialize() { var serviceProvider = _serviceCollection.GetServiceProviderOrNull(); if (serviceProvider == null) @@ -49,20 +51,20 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling } _serviceScope = serviceProvider.CreateScope(); - _messageService = _serviceScope.ServiceProvider.GetRequiredService(); + _userExceptionInformer = _serviceScope.ServiceProvider.GetRequiredService(); } - public bool IsEnabled(LogLevel logLevel) + public virtual bool IsEnabled(LogLevel logLevel) { return logLevel == LogLevel.Critical || logLevel == LogLevel.Error; } - public IDisposable BeginScope(TState state) + public virtual IDisposable BeginScope(TState state) { return NullDisposable.Instance; } - public void Dispose() + public virtual void Dispose() { _serviceScope?.Dispose(); } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs new file mode 100644 index 0000000000..4399e706ec --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/IUserExceptionInformer.cs @@ -0,0 +1,10 @@ +using System; +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling +{ + public interface IUserExceptionInformer + { + Task InformAsync(UserExceptionInformerContext context); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs new file mode 100644 index 0000000000..067248d7e9 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformer.cs @@ -0,0 +1,47 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Validation; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling +{ + public class UserExceptionInformer : IUserExceptionInformer, ITransientDependency + { + private readonly IUiMessageService _messageService; + + public UserExceptionInformer(IUiMessageService messageService) + { + _messageService = messageService; + } + + public virtual async Task InformAsync(UserExceptionInformerContext context) + { + if (context.Exception is AbpRemoteCallException remoteCallException) + { + await InformAbpRemoteCallExceptionAsync(remoteCallException, context); + } + else if (context.Exception is AbpValidationException validationException) + { + await InformAbpValidationExceptionAsync(validationException, context); + } + } + + protected virtual async Task InformAbpRemoteCallExceptionAsync(AbpRemoteCallException exception, UserExceptionInformerContext context) + { + if (exception.Error.Details.IsNullOrEmpty()) + { + await _messageService.ErrorAsync(exception.Error.Message); + } + else + { + await _messageService.ErrorAsync(exception.Error.Details, exception.Error.Message); + } + } + + protected virtual async Task InformAbpValidationExceptionAsync(AbpValidationException exception, UserExceptionInformerContext context) + { + await _messageService.ErrorAsync(exception.Message); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs new file mode 100644 index 0000000000..d860467b12 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/UserExceptionInformerContext.cs @@ -0,0 +1,16 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling +{ + public class UserExceptionInformerContext + { + [NotNull] + public Exception Exception { get; } + + public UserExceptionInformerContext(Exception exception) + { + Exception = exception; + } + } +} diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs index 287b423c20..c54ba24405 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/RemoteServiceErrorInfo.cs @@ -1,6 +1,5 @@ using System; using System.Collections; -using System.Collections.Generic; namespace Volo.Abp.Http {