From 462aeca7f0b64974e2c279ee5c1b6f1871f2295f Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Wed, 3 Nov 2021 23:53:12 +0800 Subject: [PATCH] use an abstract navigation seed interface --- .../Abp/UI/Navigation/AbpNavigationOptions.cs | 3 ++ .../UI/Navigation/INavigationDataSeeder.cs | 19 -------- .../Navigation/INavigationSeedContributor.cs | 14 ++++++ .../NavigationDataSeedContributor.cs | 43 +++++++++++++++---- .../UI/Navigation/NavigationSeedContext.cs | 20 +++++++++ .../Navigation/NavigationSeedContributor.cs | 10 +++++ .../UI/Navigation/NullNavigationDataSeeder.cs | 18 -------- .../AbpUINavigationVueVbenAdminModule.cs | 7 +++ ... VueVbenAdminNavigationSeedContributor.cs} | 11 ++--- 9 files changed, 93 insertions(+), 52 deletions(-) delete mode 100644 aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationDataSeeder.cs create mode 100644 aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationSeedContributor.cs create mode 100644 aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContext.cs create mode 100644 aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContributor.cs delete mode 100644 aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NullNavigationDataSeeder.cs rename aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/{AbpUINavigationVueVbenAdminDataSeeder.cs => VueVbenAdminNavigationSeedContributor.cs} (93%) diff --git a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/AbpNavigationOptions.cs b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/AbpNavigationOptions.cs index cac598435..eb99899a2 100644 --- a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/AbpNavigationOptions.cs +++ b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/AbpNavigationOptions.cs @@ -6,9 +6,12 @@ namespace LINGYUN.Abp.UI.Navigation { public ITypeList DefinitionProviders { get; } + public ITypeList NavigationSeedContributors { get; } + public AbpNavigationOptions() { DefinitionProviders = new TypeList(); + NavigationSeedContributors = new TypeList(); } } } diff --git a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationDataSeeder.cs b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationDataSeeder.cs deleted file mode 100644 index 67320c39e..000000000 --- a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationDataSeeder.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.MultiTenancy; - -namespace LINGYUN.Abp.UI.Navigation -{ - public interface INavigationDataSeeder - { - /// - /// - /// - /// 菜单列表 - /// 让用户自行决定是否过滤菜单 - /// - Task SeedAsync( - IReadOnlyCollection menus, - MultiTenancySides multiTenancySides = MultiTenancySides.Both); - } -} diff --git a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationSeedContributor.cs b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationSeedContributor.cs new file mode 100644 index 000000000..c86d80873 --- /dev/null +++ b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/INavigationSeedContributor.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; + +namespace LINGYUN.Abp.UI.Navigation +{ + public interface INavigationSeedContributor + { + /// + /// + /// + /// + /// + Task SeedAsync(NavigationSeedContext context); + } +} diff --git a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationDataSeedContributor.cs b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationDataSeedContributor.cs index d0eee9158..bbf48d6a7 100644 --- a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationDataSeedContributor.cs +++ b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationDataSeedContributor.cs @@ -1,4 +1,9 @@ -using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.MultiTenancy; @@ -7,32 +12,54 @@ namespace LINGYUN.Abp.UI.Navigation { public class NavigationDataSeedContributor : IDataSeedContributor, ITransientDependency { + private readonly IServiceProvider _serviceProvider; private readonly ICurrentTenant _currentTenant; private readonly INavigationProvider _navigationProvider; - private readonly INavigationDataSeeder _navigationDataSeeder; + + private readonly AbpNavigationOptions _options; + + public List Contributors => _lazyContributors.Value; + private readonly Lazy> _lazyContributors; public NavigationDataSeedContributor( + IServiceProvider serviceProvider, ICurrentTenant currentTenant, INavigationProvider navigationProvider, - INavigationDataSeeder navigationDataSeeder) + IOptions options) { + _serviceProvider = serviceProvider; _currentTenant = currentTenant; _navigationProvider = navigationProvider; - _navigationDataSeeder = navigationDataSeeder; + + _options = options.Value; + _lazyContributors = new Lazy>(CreateContributors); } public virtual async Task SeedAsync(DataSeedContext context) { - using(_currentTenant.Change(context.TenantId)) + using (_currentTenant.Change(context.TenantId)) { - var multiTenancySides = _currentTenant.Id.HasValue + var menus = await _navigationProvider.GetAllAsync(); + + var multiTenancySides = _currentTenant.IsAvailable ? MultiTenancySides.Tenant : MultiTenancySides.Host; - var menus = await _navigationProvider.GetAllAsync(); + var seedContext = new NavigationSeedContext(menus, multiTenancySides); - await _navigationDataSeeder.SeedAsync(menus, multiTenancySides); + foreach (var contributor in Contributors) + { + await contributor.SeedAsync(seedContext); + } } } + + private List CreateContributors() + { + return _options + .NavigationSeedContributors + .Select(type => _serviceProvider.GetRequiredService(type) as INavigationSeedContributor) + .ToList(); + } } } diff --git a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContext.cs b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContext.cs new file mode 100644 index 000000000..5540eb9fd --- /dev/null +++ b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContext.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.UI.Navigation +{ + public class NavigationSeedContext + { + public IReadOnlyCollection Menus { get; } + + public MultiTenancySides MultiTenancySides { get; } + + public NavigationSeedContext( + IReadOnlyCollection menus, + MultiTenancySides multiTenancySides = MultiTenancySides.Both) + { + Menus = menus; + MultiTenancySides = multiTenancySides; + } + } +} diff --git a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContributor.cs b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContributor.cs new file mode 100644 index 000000000..8749a1ab4 --- /dev/null +++ b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NavigationSeedContributor.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LINGYUN.Abp.UI.Navigation +{ + public abstract class NavigationSeedContributor : INavigationSeedContributor, ITransientDependency + { + public abstract Task SeedAsync(NavigationSeedContext context); + } +} diff --git a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NullNavigationDataSeeder.cs b/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NullNavigationDataSeeder.cs deleted file mode 100644 index ba7540997..000000000 --- a/aspnet-core/modules/navigation/LINGYUN.Abp.UI.Navigation/LINGYUN/Abp/UI/Navigation/NullNavigationDataSeeder.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace LINGYUN.Abp.UI.Navigation -{ - [Dependency(TryRegister = true)] - public class NullNavigationDataSeeder : INavigationDataSeeder, ISingletonDependency - { - public Task SeedAsync( - IReadOnlyCollection menus, - MultiTenancySides multiTenancySides = MultiTenancySides.Both) - { - return Task.CompletedTask; - } - } -} diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminModule.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminModule.cs index aabff877d..aa854e81d 100644 --- a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminModule.cs +++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminModule.cs @@ -8,5 +8,12 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin typeof(PlatformDomainModule))] public class AbpUINavigationVueVbenAdminModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.NavigationSeedContributors.Add(); + }); + } } } diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminDataSeeder.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/VueVbenAdminNavigationSeedContributor.cs similarity index 93% rename from aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminDataSeeder.cs rename to aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/VueVbenAdminNavigationSeedContributor.cs index 9c0709620..847725a89 100644 --- a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminDataSeeder.cs +++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/VueVbenAdminNavigationSeedContributor.cs @@ -9,14 +9,13 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; using ValueType = LINGYUN.Platform.Datas.ValueType; namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin { - public class AbpUINavigationVueVbenAdminDataSeeder : INavigationDataSeeder, ITransientDependency + public class VueVbenAdminNavigationSeedContributor : NavigationSeedContributor { private static int _lastCodeNumber = 0; protected ICurrentTenant CurrentTenant { get; } @@ -27,7 +26,7 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin protected ILayoutRepository LayoutRepository { get; } protected AbpUINavigationVueVbenAdminOptions Options { get; } - public AbpUINavigationVueVbenAdminDataSeeder( + public VueVbenAdminNavigationSeedContributor( ICurrentTenant currentTenant, IRouteDataSeeder routeDataSeeder, IMenuRepository menuRepository, @@ -46,9 +45,7 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin Options = options.Value; } - public virtual async Task SeedAsync( - IReadOnlyCollection menus, - MultiTenancySides multiTenancySides = MultiTenancySides.Both) + public override async Task SeedAsync(NavigationSeedContext context) { var uiDataItem = await SeedUIFrameworkDataAsync(CurrentTenant.Id); @@ -63,7 +60,7 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin Interlocked.Exchange(ref _lastCodeNumber, _lastNumber); } - await SeedDefinitionMenusAsync(layout, layoutData, menus, multiTenancySides); + await SeedDefinitionMenusAsync(layout, layoutData, context.Menus, context.MultiTenancySides); } private async Task SeedDefinitionMenusAsync(