From 1b3b596eb0118dfc7b37b7cbbf47f08a378bea81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 13 Aug 2020 18:11:19 +0300 Subject: [PATCH 01/11] Added "features" to the CMS kit and implemented on the EF Core layer. --- .../FeatureConfigurer.cs | 10 ++++ .../Volo.CmsKit.Host.Shared.csproj | 4 ++ .../CmsKitHttpApiHostModule.cs | 7 ++- ...itHttpApiHostMigrationsDbContextFactory.cs | 2 + .../CmsKitIdentityServerModule.cs | 9 ++- ...ityServerHostMigrationsDbContextFactory.cs | 2 + .../CmsKitWebHostModule.cs | 4 +- .../CmsKitWebUnifiedModule.cs | 5 ++ .../UnifiedDbContextFactory.cs | 2 + .../Volo/CmsKit/CmsKitFeatures.cs | 56 +++++++++++++++++++ .../Volo/CmsKit/GlobalFeatures.cs | 42 ++++++++++++++ .../Comments/EfCoreCommentRepository.cs | 3 +- .../EntityFrameworkCore/CmsKitDbContext.cs | 9 --- .../CmsKitDbContextModelCreatingExtensions.cs | 48 +++++++++------- .../EntityFrameworkCore/ICmsKitDbContext.cs | 11 +--- .../Comments/CommentPublicAppService_Tests.cs | 11 ++-- .../ReactionPublicAppService_Tests.cs | 9 +-- .../Reactions/ReactionManager_Tests.cs | 2 +- .../CmsKitTestBaseModule.cs | 2 + 19 files changed, 179 insertions(+), 59 deletions(-) create mode 100644 modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs new file mode 100644 index 0000000000..3d4d983f3b --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs @@ -0,0 +1,10 @@ +namespace Volo.CmsKit +{ + public static class FeatureConfigurer + { + public static void Configure() + { + CmsKitFeatures.EnableAll(); + } + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj index 3f8c167b98..c6a4484865 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj @@ -7,4 +7,8 @@ Volo.CmsKit + + + + diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs index c63d28081f..f1a9b8568f 100644 --- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/CmsKitHttpApiHostModule.cs @@ -52,6 +52,11 @@ namespace Volo.CmsKit { private const string DefaultCorsPolicyName = "Default"; + public override void PreConfigureServices(ServiceConfigurationContext context) + { + FeatureConfigurer.Configure(); + } + public override void ConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); @@ -163,7 +168,7 @@ namespace Volo.CmsKit app.UseCorrelationId(); app.UseVirtualFiles(); app.UseRouting(); - app.UseCors(DefaultCorsPolicyName); + app.UseCors(DefaultCorsPolicyName); app.UseAuthentication(); app.UseAbpClaimsMap(); if (MultiTenancyConsts.IsEnabled) diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/EntityFrameworkCore/CmsKitHttpApiHostMigrationsDbContextFactory.cs b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/EntityFrameworkCore/CmsKitHttpApiHostMigrationsDbContextFactory.cs index 3a6dbb47ad..dc19e09635 100644 --- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/EntityFrameworkCore/CmsKitHttpApiHostMigrationsDbContextFactory.cs +++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/EntityFrameworkCore/CmsKitHttpApiHostMigrationsDbContextFactory.cs @@ -9,6 +9,8 @@ namespace Volo.CmsKit.EntityFrameworkCore { public CmsKitHttpApiHostMigrationsDbContext CreateDbContext(string[] args) { + FeatureConfigurer.Configure(); + var configuration = BuildConfiguration(); var builder = new DbContextOptionsBuilder() diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs index faf90a3fc2..b9afe934a3 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/CmsKitIdentityServerModule.cs @@ -77,6 +77,11 @@ namespace Volo.CmsKit { private const string DefaultCorsPolicyName = "Default"; + public override void PreConfigureServices(ServiceConfigurationContext context) + { + FeatureConfigurer.Configure(); + } + public override void ConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); @@ -182,10 +187,10 @@ namespace Volo.CmsKit app.UseCorrelationId(); app.UseVirtualFiles(); app.UseRouting(); - app.UseCors(DefaultCorsPolicyName); + app.UseCors(DefaultCorsPolicyName); app.UseAuthentication(); app.UseJwtTokenMiddleware(); - + if (MultiTenancyConsts.IsEnabled) { app.UseMultiTenancy(); diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContextFactory.cs b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContextFactory.cs index f6e80d62ec..19402b80c1 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContextFactory.cs +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContextFactory.cs @@ -9,6 +9,8 @@ namespace Volo.CmsKit.EntityFrameworkCore { public IdentityServerHostMigrationsDbContext CreateDbContext(string[] args) { + FeatureConfigurer.Configure(); + var configuration = BuildConfiguration(); var builder = new DbContextOptionsBuilder() diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostModule.cs index 95946c54df..7587b075d0 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/CmsKitWebHostModule.cs @@ -65,6 +65,8 @@ namespace Volo.CmsKit { public override void PreConfigureServices(ServiceConfigurationContext context) { + FeatureConfigurer.Configure(); + context.Services.PreConfigure(options => { options.AddAssemblyResource( @@ -222,7 +224,7 @@ namespace Volo.CmsKit app.UseHttpsRedirection(); app.UseVirtualFiles(); app.UseRouting(); - app.UseAuthentication(); + app.UseAuthentication(); if (MultiTenancyConsts.IsEnabled) { diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index b1cd636ef0..08dadb3dd6 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -63,6 +63,11 @@ namespace Volo.CmsKit )] public class CmsKitWebUnifiedModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + FeatureConfigurer.Configure(); + } + public override void ConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContextFactory.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContextFactory.cs index f2c1d8a065..170e4dc688 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContextFactory.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContextFactory.cs @@ -9,6 +9,8 @@ namespace Volo.CmsKit.EntityFrameworkCore { public UnifiedDbContext CreateDbContext(string[] args) { + FeatureConfigurer.Configure(); + var configuration = BuildConfiguration(); var builder = new DbContextOptionsBuilder() diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs new file mode 100644 index 0000000000..6e9dff0011 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; + +namespace Volo.CmsKit +{ + public static class CmsKitFeatures + { + public const string NamePrefix = "CmsKit"; + + public static class Reactions + { + public const string Name = NamePrefix + ".Reactions"; + + public static bool IsEnabled + { + get => GlobalFeatures.IsEnabled(Name); + set => GlobalFeatures.SetEnabled(Name, value); + } + } + + public static class Comments + { + public const string Name = NamePrefix + ".Comments"; + + public static bool IsEnabled + { + get => GlobalFeatures.IsEnabled(Name); + set => GlobalFeatures.SetEnabled(Name, value); + } + } + + public static void EnableAll() + { + foreach (var featureName in GetAllNames()) + { + GlobalFeatures.Enable(featureName); + } + } + + public static void DisableAll() + { + foreach (var featureName in GetAllNames()) + { + GlobalFeatures.Disable(featureName); + } + } + + public static IEnumerable GetAllNames() + { + return new[] + { + Reactions.Name, + Comments.Name + }; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs new file mode 100644 index 0000000000..3c038431ca --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Volo.CmsKit +{ + internal static class GlobalFeatures //TODO: Move to the ABP Framework..? + { + private static readonly HashSet EnabledFeatures = new HashSet(); + + public static bool IsEnabled(string featureName) + { + return EnabledFeatures.Contains(featureName); + } + + public static void SetEnabled(string featureName, bool isEnabled) + { + if (isEnabled) + { + Enable(featureName); + } + else + { + Disable(featureName); + } + } + + public static void Enable(string featureName) + { + EnabledFeatures.AddIfNotContains(featureName); + } + + public static void Disable(string featureName) + { + EnabledFeatures.Remove(featureName); + } + + public static IEnumerable GetEnabledFeatures() + { + return EnabledFeatures; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs index 00b3150219..6a1b8d6a50 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Comments/EfCoreCommentRepository.cs @@ -8,6 +8,7 @@ using Volo.Abp; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.EntityFrameworkCore; +using Volo.CmsKit.Users; namespace Volo.CmsKit.Comments { @@ -27,7 +28,7 @@ namespace Volo.CmsKit.Comments Check.NotNullOrWhiteSpace(entityId, nameof(entityId)); var query = from comment in DbSet - join user in DbContext.CmsUsers on comment.CreatorId equals user.Id + join user in DbContext.Set() on comment.CreatorId equals user.Id where entityType == comment.EntityType && entityId == comment.EntityId orderby comment.CreationTime select new CommentWithAuthorQueryResultItem diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs index 8033522f70..65d9b55181 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs @@ -1,21 +1,12 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; -using Volo.CmsKit.Comments; -using Volo.CmsKit.Reactions; -using Volo.CmsKit.Users; namespace Volo.CmsKit.EntityFrameworkCore { [ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] public class CmsKitDbContext : AbpDbContext, ICmsKitDbContext { - public DbSet UserReactions { get; set; } - - public DbSet Comments { get; set; } - - public DbSet CmsUsers { get; set; } - public CmsKitDbContext(DbContextOptions options) : base(options) { diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index e945ddc7ed..d778f43f57 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -32,34 +32,40 @@ namespace Volo.CmsKit.EntityFrameworkCore b.ConfigureAbpUser(); }); - builder.Entity(b => + if (CmsKitFeatures.Reactions.IsEnabled) { - b.ToTable(options.TablePrefix + "UserReactions", options.Schema); - b.ConfigureByConvention(); + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "UserReactions", options.Schema); + b.ConfigureByConvention(); - b.Property(x => x.EntityType).IsRequired().HasMaxLength(UserReactionConsts.MaxEntityTypeLength); - b.Property(x => x.EntityId).IsRequired().HasMaxLength(UserReactionConsts.MaxEntityIdLength); - b.Property(x => x.ReactionName).IsRequired().HasMaxLength(UserReactionConsts.MaxReactionNameLength); - b.Property(x => x.CreationTime); + b.Property(x => x.EntityType).IsRequired().HasMaxLength(UserReactionConsts.MaxEntityTypeLength); + b.Property(x => x.EntityId).IsRequired().HasMaxLength(UserReactionConsts.MaxEntityIdLength); + b.Property(x => x.ReactionName).IsRequired().HasMaxLength(UserReactionConsts.MaxReactionNameLength); + b.Property(x => x.CreationTime); - b.HasIndex(x => new { x.EntityType, x.EntityId }); - b.HasIndex(x => new { x.CreatorId, x.EntityType, x.EntityId, x.ReactionName }); - }); + b.HasIndex(x => new { x.EntityType, x.EntityId }); + b.HasIndex(x => new { x.CreatorId, x.EntityType, x.EntityId, x.ReactionName }); + }); + } - builder.Entity(b => + if (CmsKitFeatures.Comments.IsEnabled) { - b.ToTable(options.TablePrefix + "Comments", options.Schema); - b.ConfigureByConvention(); + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "Comments", options.Schema); + b.ConfigureByConvention(); - b.Property(x => x.EntityType).IsRequired().HasMaxLength(CommentConsts.MaxEntityTypeLength); - b.Property(x => x.EntityId).IsRequired().HasMaxLength(CommentConsts.MaxEntityIdLength); - b.Property(x => x.Text).IsRequired().HasMaxLength(CommentConsts.MaxTextLength); - b.Property(x => x.RepliedCommentId); - b.Property(x => x.CreationTime); + b.Property(x => x.EntityType).IsRequired().HasMaxLength(CommentConsts.MaxEntityTypeLength); + b.Property(x => x.EntityId).IsRequired().HasMaxLength(CommentConsts.MaxEntityIdLength); + b.Property(x => x.Text).IsRequired().HasMaxLength(CommentConsts.MaxTextLength); + b.Property(x => x.RepliedCommentId); + b.Property(x => x.CreationTime); - b.HasIndex(x => new { x.EntityType, x.EntityId }); - b.HasIndex(x => new { x.RepliedCommentId }); - }); + b.HasIndex(x => new { x.EntityType, x.EntityId }); + b.HasIndex(x => new { x.RepliedCommentId }); + }); + } } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs index e63366d5ae..352335fb7c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/ICmsKitDbContext.cs @@ -1,19 +1,10 @@ -using Microsoft.EntityFrameworkCore; -using Volo.Abp.Data; +using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; -using Volo.CmsKit.Comments; -using Volo.CmsKit.Reactions; -using Volo.CmsKit.Users; namespace Volo.CmsKit.EntityFrameworkCore { [ConnectionStringName(CmsKitDbProperties.ConnectionStringName)] public interface ICmsKitDbContext : IEfCoreDbContext { - DbSet UserReactions { get; } - - DbSet Comments { get; } - - DbSet CmsUsers { get; set; } } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs index 9568f79c6f..f02339dde8 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs @@ -1,11 +1,8 @@ -using System; -using System.Linq; +using System.Linq; using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using NSubstitute; using Shouldly; -using Volo.Abp.MultiTenancy; using Volo.Abp.Users; using Volo.CmsKit.Public.Comments; using Xunit; @@ -54,7 +51,7 @@ namespace Volo.CmsKit.Comments UsingDbContext(context => { - var comments = context.Comments.Where(x => + var comments = context.Set().Where(x => x.EntityId == _cmsKitTestData.EntityId1 && x.EntityType == _cmsKitTestData.EntityType1).ToList(); comments @@ -75,7 +72,7 @@ namespace Volo.CmsKit.Comments UsingDbContext(context => { - var comment = context.Comments.Single(x => + var comment = context.Set().Single(x => x.Id == _cmsKitTestData.CommentWithChildId); comment.Text.ShouldBe("I'm Updated"); @@ -91,7 +88,7 @@ namespace Volo.CmsKit.Comments UsingDbContext(context => { - var comment = context.Comments.FirstOrDefault(x => + var comment = context.Set().FirstOrDefault(x => x.Id == _cmsKitTestData.CommentWithChildId); comment.ShouldBeNull(); diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Reactions/ReactionPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Reactions/ReactionPublicAppService_Tests.cs index dd74a1f1e7..615003efec 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Reactions/ReactionPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Reactions/ReactionPublicAppService_Tests.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using NSubstitute; @@ -69,7 +66,7 @@ namespace Volo.CmsKit.Reactions UsingDbContext(context => { - var reaction = context.UserReactions.FirstOrDefault(x => + var reaction = context.Set().FirstOrDefault(x => x.CreatorId == _cmsKitTestData.User1Id && x.ReactionName == StandardReactions.Hooray && x.EntityId == _cmsKitTestData.EntityId2 && @@ -93,7 +90,7 @@ namespace Volo.CmsKit.Reactions UsingDbContext(context => { - var reaction = context.UserReactions.FirstOrDefault(x => + var reaction = context.Set().FirstOrDefault(x => x.CreatorId == _cmsKitTestData.User1Id && x.ReactionName == StandardReactions.Confused && x.EntityId == _cmsKitTestData.EntityId1 && diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs index 6f4fe2425d..453d393bb8 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Reactions/ReactionManager_Tests.cs @@ -69,7 +69,7 @@ namespace Volo.CmsKit.Reactions UsingDbContext(context => { - var reaction = context.UserReactions.FirstOrDefault(x => + var reaction = context.Set().FirstOrDefault(x => x.CreatorId == _cmsKitTestData.User1Id && x.ReactionName == StandardReactions.Confused && x.EntityId == _cmsKitTestData.EntityId1 && diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs index ae1f0f7296..7451c755a8 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs @@ -18,6 +18,8 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { + CmsKitFeatures.EnableAll(); + context.Services.AddAlwaysAllowAuthorization(); } From 389d20c737e7fa3102e7f9b3fd9f25fbe8cd7089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 13 Aug 2020 22:57:51 +0300 Subject: [PATCH 02/11] Implement basic GlobalFeatureManager. --- .../FeatureConfigurer.cs | 6 +- .../Volo/Abp/GlobalFeatures/GlobalFeature.cs | 36 ++++++++++++ .../GlobalFeatures/GlobalFeatureManager.cs | 54 ++++++++++++++++++ .../GlobalFeatureManagerCmsKitConfigurator.cs | 12 ++++ ...tureManagerCmsKitConfiguratorExtensions.cs | 52 +++++++++++++++++ .../GlobalFeatureManagerExtensions.cs | 18 ++++++ .../GlobalFeatureManagerModuleConfigurator.cs | 36 ++++++++++++ ...nagerModuleConfiguratorCmsKitExtensions.cs | 30 ++++++++++ ...GlobalFeatureManagerModulesConfigurator.cs | 19 +++++++ .../Volo/CmsKit/CmsKitDomainSharedModule.cs | 17 +++++- .../Volo/CmsKit/CmsKitFeatures.cs | 56 ------------------- .../Volo/CmsKit/GlobalFeatures.cs | 42 -------------- .../CmsKitDbContextModelCreatingExtensions.cs | 5 +- .../CmsKitTestBaseModule.cs | 3 +- 14 files changed, 282 insertions(+), 104 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs index 3d4d983f3b..162fa7cf51 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs @@ -1,10 +1,12 @@ -namespace Volo.CmsKit +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit { public static class FeatureConfigurer { public static void Configure() { - CmsKitFeatures.EnableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs new file mode 100644 index 0000000000..4221b635c0 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs @@ -0,0 +1,36 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeature + { + public GlobalFeatureManagerModuleConfigurator ModuleConfigurator { get; } + + public string Name { get; } + + public bool IsEnabled => ModuleConfigurator.ModulesConfigurator.FeatureManager.IsEnabled(Name); + + public GlobalFeature( + [NotNull] GlobalFeatureManagerModuleConfigurator moduleConfigurator, + [NotNull] string name) + { + ModuleConfigurator = Check.NotNull(moduleConfigurator, nameof(moduleConfigurator)); + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } + + public virtual void Enable() + { + ModuleConfigurator.ModulesConfigurator.FeatureManager.Enable(Name); + } + + public virtual void Disable() + { + ModuleConfigurator.ModulesConfigurator.FeatureManager.Disable(Name); + } + + public virtual void SetEnabled(bool isEnabled) + { + ModuleConfigurator.ModulesConfigurator.FeatureManager.SetEnabled(Name, isEnabled); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs new file mode 100644 index 0000000000..bed947e4a8 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs @@ -0,0 +1,54 @@ +using System.Collections.Concurrent; +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureManager //TODO: Move to the ABP Framework..? //rename? + { + public static GlobalFeatureManager Instance { get; protected set; } = new GlobalFeatureManager(); + + [NotNull] + public ConcurrentDictionary Configuration { get; } + + protected HashSet EnabledFeatures { get; } + + private GlobalFeatureManager() + { + EnabledFeatures = new HashSet(); + Configuration = new ConcurrentDictionary(); + } + + public virtual bool IsEnabled(string featureName) + { + return EnabledFeatures.Contains(featureName); + } + + public virtual void SetEnabled(string featureName, bool isEnabled) + { + if (isEnabled) + { + Enable(featureName); + } + else + { + Disable(featureName); + } + } + + public virtual void Enable(string featureName) + { + EnabledFeatures.AddIfNotContains(featureName); + } + + public virtual void Disable(string featureName) + { + EnabledFeatures.Remove(featureName); + } + + public virtual IEnumerable GetEnabledFeatures() + { + return EnabledFeatures; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs new file mode 100644 index 0000000000..c3a1183866 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureManagerCmsKitConfigurator : GlobalFeatureManagerModuleConfigurator + { + public GlobalFeatureManagerCmsKitConfigurator(GlobalFeatureManagerModulesConfigurator modulesConfigurator) + : base(modulesConfigurator) + { + this.Reactions(); + this.Comments(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs new file mode 100644 index 0000000000..4175271f0b --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs @@ -0,0 +1,52 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public static class GlobalFeatureManagerCmsKitConfiguratorExtensions + { + public static GlobalFeature Reactions( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + return cmsKitConfigurator + .Features + .GetOrAdd("Reactions", _ => new GlobalFeature(cmsKitConfigurator, "CmsKit:Reactions")) + as GlobalFeature; + } + + public static GlobalFeatureManagerCmsKitConfigurator Reactions( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator, + [NotNull] Action configureAction) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + configureAction(cmsKitConfigurator.Reactions()); + + return cmsKitConfigurator; + } + + public static GlobalFeature Comments( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + return cmsKitConfigurator + .Features + .GetOrAdd("Comments", _ => new GlobalFeature(cmsKitConfigurator, "CmsKit:Comments")) + as GlobalFeature; + } + + public static GlobalFeatureManagerCmsKitConfigurator Comments( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator, + [NotNull] Action configureAction) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + configureAction(cmsKitConfigurator.Comments()); + + return cmsKitConfigurator; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs new file mode 100644 index 0000000000..9f148fcef9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public static class GlobalFeatureManagerExtensions + { + public static GlobalFeatureManagerModulesConfigurator Modules( + [NotNull] this GlobalFeatureManager featureManager) + { + Check.NotNull(featureManager, nameof(featureManager)); + + return featureManager + .Configuration + .GetOrAdd("_Modules", _ => new GlobalFeatureManagerModulesConfigurator(featureManager)) + as GlobalFeatureManagerModulesConfigurator; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs new file mode 100644 index 0000000000..1c9ff9ae7c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs @@ -0,0 +1,36 @@ +using System.Collections.Concurrent; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public abstract class GlobalFeatureManagerModuleConfigurator + { + [NotNull] + public GlobalFeatureManagerModulesConfigurator ModulesConfigurator { get; } + + [NotNull] + public ConcurrentDictionary Features { get; } + + protected GlobalFeatureManagerModuleConfigurator(GlobalFeatureManagerModulesConfigurator modulesConfigurator) + { + ModulesConfigurator = Check.NotNull(modulesConfigurator, nameof(modulesConfigurator)); + Features = new ConcurrentDictionary(); + } + + public virtual void EnableAll() + { + foreach (var feature in Features.Values) + { + feature.Enable(); + } + } + + public virtual void DisableAll() + { + foreach (var feature in Features.Values) + { + feature.Disable(); + } + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs new file mode 100644 index 0000000000..9449ef702c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs @@ -0,0 +1,30 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public static class GlobalFeatureManagerModuleConfiguratorCmsKitExtensions + { + public static GlobalFeatureManagerCmsKitConfigurator CmsKit( + [NotNull] this GlobalFeatureManagerModulesConfigurator modulesConfigurator) + { + Check.NotNull(modulesConfigurator, nameof(modulesConfigurator)); + + return modulesConfigurator + .Modules + .GetOrAdd("CmsKit", _ => new GlobalFeatureManagerCmsKitConfigurator(modulesConfigurator)) + as GlobalFeatureManagerCmsKitConfigurator; + } + + public static GlobalFeatureManagerModulesConfigurator CmsKit( + [NotNull] this GlobalFeatureManagerModulesConfigurator modulesConfigurator, + [NotNull] Action configureAction) + { + Check.NotNull(configureAction, nameof(configureAction)); + + configureAction(modulesConfigurator.CmsKit()); + + return modulesConfigurator; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs new file mode 100644 index 0000000000..acaa13beab --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs @@ -0,0 +1,19 @@ +using System.Collections.Concurrent; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureManagerModulesConfigurator //TODO: Change to GlobalFeatureManagerModuleDictionary and inherit from ConcurrentDictionary + { + public GlobalFeatureManager FeatureManager { get; } + + [NotNull] + public ConcurrentDictionary Modules { get; } + + public GlobalFeatureManagerModulesConfigurator([NotNull] GlobalFeatureManager featureManager) + { + FeatureManager = Check.NotNull(featureManager, nameof(featureManager)); + Modules = new ConcurrentDictionary(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs index 925acdaf79..468222df8f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Modularity; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Modularity; using Volo.Abp.Localization; using Volo.CmsKit.Localization; using Volo.Abp.Localization.ExceptionHandling; @@ -15,6 +16,20 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { + GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().DisableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().Reactions().Enable(); + GlobalFeatureManager.Instance.Modules().CmsKit(cmsKit => + { + cmsKit.Reactions().Disable(); + cmsKit.Reactions(reactions => + { + reactions.Enable(); + }); + }); + + GlobalFeatureManager.Instance.IsEnabled("asd"); + Configure(options => { options.FileSets.AddEmbedded(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs deleted file mode 100644 index 6e9dff0011..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; - -namespace Volo.CmsKit -{ - public static class CmsKitFeatures - { - public const string NamePrefix = "CmsKit"; - - public static class Reactions - { - public const string Name = NamePrefix + ".Reactions"; - - public static bool IsEnabled - { - get => GlobalFeatures.IsEnabled(Name); - set => GlobalFeatures.SetEnabled(Name, value); - } - } - - public static class Comments - { - public const string Name = NamePrefix + ".Comments"; - - public static bool IsEnabled - { - get => GlobalFeatures.IsEnabled(Name); - set => GlobalFeatures.SetEnabled(Name, value); - } - } - - public static void EnableAll() - { - foreach (var featureName in GetAllNames()) - { - GlobalFeatures.Enable(featureName); - } - } - - public static void DisableAll() - { - foreach (var featureName in GetAllNames()) - { - GlobalFeatures.Disable(featureName); - } - } - - public static IEnumerable GetAllNames() - { - return new[] - { - Reactions.Name, - Comments.Name - }; - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs deleted file mode 100644 index 3c038431ca..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -namespace Volo.CmsKit -{ - internal static class GlobalFeatures //TODO: Move to the ABP Framework..? - { - private static readonly HashSet EnabledFeatures = new HashSet(); - - public static bool IsEnabled(string featureName) - { - return EnabledFeatures.Contains(featureName); - } - - public static void SetEnabled(string featureName, bool isEnabled) - { - if (isEnabled) - { - Enable(featureName); - } - else - { - Disable(featureName); - } - } - - public static void Enable(string featureName) - { - EnabledFeatures.AddIfNotContains(featureName); - } - - public static void Disable(string featureName) - { - EnabledFeatures.Remove(featureName); - } - - public static IEnumerable GetEnabledFeatures() - { - return EnabledFeatures; - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index d778f43f57..d16d11c40a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -2,6 +2,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp; using Volo.Abp.EntityFrameworkCore.Modeling; +using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Comments; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -32,7 +33,7 @@ namespace Volo.CmsKit.EntityFrameworkCore b.ConfigureAbpUser(); }); - if (CmsKitFeatures.Reactions.IsEnabled) + if (GlobalFeatureManager.Instance.Modules().CmsKit().Reactions().IsEnabled) { builder.Entity(b => { @@ -49,7 +50,7 @@ namespace Volo.CmsKit.EntityFrameworkCore }); } - if (CmsKitFeatures.Comments.IsEnabled) + if (GlobalFeatureManager.Instance.Modules().CmsKit().Comments().IsEnabled) { builder.Entity(b => { diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs index 7451c755a8..9ceaa348d0 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs @@ -3,6 +3,7 @@ using Volo.Abp; using Volo.Abp.Authorization; using Volo.Abp.Autofac; using Volo.Abp.Data; +using Volo.Abp.GlobalFeatures; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -18,7 +19,7 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { - CmsKitFeatures.EnableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); context.Services.AddAlwaysAllowAuthorization(); } From 563fc1c6fc01493a9986c158f418ee367b91ea31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 12:07:49 +0300 Subject: [PATCH 03/11] Revised the feature system. --- .../FeatureConfigurer.cs | 2 +- .../Volo/Abp/GlobalFeatures/GlobalFeature.cs | 36 ------------- .../GlobalFeatureConfigurator.cs | 45 ++++++++++++++++ .../GlobalFeatureConfiguratorDictionary.cs | 9 ++++ .../GlobalFeatures/GlobalFeatureManager.cs | 35 +++++++++++-- .../GlobalFeatureManagerCmsKitConfigurator.cs | 12 ----- ...tureManagerCmsKitConfiguratorExtensions.cs | 52 ------------------- .../GlobalFeatureManagerExtensions.cs | 18 ------- .../GlobalFeatureManagerModuleConfigurator.cs | 41 +++++++++++---- ...nagerModuleConfiguratorCmsKitExtensions.cs | 25 ++++----- ...GlobalFeatureManagerModulesConfigurator.cs | 11 ++-- .../GlobalFeatureNameAttribute.cs | 40 ++++++++++++++ .../Volo/CmsKit/CmsKitDomainSharedModule.cs | 16 +++--- .../CmsKit/GlobalFeatures/CommentsFeature.cs | 17 ++++++ .../GlobalFeatureManagerCmsKitConfigurator.cs | 20 +++++++ .../CmsKit/GlobalFeatures/ReactionsFeature.cs | 17 ++++++ .../CmsKitDbContextModelCreatingExtensions.cs | 5 +- .../CmsKitTestBaseModule.cs | 2 +- 18 files changed, 239 insertions(+), 164 deletions(-) delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfigurator.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfiguratorDictionary.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs index 162fa7cf51..d600e99cd9 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs @@ -6,7 +6,7 @@ namespace Volo.CmsKit { public static void Configure() { - GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); + GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs deleted file mode 100644 index 4221b635c0..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs +++ /dev/null @@ -1,36 +0,0 @@ -using JetBrains.Annotations; - -namespace Volo.Abp.GlobalFeatures -{ - public class GlobalFeature - { - public GlobalFeatureManagerModuleConfigurator ModuleConfigurator { get; } - - public string Name { get; } - - public bool IsEnabled => ModuleConfigurator.ModulesConfigurator.FeatureManager.IsEnabled(Name); - - public GlobalFeature( - [NotNull] GlobalFeatureManagerModuleConfigurator moduleConfigurator, - [NotNull] string name) - { - ModuleConfigurator = Check.NotNull(moduleConfigurator, nameof(moduleConfigurator)); - Name = Check.NotNullOrWhiteSpace(name, nameof(name)); - } - - public virtual void Enable() - { - ModuleConfigurator.ModulesConfigurator.FeatureManager.Enable(Name); - } - - public virtual void Disable() - { - ModuleConfigurator.ModulesConfigurator.FeatureManager.Disable(Name); - } - - public virtual void SetEnabled(bool isEnabled) - { - ModuleConfigurator.ModulesConfigurator.FeatureManager.SetEnabled(Name, isEnabled); - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfigurator.cs new file mode 100644 index 0000000000..fb259d7df6 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfigurator.cs @@ -0,0 +1,45 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeature + { + [NotNull] + public GlobalModuleFeatures Module { get; } + + [NotNull] + public GlobalFeatureManager FeatureManager { get; } + + public string FeatureName { get; } + + public bool IsEnabled + { + get => FeatureManager.IsEnabled(FeatureName); + set => FeatureManager.SetEnabled(FeatureName, value); + } + + public GlobalFeature( + [NotNull] GlobalModuleFeatures module, + [NotNull] string name) + { + Module = Check.NotNull(module, nameof(module)); + FeatureName = Check.NotNullOrWhiteSpace(name, nameof(name)); + FeatureManager = Module.FeatureManager; + } + + public virtual void Enable() + { + FeatureManager.Enable(FeatureName); + } + + public virtual void Disable() + { + FeatureManager.Disable(FeatureName); + } + + public virtual void SetEnabled(bool isEnabled) + { + + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfiguratorDictionary.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfiguratorDictionary.cs new file mode 100644 index 0000000000..72114eff3d --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfiguratorDictionary.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureConfiguratorDictionary : Dictionary + { + + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs index bed947e4a8..7819f985de 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs @@ -4,19 +4,46 @@ using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures { - public class GlobalFeatureManager //TODO: Move to the ABP Framework..? //rename? + public class GlobalFeatureManager { public static GlobalFeatureManager Instance { get; protected set; } = new GlobalFeatureManager(); [NotNull] - public ConcurrentDictionary Configuration { get; } + public Dictionary Configuration { get; } + + public GlobalFeatureManagerModuleDictionary Modules { get; } protected HashSet EnabledFeatures { get; } private GlobalFeatureManager() { EnabledFeatures = new HashSet(); - Configuration = new ConcurrentDictionary(); + Configuration = new Dictionary(); + Modules = new GlobalFeatureManagerModuleDictionary(this); + } + + public virtual bool IsEnabled() + where TFeature : GlobalFeature + { + return IsEnabled(GlobalFeatureNameAttribute.GetName()); + } + + public virtual void SetEnabled(bool isEnabled) + where TFeature : GlobalFeature + { + SetEnabled(GlobalFeatureNameAttribute.GetName(), isEnabled); + } + + public virtual void Enable() + where TFeature : GlobalFeature + { + Enable(GlobalFeatureNameAttribute.GetName()); + } + + public virtual void Disable() + where TFeature : GlobalFeature + { + Disable(GlobalFeatureNameAttribute.GetName()); } public virtual bool IsEnabled(string featureName) @@ -46,7 +73,7 @@ namespace Volo.Abp.GlobalFeatures EnabledFeatures.Remove(featureName); } - public virtual IEnumerable GetEnabledFeatures() + public virtual IEnumerable GetEnabledFeatureNames() { return EnabledFeatures; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs deleted file mode 100644 index c3a1183866..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Volo.Abp.GlobalFeatures -{ - public class GlobalFeatureManagerCmsKitConfigurator : GlobalFeatureManagerModuleConfigurator - { - public GlobalFeatureManagerCmsKitConfigurator(GlobalFeatureManagerModulesConfigurator modulesConfigurator) - : base(modulesConfigurator) - { - this.Reactions(); - this.Comments(); - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs deleted file mode 100644 index 4175271f0b..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using JetBrains.Annotations; - -namespace Volo.Abp.GlobalFeatures -{ - public static class GlobalFeatureManagerCmsKitConfiguratorExtensions - { - public static GlobalFeature Reactions( - [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator) - { - Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); - - return cmsKitConfigurator - .Features - .GetOrAdd("Reactions", _ => new GlobalFeature(cmsKitConfigurator, "CmsKit:Reactions")) - as GlobalFeature; - } - - public static GlobalFeatureManagerCmsKitConfigurator Reactions( - [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator, - [NotNull] Action configureAction) - { - Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); - - configureAction(cmsKitConfigurator.Reactions()); - - return cmsKitConfigurator; - } - - public static GlobalFeature Comments( - [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator) - { - Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); - - return cmsKitConfigurator - .Features - .GetOrAdd("Comments", _ => new GlobalFeature(cmsKitConfigurator, "CmsKit:Comments")) - as GlobalFeature; - } - - public static GlobalFeatureManagerCmsKitConfigurator Comments( - [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator, - [NotNull] Action configureAction) - { - Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); - - configureAction(cmsKitConfigurator.Comments()); - - return cmsKitConfigurator; - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs deleted file mode 100644 index 9f148fcef9..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using JetBrains.Annotations; - -namespace Volo.Abp.GlobalFeatures -{ - public static class GlobalFeatureManagerExtensions - { - public static GlobalFeatureManagerModulesConfigurator Modules( - [NotNull] this GlobalFeatureManager featureManager) - { - Check.NotNull(featureManager, nameof(featureManager)); - - return featureManager - .Configuration - .GetOrAdd("_Modules", _ => new GlobalFeatureManagerModulesConfigurator(featureManager)) - as GlobalFeatureManagerModulesConfigurator; - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs index 1c9ff9ae7c..edd1c7f0aa 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs @@ -1,25 +1,25 @@ -using System.Collections.Concurrent; -using JetBrains.Annotations; +using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures { - public abstract class GlobalFeatureManagerModuleConfigurator + public abstract class GlobalModuleFeatures { [NotNull] - public GlobalFeatureManagerModulesConfigurator ModulesConfigurator { get; } + public GlobalFeatureConfiguratorDictionary AllFeatures { get; } [NotNull] - public ConcurrentDictionary Features { get; } + public GlobalFeatureManager FeatureManager { get; } - protected GlobalFeatureManagerModuleConfigurator(GlobalFeatureManagerModulesConfigurator modulesConfigurator) + protected GlobalModuleFeatures( + GlobalFeatureManager featureManager) { - ModulesConfigurator = Check.NotNull(modulesConfigurator, nameof(modulesConfigurator)); - Features = new ConcurrentDictionary(); + AllFeatures = new GlobalFeatureConfiguratorDictionary(); + FeatureManager = featureManager; } public virtual void EnableAll() { - foreach (var feature in Features.Values) + foreach (var feature in AllFeatures.Values) { feature.Enable(); } @@ -27,10 +27,31 @@ namespace Volo.Abp.GlobalFeatures public virtual void DisableAll() { - foreach (var feature in Features.Values) + foreach (var feature in AllFeatures.Values) { feature.Disable(); } } + + protected void AddFeature(string featureName) + { + AddFeature(new GlobalFeature(this, featureName)); + } + + protected void AddFeature(GlobalFeature feature) + { + AllFeatures[feature.FeatureName] = feature; + } + + protected GlobalFeature GetFeature(string featureName) + { + return AllFeatures[featureName]; + } + + protected TFeature GetFeature(string featureName) + where TFeature : GlobalFeature + { + return (TFeature) AllFeatures[featureName]; + } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs index 9449ef702c..76b3df92d5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs @@ -1,30 +1,31 @@ using System; +using System.Collections.Generic; using JetBrains.Annotations; +using Volo.CmsKit.GlobalFeatures; namespace Volo.Abp.GlobalFeatures { public static class GlobalFeatureManagerModuleConfiguratorCmsKitExtensions { - public static GlobalFeatureManagerCmsKitConfigurator CmsKit( - [NotNull] this GlobalFeatureManagerModulesConfigurator modulesConfigurator) + public static GlobalCmsKitFeatures CmsKit( + [NotNull] this GlobalFeatureManagerModuleDictionary modules) { - Check.NotNull(modulesConfigurator, nameof(modulesConfigurator)); + Check.NotNull(modules, nameof(modules)); - return modulesConfigurator - .Modules - .GetOrAdd("CmsKit", _ => new GlobalFeatureManagerCmsKitConfigurator(modulesConfigurator)) - as GlobalFeatureManagerCmsKitConfigurator; + return modules + .GetOrAdd(GlobalCmsKitFeatures.ModuleName, _ => new GlobalCmsKitFeatures(modules.FeatureManager)) + as GlobalCmsKitFeatures; } - public static GlobalFeatureManagerModulesConfigurator CmsKit( - [NotNull] this GlobalFeatureManagerModulesConfigurator modulesConfigurator, - [NotNull] Action configureAction) + public static GlobalFeatureManagerModuleDictionary CmsKit( + [NotNull] this GlobalFeatureManagerModuleDictionary modules, + [NotNull] Action configureAction) { Check.NotNull(configureAction, nameof(configureAction)); - configureAction(modulesConfigurator.CmsKit()); + configureAction(modules.CmsKit()); - return modulesConfigurator; + return modules; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs index acaa13beab..d48dfee4f8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs @@ -1,19 +1,16 @@ -using System.Collections.Concurrent; +using System.Collections.Generic; using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures { - public class GlobalFeatureManagerModulesConfigurator //TODO: Change to GlobalFeatureManagerModuleDictionary and inherit from ConcurrentDictionary + public class GlobalFeatureManagerModuleDictionary : Dictionary { public GlobalFeatureManager FeatureManager { get; } - [NotNull] - public ConcurrentDictionary Modules { get; } - - public GlobalFeatureManagerModulesConfigurator([NotNull] GlobalFeatureManager featureManager) + public GlobalFeatureManagerModuleDictionary( + [NotNull] GlobalFeatureManager featureManager) { FeatureManager = Check.NotNull(featureManager, nameof(featureManager)); - Modules = new ConcurrentDictionary(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs new file mode 100644 index 0000000000..b5468096d3 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs @@ -0,0 +1,40 @@ +using System; +using System.Linq; +using System.Reflection; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + [AttributeUsage(AttributeTargets.Class)] + public class GlobalFeatureNameAttribute : Attribute + { + public string Name { get; } + + public GlobalFeatureNameAttribute([NotNull] string name) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } + + public static string GetName() + where TFeature : GlobalFeature + { + return GetName(typeof(TFeature)); + } + + public static string GetName(Type type) + { + var attribute = type + .GetCustomAttributes() + .FirstOrDefault(); + + if (attribute == null) + { + throw new AbpException($"{type.AssemblyQualifiedName} should define the {typeof(GlobalFeatureNameAttribute).FullName} atttribute!"); + } + + return attribute + .As() + .Name; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs index 468222df8f..0afe98f7c9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs @@ -16,16 +16,14 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { - GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); - GlobalFeatureManager.Instance.Modules().CmsKit().DisableAll(); - GlobalFeatureManager.Instance.Modules().CmsKit().Reactions().Enable(); - GlobalFeatureManager.Instance.Modules().CmsKit(cmsKit => + GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); + GlobalFeatureManager.Instance.Modules.CmsKit().DisableAll(); + GlobalFeatureManager.Instance.Modules.CmsKit().Reactions.Enable(); + GlobalFeatureManager.Instance.Modules.CmsKit().Reactions.Enable(); + GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => { - cmsKit.Reactions().Disable(); - cmsKit.Reactions(reactions => - { - reactions.Enable(); - }); + cmsKit.Reactions.Disable(); + cmsKit.Comments.Enable(); }); GlobalFeatureManager.Instance.IsEnabled("asd"); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs new file mode 100644 index 0000000000..63cafd6744 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs @@ -0,0 +1,17 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures +{ + [GlobalFeatureName(Name)] + public class CommentsFeature : GlobalFeature + { + public const string Name = "CmsKit.Comments"; + + public CommentsFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit, Name) + { + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs new file mode 100644 index 0000000000..7fb1638e2d --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs @@ -0,0 +1,20 @@ +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures +{ + public class GlobalCmsKitFeatures : GlobalModuleFeatures + { + public const string ModuleName = "CmsKit"; + + public ReactionsFeature Reactions => GetFeature(ReactionsFeature.Name); + + public CommentsFeature Comments => GetFeature(CommentsFeature.Name); + + public GlobalCmsKitFeatures(GlobalFeatureManager featureManager) + : base(featureManager) + { + AddFeature(new ReactionsFeature(this)); + AddFeature(new CommentsFeature(this)); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs new file mode 100644 index 0000000000..ec658fd8ca --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs @@ -0,0 +1,17 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures +{ + [GlobalFeatureName(Name)] + public class ReactionsFeature : GlobalFeature + { + public const string Name = "CmsKit.Reactions"; + + public ReactionsFeature( + [NotNull] GlobalCmsKitFeatures cmsKit + ) : base(cmsKit, Name) + { + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index d16d11c40a..d1fcaf8211 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -7,6 +7,7 @@ using Volo.CmsKit.Comments; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; using Volo.Abp.Users.EntityFrameworkCore; +using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit.EntityFrameworkCore { @@ -33,7 +34,7 @@ namespace Volo.CmsKit.EntityFrameworkCore b.ConfigureAbpUser(); }); - if (GlobalFeatureManager.Instance.Modules().CmsKit().Reactions().IsEnabled) + if (GlobalFeatureManager.Instance.IsEnabled()) { builder.Entity(b => { @@ -50,7 +51,7 @@ namespace Volo.CmsKit.EntityFrameworkCore }); } - if (GlobalFeatureManager.Instance.Modules().CmsKit().Comments().IsEnabled) + if (GlobalFeatureManager.Instance.IsEnabled()) { builder.Entity(b => { diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs index 9ceaa348d0..a6da60876c 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs @@ -19,7 +19,7 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { - GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); + GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); context.Services.AddAlwaysAllowAuthorization(); } From 6a24a0de3004c3eae1c2d38b37397702235afc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 14:26:19 +0300 Subject: [PATCH 04/11] Make GlobalFeature abstract. --- .../{GlobalFeatureConfigurator.cs => GlobalFeature.cs} | 10 ++++------ .../GlobalFeatureManagerModuleConfigurator.cs | 5 ----- .../Volo/CmsKit/CmsKitDomainSharedModule.cs | 4 +++- .../Volo/CmsKit/GlobalFeatures/CommentsFeature.cs | 2 +- .../Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs | 2 +- 5 files changed, 9 insertions(+), 14 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/{GlobalFeatureConfigurator.cs => GlobalFeature.cs} (77%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs similarity index 77% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfigurator.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs index fb259d7df6..f0c113b1bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.GlobalFeatures { - public class GlobalFeature + public abstract class GlobalFeature { [NotNull] public GlobalModuleFeatures Module { get; } @@ -18,13 +18,11 @@ namespace Volo.Abp.GlobalFeatures set => FeatureManager.SetEnabled(FeatureName, value); } - public GlobalFeature( - [NotNull] GlobalModuleFeatures module, - [NotNull] string name) + protected GlobalFeature([NotNull] GlobalModuleFeatures module) { Module = Check.NotNull(module, nameof(module)); - FeatureName = Check.NotNullOrWhiteSpace(name, nameof(name)); FeatureManager = Module.FeatureManager; + FeatureName = GlobalFeatureNameAttribute.GetName(GetType()); } public virtual void Enable() @@ -39,7 +37,7 @@ namespace Volo.Abp.GlobalFeatures public virtual void SetEnabled(bool isEnabled) { - + FeatureManager.SetEnabled(FeatureName, isEnabled); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs index edd1c7f0aa..64692071e0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs @@ -33,11 +33,6 @@ namespace Volo.Abp.GlobalFeatures } } - protected void AddFeature(string featureName) - { - AddFeature(new GlobalFeature(this, featureName)); - } - protected void AddFeature(GlobalFeature feature) { AllFeatures[feature.FeatureName] = feature; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs index 0afe98f7c9..f624f65957 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs @@ -6,6 +6,7 @@ using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Validation; using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; +using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit { @@ -26,7 +27,8 @@ namespace Volo.CmsKit cmsKit.Comments.Enable(); }); - GlobalFeatureManager.Instance.IsEnabled("asd"); + GlobalFeatureManager.Instance.IsEnabled("qweasd"); + GlobalFeatureManager.Instance.IsEnabled(); Configure(options => { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs index 63cafd6744..fb1c3fa9cb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs @@ -10,7 +10,7 @@ namespace Volo.CmsKit.GlobalFeatures public CommentsFeature( [NotNull] GlobalCmsKitFeatures cmsKit - ) : base(cmsKit, Name) + ) : base(cmsKit) { } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs index ec658fd8ca..6c978e88e6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs @@ -10,7 +10,7 @@ namespace Volo.CmsKit.GlobalFeatures public ReactionsFeature( [NotNull] GlobalCmsKitFeatures cmsKit - ) : base(cmsKit, Name) + ) : base(cmsKit) { } } From 8467024d5411098d61e348150a9d2c3a312007a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 14:33:15 +0300 Subject: [PATCH 05/11] refactor the global feature system --- .../Volo/Abp/GlobalFeatures/GlobalFeature.cs | 1 + .../Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs | 3 +++ .../GlobalFeatureManagerModuleConfigurator.cs | 12 ++++++------ .../Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs | 2 ++ .../Volo/CmsKit/GlobalFeatures/CommentsFeature.cs | 2 +- ...CmsKitConfigurator.cs => GlobalCmsKitFeatures.cs} | 10 +++++----- .../Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs | 2 +- 7 files changed, 19 insertions(+), 13 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/{GlobalFeatureManagerCmsKitConfigurator.cs => GlobalCmsKitFeatures.cs} (72%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs index f0c113b1bf..11fb6961ed 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs @@ -10,6 +10,7 @@ namespace Volo.Abp.GlobalFeatures [NotNull] public GlobalFeatureManager FeatureManager { get; } + [NotNull] public string FeatureName { get; } public bool IsEnabled diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs index 7819f985de..80a5fcfae0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs @@ -8,6 +8,9 @@ namespace Volo.Abp.GlobalFeatures { public static GlobalFeatureManager Instance { get; protected set; } = new GlobalFeatureManager(); + /// + /// A common dictionary to store arbitrary configurations. + /// [NotNull] public Dictionary Configuration { get; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs index 64692071e0..fc870da152 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs @@ -5,16 +5,16 @@ namespace Volo.Abp.GlobalFeatures public abstract class GlobalModuleFeatures { [NotNull] - public GlobalFeatureConfiguratorDictionary AllFeatures { get; } + public GlobalFeatureManager FeatureManager { get; } [NotNull] - public GlobalFeatureManager FeatureManager { get; } + protected GlobalFeatureConfiguratorDictionary AllFeatures { get; } protected GlobalModuleFeatures( - GlobalFeatureManager featureManager) + [NotNull] GlobalFeatureManager featureManager) { + FeatureManager = Check.NotNull(featureManager, nameof(featureManager)); AllFeatures = new GlobalFeatureConfiguratorDictionary(); - FeatureManager = featureManager; } public virtual void EnableAll() @@ -43,10 +43,10 @@ namespace Volo.Abp.GlobalFeatures return AllFeatures[featureName]; } - protected TFeature GetFeature(string featureName) + protected TFeature GetFeature() where TFeature : GlobalFeature { - return (TFeature) AllFeatures[featureName]; + return (TFeature) GetFeature(GlobalFeatureNameAttribute.GetName()); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs index b5468096d3..295c8727e6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs @@ -8,6 +8,7 @@ namespace Volo.Abp.GlobalFeatures [AttributeUsage(AttributeTargets.Class)] public class GlobalFeatureNameAttribute : Attribute { + [NotNull] public string Name { get; } public GlobalFeatureNameAttribute([NotNull] string name) @@ -21,6 +22,7 @@ namespace Volo.Abp.GlobalFeatures return GetName(typeof(TFeature)); } + [NotNull] public static string GetName(Type type) { var attribute = type diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs index fb1c3fa9cb..c9615c51d4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs @@ -8,7 +8,7 @@ namespace Volo.CmsKit.GlobalFeatures { public const string Name = "CmsKit.Comments"; - public CommentsFeature( + internal CommentsFeature( [NotNull] GlobalCmsKitFeatures cmsKit ) : base(cmsKit) { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs similarity index 72% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index 7fb1638e2d..dcdef4e8c2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -1,4 +1,5 @@ -using Volo.Abp.GlobalFeatures; +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; namespace Volo.CmsKit.GlobalFeatures { @@ -6,11 +7,10 @@ namespace Volo.CmsKit.GlobalFeatures { public const string ModuleName = "CmsKit"; - public ReactionsFeature Reactions => GetFeature(ReactionsFeature.Name); + public ReactionsFeature Reactions => GetFeature(); + public CommentsFeature Comments => GetFeature(); - public CommentsFeature Comments => GetFeature(CommentsFeature.Name); - - public GlobalCmsKitFeatures(GlobalFeatureManager featureManager) + public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) : base(featureManager) { AddFeature(new ReactionsFeature(this)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs index 6c978e88e6..ad9a60b64d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/ReactionsFeature.cs @@ -8,7 +8,7 @@ namespace Volo.CmsKit.GlobalFeatures { public const string Name = "CmsKit.Reactions"; - public ReactionsFeature( + internal ReactionsFeature( [NotNull] GlobalCmsKitFeatures cmsKit ) : base(cmsKit) { From da0d4718ff32e14b4fc40ce067181bc21f75575a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 14:46:32 +0300 Subject: [PATCH 06/11] Revise the global features. --- .../Volo/Abp/GlobalFeatures/GlobalFeature.cs | 13 ++++-- ...ctionary.cs => GlobalFeatureDictionary.cs} | 2 +- .../GlobalFeatures/GlobalFeatureManager.cs | 41 +++---------------- ...nagerModuleConfiguratorCmsKitExtensions.cs | 16 ++++---- ...onfigurator.cs => GlobalModuleFeatures.cs} | 4 +- ...r.cs => GlobalModuleFeaturesDictionary.cs} | 4 +- .../CmsKit/GlobalFeatures/CommentsFeature.cs | 1 + 7 files changed, 29 insertions(+), 52 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/{GlobalFeatureConfiguratorDictionary.cs => GlobalFeatureDictionary.cs} (50%) rename modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/{GlobalFeatureManagerModuleConfigurator.cs => GlobalModuleFeatures.cs} (89%) rename modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/{GlobalFeatureManagerModulesConfigurator.cs => GlobalModuleFeaturesDictionary.cs} (69%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs index 11fb6961ed..de9ae0232a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs @@ -16,7 +16,7 @@ namespace Volo.Abp.GlobalFeatures public bool IsEnabled { get => FeatureManager.IsEnabled(FeatureName); - set => FeatureManager.SetEnabled(FeatureName, value); + set => SetEnabled(value); } protected GlobalFeature([NotNull] GlobalModuleFeatures module) @@ -36,9 +36,16 @@ namespace Volo.Abp.GlobalFeatures FeatureManager.Disable(FeatureName); } - public virtual void SetEnabled(bool isEnabled) + public void SetEnabled(bool isEnabled) { - FeatureManager.SetEnabled(FeatureName, isEnabled); + if (isEnabled) + { + Enable(); + } + else + { + Disable(); + } } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfiguratorDictionary.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs similarity index 50% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfiguratorDictionary.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs index 72114eff3d..c8f68a1ab0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureConfiguratorDictionary.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.GlobalFeatures { - public class GlobalFeatureConfiguratorDictionary : Dictionary + public class GlobalFeatureDictionary : Dictionary { } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs index 80a5fcfae0..456aa74a07 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs @@ -1,5 +1,4 @@ -using System.Collections.Concurrent; -using System.Collections.Generic; +using System.Collections.Generic; using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures @@ -14,7 +13,7 @@ namespace Volo.Abp.GlobalFeatures [NotNull] public Dictionary Configuration { get; } - public GlobalFeatureManagerModuleDictionary Modules { get; } + public GlobalModuleFeaturesDictionary Modules { get; } protected HashSet EnabledFeatures { get; } @@ -22,7 +21,7 @@ namespace Volo.Abp.GlobalFeatures { EnabledFeatures = new HashSet(); Configuration = new Dictionary(); - Modules = new GlobalFeatureManagerModuleDictionary(this); + Modules = new GlobalModuleFeaturesDictionary(this); } public virtual bool IsEnabled() @@ -31,47 +30,17 @@ namespace Volo.Abp.GlobalFeatures return IsEnabled(GlobalFeatureNameAttribute.GetName()); } - public virtual void SetEnabled(bool isEnabled) - where TFeature : GlobalFeature - { - SetEnabled(GlobalFeatureNameAttribute.GetName(), isEnabled); - } - - public virtual void Enable() - where TFeature : GlobalFeature - { - Enable(GlobalFeatureNameAttribute.GetName()); - } - - public virtual void Disable() - where TFeature : GlobalFeature - { - Disable(GlobalFeatureNameAttribute.GetName()); - } - public virtual bool IsEnabled(string featureName) { return EnabledFeatures.Contains(featureName); } - public virtual void SetEnabled(string featureName, bool isEnabled) - { - if (isEnabled) - { - Enable(featureName); - } - else - { - Disable(featureName); - } - } - - public virtual void Enable(string featureName) + protected internal void Enable(string featureName) { EnabledFeatures.AddIfNotContains(featureName); } - public virtual void Disable(string featureName) + protected internal void Disable(string featureName) { EnabledFeatures.Remove(featureName); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs index 76b3df92d5..eb8d4acbb3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs @@ -8,24 +8,24 @@ namespace Volo.Abp.GlobalFeatures public static class GlobalFeatureManagerModuleConfiguratorCmsKitExtensions { public static GlobalCmsKitFeatures CmsKit( - [NotNull] this GlobalFeatureManagerModuleDictionary modules) + [NotNull] this GlobalModuleFeaturesDictionary modulesFeatures) { - Check.NotNull(modules, nameof(modules)); + Check.NotNull(modulesFeatures, nameof(modulesFeatures)); - return modules - .GetOrAdd(GlobalCmsKitFeatures.ModuleName, _ => new GlobalCmsKitFeatures(modules.FeatureManager)) + return modulesFeatures + .GetOrAdd(GlobalCmsKitFeatures.ModuleName, _ => new GlobalCmsKitFeatures(modulesFeatures.FeatureManager)) as GlobalCmsKitFeatures; } - public static GlobalFeatureManagerModuleDictionary CmsKit( - [NotNull] this GlobalFeatureManagerModuleDictionary modules, + public static GlobalModuleFeaturesDictionary CmsKit( + [NotNull] this GlobalModuleFeaturesDictionary modulesFeatures, [NotNull] Action configureAction) { Check.NotNull(configureAction, nameof(configureAction)); - configureAction(modules.CmsKit()); + configureAction(modulesFeatures.CmsKit()); - return modules; + return modulesFeatures; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs similarity index 89% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs index fc870da152..2b3721d331 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs @@ -8,13 +8,13 @@ namespace Volo.Abp.GlobalFeatures public GlobalFeatureManager FeatureManager { get; } [NotNull] - protected GlobalFeatureConfiguratorDictionary AllFeatures { get; } + protected GlobalFeatureDictionary AllFeatures { get; } protected GlobalModuleFeatures( [NotNull] GlobalFeatureManager featureManager) { FeatureManager = Check.NotNull(featureManager, nameof(featureManager)); - AllFeatures = new GlobalFeatureConfiguratorDictionary(); + AllFeatures = new GlobalFeatureDictionary(); } public virtual void EnableAll() diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs similarity index 69% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs index d48dfee4f8..9952b0c5cc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs @@ -3,11 +3,11 @@ using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures { - public class GlobalFeatureManagerModuleDictionary : Dictionary + public class GlobalModuleFeaturesDictionary : Dictionary { public GlobalFeatureManager FeatureManager { get; } - public GlobalFeatureManagerModuleDictionary( + public GlobalModuleFeaturesDictionary( [NotNull] GlobalFeatureManager featureManager) { FeatureManager = Check.NotNull(featureManager, nameof(featureManager)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs index c9615c51d4..a812bd5388 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/CommentsFeature.cs @@ -12,6 +12,7 @@ namespace Volo.CmsKit.GlobalFeatures [NotNull] GlobalCmsKitFeatures cmsKit ) : base(cmsKit) { + } } } From 092093f8bb0350912201dc5d5efb124fbb93fb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 14:51:15 +0300 Subject: [PATCH 07/11] Update GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs --- ...ManagerModuleConfiguratorCmsKitExtensions.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs index eb8d4acbb3..e73c91e8b2 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs @@ -8,24 +8,27 @@ namespace Volo.Abp.GlobalFeatures public static class GlobalFeatureManagerModuleConfiguratorCmsKitExtensions { public static GlobalCmsKitFeatures CmsKit( - [NotNull] this GlobalModuleFeaturesDictionary modulesFeatures) + [NotNull] this GlobalModuleFeaturesDictionary modules) { - Check.NotNull(modulesFeatures, nameof(modulesFeatures)); + Check.NotNull(modules, nameof(modules)); - return modulesFeatures - .GetOrAdd(GlobalCmsKitFeatures.ModuleName, _ => new GlobalCmsKitFeatures(modulesFeatures.FeatureManager)) + return modules + .GetOrAdd( + GlobalCmsKitFeatures.ModuleName, + _ => new GlobalCmsKitFeatures(modules.FeatureManager) + ) as GlobalCmsKitFeatures; } public static GlobalModuleFeaturesDictionary CmsKit( - [NotNull] this GlobalModuleFeaturesDictionary modulesFeatures, + [NotNull] this GlobalModuleFeaturesDictionary modules, [NotNull] Action configureAction) { Check.NotNull(configureAction, nameof(configureAction)); - configureAction(modulesFeatures.CmsKit()); + configureAction(modules.CmsKit()); - return modulesFeatures; + return modules; } } } From 838289552ec38ab17dafc69935285a0045ff9fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 14:59:14 +0300 Subject: [PATCH 08/11] Use OneTimeRunner and clear the test code. --- .../FeatureConfigurer.cs | 8 +++++++- ...ModuleFeaturesDictionaryCmsKitExtensions.cs} | 2 +- .../Volo/CmsKit/CmsKitDomainSharedModule.cs | 17 +---------------- .../GlobalFeatures/GlobalCmsKitFeatures.cs | 1 + .../CmsKitTestBaseModule.cs | 7 ++++++- 5 files changed, 16 insertions(+), 19 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/{GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs => GlobalModuleFeaturesDictionaryCmsKitExtensions.cs} (92%) diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs index d600e99cd9..9046c60aca 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs @@ -1,12 +1,18 @@ using Volo.Abp.GlobalFeatures; +using Volo.Abp.Threading; namespace Volo.CmsKit { public static class FeatureConfigurer { + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + public static void Configure() { - GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); + OneTimeRunner.Run(() => + { + GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); + }); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionaryCmsKitExtensions.cs similarity index 92% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionaryCmsKitExtensions.cs index e73c91e8b2..72701d5e4d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionaryCmsKitExtensions.cs @@ -5,7 +5,7 @@ using Volo.CmsKit.GlobalFeatures; namespace Volo.Abp.GlobalFeatures { - public static class GlobalFeatureManagerModuleConfiguratorCmsKitExtensions + public static class GlobalModuleFeaturesDictionaryCmsKitExtensions { public static GlobalCmsKitFeatures CmsKit( [NotNull] this GlobalModuleFeaturesDictionary modules) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs index f624f65957..925acdaf79 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs @@ -1,12 +1,10 @@ -using Volo.Abp.GlobalFeatures; -using Volo.Abp.Modularity; +using Volo.Abp.Modularity; using Volo.Abp.Localization; using Volo.CmsKit.Localization; using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Validation; using Volo.Abp.Validation.Localization; using Volo.Abp.VirtualFileSystem; -using Volo.CmsKit.GlobalFeatures; namespace Volo.CmsKit { @@ -17,19 +15,6 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { - GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); - GlobalFeatureManager.Instance.Modules.CmsKit().DisableAll(); - GlobalFeatureManager.Instance.Modules.CmsKit().Reactions.Enable(); - GlobalFeatureManager.Instance.Modules.CmsKit().Reactions.Enable(); - GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => - { - cmsKit.Reactions.Disable(); - cmsKit.Comments.Enable(); - }); - - GlobalFeatureManager.Instance.IsEnabled("qweasd"); - GlobalFeatureManager.Instance.IsEnabled(); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index dcdef4e8c2..646a91ef4f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -8,6 +8,7 @@ namespace Volo.CmsKit.GlobalFeatures public const string ModuleName = "CmsKit"; public ReactionsFeature Reactions => GetFeature(); + public CommentsFeature Comments => GetFeature(); public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs index a6da60876c..8e5049f55e 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs @@ -17,9 +17,14 @@ namespace Volo.CmsKit )] public class CmsKitTestBaseModule : AbpModule { + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + public override void ConfigureServices(ServiceConfigurationContext context) { - GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); + OneTimeRunner.Run(() => + { + GlobalFeatureManager.Instance.Modules.CmsKit().EnableAll(); + }); context.Services.AddAlwaysAllowAuthorization(); } From 82ecc9cf8d9bdd98579c3f907d51023a1e90ab62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 15:01:56 +0300 Subject: [PATCH 09/11] Add Collection to the mongodb tests --- .../MongoDB/Comments/CommentRepository_Tests.cs | 2 ++ .../MongoDB/Reactions/UserReactionRepository_Tests.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Comments/CommentRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Comments/CommentRepository_Tests.cs index cf2e936ca8..06a8007683 100644 --- a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Comments/CommentRepository_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Comments/CommentRepository_Tests.cs @@ -1,7 +1,9 @@ using Volo.CmsKit.Comments; +using Xunit; namespace Volo.CmsKit.MongoDB.Comments { + [Collection(MongoTestCollection.Name)] public class CommentRepository_Tests : CommentRepository_Tests { diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Reactions/UserReactionRepository_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Reactions/UserReactionRepository_Tests.cs index 452ee211c5..16740a5803 100644 --- a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Reactions/UserReactionRepository_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Reactions/UserReactionRepository_Tests.cs @@ -1,7 +1,9 @@ using Volo.CmsKit.Reactions; +using Xunit; namespace Volo.CmsKit.MongoDB.Reactions { + [Collection(MongoTestCollection.Name)] public class UserReactionRepository_Tests : UserReactionRepository_Tests { } From 2a5eb8902c6772e1a1ab8aab52e9fac175fd6bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 15:27:06 +0300 Subject: [PATCH 10/11] Add new methods to GlobalModuleFeatures --- .../GlobalFeatures/GlobalModuleFeatures.cs | 62 ++++++++++++++++--- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs index 2b3721d331..9a8afd236d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs @@ -1,4 +1,6 @@ -using JetBrains.Annotations; +using System.Collections.Generic; +using System.Collections.Immutable; +using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures { @@ -17,6 +19,39 @@ namespace Volo.Abp.GlobalFeatures AllFeatures = new GlobalFeatureDictionary(); } + public virtual void Enable() + where TFeature : GlobalFeature + { + GetFeature().Enable(); + } + + public virtual void Disable() + where TFeature : GlobalFeature + { + GetFeature().Disable(); + } + + public virtual void SetEnabled(bool isEnabled) + where TFeature : GlobalFeature + { + GetFeature().SetEnabled(isEnabled); + } + + public virtual void Enable(string featureName) + { + GetFeature(featureName).Enable(); + } + + public virtual void Disable(string featureName) + { + GetFeature(featureName).Disable(); + } + + public virtual void SetEnabled(string featureName, bool isEnabled) + { + GetFeature(featureName).SetEnabled(isEnabled); + } + public virtual void EnableAll() { foreach (var feature in AllFeatures.Values) @@ -33,20 +68,31 @@ namespace Volo.Abp.GlobalFeatures } } - protected void AddFeature(GlobalFeature feature) + public virtual GlobalFeature GetFeature(string featureName) { - AllFeatures[feature.FeatureName] = feature; - } + var feature = AllFeatures.GetOrDefault(featureName); + if (feature == null) + { + throw new AbpException($"There is no feature defined by name '{featureName}'."); + } - protected GlobalFeature GetFeature(string featureName) - { - return AllFeatures[featureName]; + return feature; } - protected TFeature GetFeature() + public virtual TFeature GetFeature() where TFeature : GlobalFeature { return (TFeature) GetFeature(GlobalFeatureNameAttribute.GetName()); } + + public virtual IReadOnlyList GetFeatures() + { + return AllFeatures.Values.ToImmutableList(); + } + + protected void AddFeature(GlobalFeature feature) + { + AllFeatures[feature.FeatureName] = feature; + } } } From 1483da256ea8b58e52ab6044b4b82bfef89473c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 14 Aug 2020 17:46:23 +0300 Subject: [PATCH 11/11] #5061 Initial Global Features System completed. --- framework/Volo.Abp.sln | 14 +++++++++ .../Volo.Abp.GlobalFeatures/FodyWeavers.xml | 3 ++ .../Volo.Abp.GlobalFeatures/FodyWeavers.xsd | 30 +++++++++++++++++++ .../Properties/AssemblyInfo.cs | 3 ++ .../Volo.Abp.GlobalFeatures.csproj | 21 +++++++++++++ .../GlobalFeatures/AbpGlobalFeaturesModule.cs | 9 ++++++ .../Volo/Abp/GlobalFeatures/GlobalFeature.cs | 2 +- .../GlobalFeatures/GlobalFeatureDictionary.cs | 2 +- .../GlobalFeatures/GlobalFeatureManager.cs | 4 +-- .../GlobalFeatureNameAttribute.cs | 2 +- .../GlobalFeatures/GlobalModuleFeatures.cs | 2 +- .../GlobalModuleFeaturesDictionary.cs | 2 +- .../Volo.Abp.GlobalFeatures.Tests.csproj | 16 ++++++++++ .../GlobalFeatureManager_Tests.cs | 23 ++++++++++++++ .../Volo.CmsKit.Domain.Shared.csproj | 1 + .../Volo/CmsKit/CmsKitDomainSharedModule.cs | 7 +++-- nupkg/common.ps1 | 1 + 17 files changed, 133 insertions(+), 9 deletions(-) create mode 100644 framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.GlobalFeatures/Properties/AssemblyInfo.cs create mode 100644 framework/src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.csproj create mode 100644 framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/AbpGlobalFeaturesModule.cs rename {modules/cms-kit/src/Volo.CmsKit.Domain.Shared => framework/src/Volo.Abp.GlobalFeatures}/Volo/Abp/GlobalFeatures/GlobalFeature.cs (97%) rename {modules/cms-kit/src/Volo.CmsKit.Domain.Shared => framework/src/Volo.Abp.GlobalFeatures}/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs (76%) rename {modules/cms-kit/src/Volo.CmsKit.Domain.Shared => framework/src/Volo.Abp.GlobalFeatures}/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs (94%) rename {modules/cms-kit/src/Volo.CmsKit.Domain.Shared => framework/src/Volo.Abp.GlobalFeatures}/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs (98%) rename {modules/cms-kit/src/Volo.CmsKit.Domain.Shared => framework/src/Volo.Abp.GlobalFeatures}/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs (98%) rename {modules/cms-kit/src/Volo.CmsKit.Domain.Shared => framework/src/Volo.Abp.GlobalFeatures}/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs (91%) create mode 100644 framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj create mode 100644 framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeatureManager_Tests.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 5778b054ed..3811a80ee8 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -323,6 +323,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Aws", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Aws.Tests", "test\Volo.Abp.BlobStoring.Aws.Tests\Volo.Abp.BlobStoring.Aws.Tests.csproj", "{2CD3B26A-CA81-4279-8D5D-6A594517BB3F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures", "src\Volo.Abp.GlobalFeatures\Volo.Abp.GlobalFeatures.csproj", "{04F44063-C952-403A-815F-EFB778BDA125}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures.Tests", "test\Volo.Abp.GlobalFeatures.Tests\Volo.Abp.GlobalFeatures.Tests.csproj", "{231F1581-AA21-44C3-BF27-51EB3AD5355C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -961,6 +965,14 @@ Global {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|Any CPU.Build.0 = Debug|Any CPU {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|Any CPU.ActiveCfg = Release|Any CPU {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|Any CPU.Build.0 = Release|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Release|Any CPU.Build.0 = Release|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1124,6 +1136,8 @@ Global {8E49687A-E69F-49F2-8DB0-428D0883A937} = {447C8A77-E5F0-4538-8687-7383196D04EA} {50968CDE-1029-4051-B2E5-B69D0ECF2A18} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {2CD3B26A-CA81-4279-8D5D-6A594517BB3F} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {04F44063-C952-403A-815F-EFB778BDA125} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {231F1581-AA21-44C3-BF27-51EB3AD5355C} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xml b/framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xml new file mode 100644 index 0000000000..bc5a74a236 --- /dev/null +++ b/framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + diff --git a/framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xsd b/framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.GlobalFeatures/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.GlobalFeatures/Properties/AssemblyInfo.cs b/framework/src/Volo.Abp.GlobalFeatures/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..e4ff8a95bd --- /dev/null +++ b/framework/src/Volo.Abp.GlobalFeatures/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly:InternalsVisibleTo("Volo.Abp.GlobalFeatures.Tests")] diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.csproj b/framework/src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.csproj new file mode 100644 index 0000000000..f4afe8f9f7 --- /dev/null +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.csproj @@ -0,0 +1,21 @@ + + + + + + + netstandard2.0 + Volo.Abp.GlobalFeatures + Volo.Abp.GlobalFeatures + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/AbpGlobalFeaturesModule.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/AbpGlobalFeaturesModule.cs new file mode 100644 index 0000000000..d537e9f8fd --- /dev/null +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/AbpGlobalFeaturesModule.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Modularity; + +namespace Volo.Abp.GlobalFeatures +{ + public class AbpGlobalFeaturesModule : AbpModule + { + + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeature.cs similarity index 97% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs rename to framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeature.cs index de9ae0232a..c7fc9304a8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeature.cs @@ -1,4 +1,4 @@ -using JetBrains.Annotations; +using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs similarity index 76% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs rename to framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs index c8f68a1ab0..a81632f8d5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureDictionary.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace Volo.Abp.GlobalFeatures { diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs similarity index 94% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs rename to framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs index 456aa74a07..79badfe4e7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures @@ -17,7 +17,7 @@ namespace Volo.Abp.GlobalFeatures protected HashSet EnabledFeatures { get; } - private GlobalFeatureManager() + internal GlobalFeatureManager() { EnabledFeatures = new HashSet(); Configuration = new Dictionary(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs similarity index 98% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs rename to framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs index 295c8727e6..0563712899 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeatureNameAttribute.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Reflection; using JetBrains.Annotations; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs similarity index 98% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs rename to framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs index 9a8afd236d..7d1b844d45 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeatures.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Immutable; using JetBrains.Annotations; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs similarity index 91% rename from modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs rename to framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs index 9952b0c5cc..b89bf2fe36 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures diff --git a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj new file mode 100644 index 0000000000..c0a973f8a5 --- /dev/null +++ b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj @@ -0,0 +1,16 @@ + + + + + + netcoreapp3.1 + + + + + + + + + + diff --git a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeatureManager_Tests.cs b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeatureManager_Tests.cs new file mode 100644 index 0000000000..6d8e3a9d25 --- /dev/null +++ b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo/Abp/GlobalFeatures/GlobalFeatureManager_Tests.cs @@ -0,0 +1,23 @@ +using Shouldly; +using Xunit; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureManager_Tests + { + private readonly GlobalFeatureManager _featureManeger; + + public GlobalFeatureManager_Tests() + { + _featureManeger = new GlobalFeatureManager(); + } + + [Fact] + public void Enable_Feature_By_Name() + { + _featureManeger.IsEnabled("Feature1").ShouldBeFalse(); + _featureManeger.Enable("Feature1"); + _featureManeger.IsEnabled("Feature1").ShouldBeTrue(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj index 03bc3bce5d..e5e84b7aca 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj @@ -11,6 +11,7 @@ + diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs index 925acdaf79..d2490cfb37 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs @@ -1,4 +1,6 @@ -using Volo.Abp.Modularity; +using System; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Modularity; using Volo.Abp.Localization; using Volo.CmsKit.Localization; using Volo.Abp.Localization.ExceptionHandling; @@ -9,7 +11,8 @@ using Volo.Abp.VirtualFileSystem; namespace Volo.CmsKit { [DependsOn( - typeof(AbpValidationModule) + typeof(AbpValidationModule), + typeof(AbpGlobalFeaturesModule) )] public class CmsKitDomainSharedModule : AbpModule { diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index 99244d5d6c..58b8cf83cf 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -86,6 +86,7 @@ $projects = ( "framework/src/Volo.Abp.EventBus.RabbitMQ", "framework/src/Volo.Abp.Features", "framework/src/Volo.Abp.FluentValidation", + "framework/src/Volo.Abp.GlobalFeatures", "framework/src/Volo.Abp.Guids", "framework/src/Volo.Abp.HangFire", "framework/src/Volo.Abp.Http.Abstractions",