diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs index dc1923f180..47a0d570bf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpComponentBase.cs @@ -168,6 +168,11 @@ public abstract class AbpComponentBase : OwningComponentBase protected virtual async Task HandleErrorAsync(Exception exception) { + if (IsDisposed) + { + return; + } + Logger.LogException(exception); await InvokeAsync(async () => { diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 0e93bb7ec6..c9b5984843 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -227,18 +227,16 @@ public class AbpAspNetCoreMvcModule : AbpModule return; } - //Plugin modules - var moduleAssemblies = context - .ServiceProvider - .GetRequiredService() + var moduleContainer = context.ServiceProvider.GetRequiredService(); + + var plugInModuleAssemblies = moduleContainer .Modules .Where(m => m.IsLoadedAsPlugIn) .SelectMany(m => m.AllAssemblies) .Distinct(); - AddToApplicationParts(partManager, moduleAssemblies); + AddToApplicationParts(partManager, plugInModuleAssemblies); - //Controllers for application services var controllerAssemblies = context .ServiceProvider .GetRequiredService>() @@ -249,6 +247,13 @@ public class AbpAspNetCoreMvcModule : AbpModule .Distinct(); AddToApplicationParts(partManager, controllerAssemblies); + + var additionalAssemblies = moduleContainer + .Modules + .SelectMany(m => m.GetAdditionalAssemblies()) + .Distinct(); + + AddToApplicationParts(partManager, additionalAssemblies); } private static void AddToApplicationParts(ApplicationPartManager partManager, IEnumerable moduleAssemblies) diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index 3bcc507e39..f476ecad89 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -215,9 +215,9 @@ public abstract class AbpCrudPageBase< protected async override Task OnInitializedAsync() { - await SetPermissionsAsync(); - await SetEntityActionsAsync(); - await SetTableColumnsAsync(); + await TrySetPermissionsAsync(); + await TrySetEntityActionsAsync(); + await TrySetTableColumnsAsync(); await InvokeAsync(StateHasChanged); } @@ -231,7 +231,15 @@ public abstract class AbpCrudPageBase< await base.OnAfterRenderAsync(firstRender); } + private async Task TrySetPermissionsAsync() + { + if (IsDisposed) + { + return; + } + await SetPermissionsAsync(); + } protected virtual async Task SetPermissionsAsync() { @@ -579,13 +587,34 @@ public abstract class AbpCrudPageBase< return ValueTask.CompletedTask; } + private async ValueTask TrySetEntityActionsAsync() + { + if (IsDisposed) + { + return; + } + + await SetEntityActionsAsync(); + } + protected virtual ValueTask SetEntityActionsAsync() { return ValueTask.CompletedTask; } + + private async ValueTask TrySetTableColumnsAsync() + { + if (IsDisposed) + { + return; + } + + await SetTableColumnsAsync(); + } protected virtual ValueTask SetTableColumnsAsync() { + return ValueTask.CompletedTask; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleDescriptor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleDescriptor.cs index d10e858377..9bcb7d6a06 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleDescriptor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleDescriptor.cs @@ -12,7 +12,7 @@ public class AbpModuleDescriptor : IAbpModuleDescriptor public Assembly Assembly { get; } - public List AllAssemblies { get; } + public Assembly[] AllAssemblies { get; } public IAbpModule Instance { get; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleDescriptorExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleDescriptorExtensions.cs new file mode 100644 index 0000000000..d2e719efb0 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleDescriptorExtensions.cs @@ -0,0 +1,15 @@ +using System; +using System.Linq; +using System.Reflection; + +namespace Volo.Abp.Modularity; + +public static class AbpModuleDescriptorExtensions +{ + public static Assembly[] GetAdditionalAssemblies(this IAbpModuleDescriptor module) + { + return module.AllAssemblies.Length <= 1 + ? Array.Empty() + : module.AllAssemblies.Where(x => x != module.Assembly).ToArray(); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleHelper.cs index 8336433994..eb72664444 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModuleHelper.cs @@ -37,7 +37,7 @@ internal static class AbpModuleHelper return dependencies; } - public static List GetAllAssemblies(Type moduleType) + public static Assembly[] GetAllAssemblies(Type moduleType) { var assemblies = new List(); @@ -55,7 +55,7 @@ internal static class AbpModuleHelper assemblies.Add(moduleType.Assembly); - return assemblies; + return assemblies.ToArray(); } private static void AddModuleAndDependenciesRecursively( diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModuleDescriptor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModuleDescriptor.cs index 472009bfb3..8690baa33d 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModuleDescriptor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModuleDescriptor.cs @@ -21,7 +21,7 @@ public interface IAbpModuleDescriptor /// Includes the main and other assemblies defined /// on the module using the attribute. /// - List AllAssemblies { get; } + Assembly[] AllAssemblies { get; } /// /// The instance of the module class (singleton). @@ -38,4 +38,4 @@ public interface IAbpModuleDescriptor /// A module can depend on another module using the attribute. /// IReadOnlyList Dependencies { get; } -} +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs index d06025302d..941465b814 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs @@ -22,7 +22,7 @@ public class ModuleLoader_Tests modules[0].Type.ShouldBe(typeof(IndependentEmptyModule)); modules[1].Type.ShouldBe(typeof(MyStartupModule)); modules[1].Assembly.ShouldBe(typeof(MyStartupModule).Assembly); - modules[1].AllAssemblies.Count.ShouldBe(2); + modules[1].AllAssemblies.Length.ShouldBe(2); modules[1].AllAssemblies[0].ShouldBe(typeof(IAbpApplication).Assembly); modules[1].AllAssemblies[1].ShouldBe(typeof(MyStartupModule).Assembly); } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/AssemblyFinder_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/AssemblyFinder_Tests.cs index f3086dcb8c..edf44d5338 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/AssemblyFinder_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Reflection/AssemblyFinder_Tests.cs @@ -51,7 +51,7 @@ public class AssemblyFinder_Tests { var moduleDescriptor = Substitute.For(); moduleDescriptor.Type.Returns(moduleType); - moduleDescriptor.AllAssemblies.Returns(new List { moduleType.Assembly }); + moduleDescriptor.AllAssemblies.Returns(new [] { moduleType.Assembly }); return moduleDescriptor; } }