From 08aba25c368c9c94e5e42f2df634812e725345f6 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 29 May 2025 13:24:59 +0800 Subject: [PATCH] Log exception of `ReflectionTypeLoadException`. --- .../ServiceCollectionLoggingExtensions.cs | 4 ++- .../ConventionalRegistrarBase.cs | 33 ++++++++++++++----- .../InternalServiceCollectionExtensions.cs | 4 +-- .../Volo/Abp/Reflection/AssemblyHelper.cs | 9 +---- .../Volo/Abp/Reflection/TypeFinder.cs | 15 +++++++-- .../Volo/Abp/Reflection/TypeFinder_Tests.cs | 3 +- 6 files changed, 46 insertions(+), 22 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs index be365df686..be906c9e74 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionLoggingExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Logging; namespace Microsoft.Extensions.DependencyInjection; @@ -7,6 +8,7 @@ public static class ServiceCollectionLoggingExtensions { public static ILogger GetInitLogger(this IServiceCollection services) { - return services.GetSingletonInstance().Create(); + var loggerFactory = services.GetSingletonInstanceOrNull(); + return loggerFactory == null ? NullLogger.Instance : loggerFactory.Create(); } } 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 6d1c345840..d9fae16e16 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ConventionalRegistrarBase.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Volo.Abp.Reflection; namespace Volo.Abp.DependencyInjection; @@ -11,14 +12,30 @@ public abstract class ConventionalRegistrarBase : IConventionalRegistrar { public virtual void AddAssembly(IServiceCollection services, Assembly assembly) { - var types = AssemblyHelper - .GetAllTypes(assembly) - .Where( - type => type != null && - type.IsClass && - !type.IsAbstract && - !type.IsGenericType - ).ToArray(); + var logger = services.GetInitLogger(); + var types = Array.Empty(); + + try + { + types = AssemblyHelper + .GetAllTypes(assembly) + .Where( + type => type != null && + type.IsClass && + !type.IsAbstract && + !type.IsGenericType + ).ToArray(); + } + catch (ReflectionTypeLoadException e) + { + types = e.Types.Select(x => x!).ToArray(); + logger.LogException(e); + } + catch (Exception e) + { + //TODO: Trigger a global event? + logger.LogException(e); + } AddTypes(services, types); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs index 3f638defe8..be28f569ea 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs @@ -23,7 +23,6 @@ internal static class InternalServiceCollectionExtensions { var moduleLoader = new ModuleLoader(); var assemblyFinder = new AssemblyFinder(abpApplication); - var typeFinder = new TypeFinder(assemblyFinder); if (!services.IsAdded()) { @@ -36,8 +35,9 @@ internal static class InternalServiceCollectionExtensions services.TryAddSingleton(moduleLoader); services.TryAddSingleton(assemblyFinder); - services.TryAddSingleton(typeFinder); services.TryAddSingleton(new DefaultInitLoggerFactory()); + var typeFinder = new TypeFinder(services.GetInitLogger(), assemblyFinder); + services.TryAddSingleton(typeFinder); services.AddAssemblyOf(); 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 8e71f011fe..040159dcc8 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/AssemblyHelper.cs @@ -25,13 +25,6 @@ internal static class AssemblyHelper public static IReadOnlyList GetAllTypes(Assembly assembly) { - try - { - return assembly.GetTypes(); - } - catch (ReflectionTypeLoadException ex) - { - return ex.Types!; - } + return assembly.GetTypes(); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs index c7350cde18..c4b52604d6 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/TypeFinder.cs @@ -1,19 +1,24 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Threading; +using Microsoft.Extensions.Logging; namespace Volo.Abp.Reflection; public class TypeFinder : ITypeFinder { + private readonly ILogger _logger; + private readonly IAssemblyFinder _assemblyFinder; private readonly Lazy> _types; - public TypeFinder(IAssemblyFinder assemblyFinder) + public TypeFinder(ILogger logger, IAssemblyFinder assemblyFinder) { _assemblyFinder = assemblyFinder; + _logger = logger; _types = new Lazy>(FindAll, LazyThreadSafetyMode.ExecutionAndPublication); } @@ -37,9 +42,15 @@ public class TypeFinder : ITypeFinder allTypes.AddRange(typesInThisAssembly.Where(type => type != null)); } - catch + catch (ReflectionTypeLoadException e) + { + allTypes = e.Types.Select(x => x!).ToList(); + _logger.LogException(e); + } + catch (Exception e) { //TODO: Trigger a global event? + _logger.LogException(e); } } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs index 480352d69c..4884f07d16 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/TypeFinder_Tests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Reflection; +using Microsoft.Extensions.Logging.Abstractions; using NSubstitute; using Shouldly; using Xunit; @@ -21,7 +22,7 @@ public class TypeFinder_Tests //Act - var typeFinder = new TypeFinder(fakeAssemblyFinder); + var typeFinder = new TypeFinder(NullLogger.Instance, fakeAssemblyFinder); //Assert