mirror of https://github.com/abpframework/abp.git
committed by
GitHub
16 changed files with 354 additions and 9 deletions
@ -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 |
|||
@ -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<WebAssemblyHostBuilder>(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,72 @@ |
|||
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 IUserExceptionInformer _userExceptionInformer; |
|||
|
|||
public AbpExceptionHandlingLogger(IServiceCollection serviceCollection) |
|||
{ |
|||
_serviceCollection = serviceCollection; |
|||
} |
|||
|
|||
public virtual void Log<TState>( |
|||
LogLevel logLevel, |
|||
EventId eventId, |
|||
TState state, |
|||
Exception exception, |
|||
Func<TState, Exception, string> formatter) |
|||
{ |
|||
if (exception == null) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
if (logLevel != LogLevel.Critical && logLevel != LogLevel.Error) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
TryInitialize(); |
|||
|
|||
if (_userExceptionInformer == null) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
_userExceptionInformer.InformAsync(new UserExceptionInformerContext(exception)); |
|||
} |
|||
|
|||
protected virtual void TryInitialize() |
|||
{ |
|||
var serviceProvider = _serviceCollection.GetServiceProviderOrNull(); |
|||
if (serviceProvider == null) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
_serviceScope = serviceProvider.CreateScope(); |
|||
_userExceptionInformer = _serviceScope.ServiceProvider.GetRequiredService<IUserExceptionInformer>(); |
|||
} |
|||
|
|||
public virtual bool IsEnabled(LogLevel logLevel) |
|||
{ |
|||
return logLevel == LogLevel.Critical || logLevel == LogLevel.Error; |
|||
} |
|||
|
|||
public virtual IDisposable BeginScope<TState>(TState state) |
|||
{ |
|||
return NullDisposable.Instance; |
|||
} |
|||
|
|||
public virtual void Dispose() |
|||
{ |
|||
_serviceScope?.Dispose(); |
|||
} |
|||
} |
|||
} |
|||
@ -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(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling |
|||
{ |
|||
public interface IUserExceptionInformer |
|||
{ |
|||
Task InformAsync(UserExceptionInformerContext context); |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue