From a9eacacdb9fb0c91466b05ba88463cbf3d954b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 20 Oct 2022 17:31:09 +0300 Subject: [PATCH 1/2] Get application name's default value from the entrance assembly --- ...erviceCollectionConfigurationExtensions.cs | 14 ++++++++-- .../Volo/Abp/AbpApplicationBase.cs | 28 ++++++++++++++++++- .../Volo/Abp/IApplicationNameAccessor.cs | 3 ++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs index 8e8fc47ad5..61cde24347 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs @@ -1,6 +1,8 @@ -using Microsoft.Extensions.Configuration; +using JetBrains.Annotations; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; +using Volo.Abp; namespace Microsoft.Extensions.DependencyInjection; @@ -11,7 +13,15 @@ public static class ServiceCollectionConfigurationExtensions return services.Replace(ServiceDescriptor.Singleton(configuration)); } + [NotNull] public static IConfiguration GetConfiguration(this IServiceCollection services) + { + return services.GetConfigurationOrNull() ?? + throw new AbpException("Could not find an implementation of " + typeof(IConfiguration).AssemblyQualifiedName + " in the service collection."); + } + + [CanBeNull] + public static IConfiguration GetConfigurationOrNull(this IServiceCollection services) { var hostBuilderContext = services.GetSingletonInstanceOrNull(); if (hostBuilderContext?.Configuration != null) @@ -19,6 +29,6 @@ public static class ServiceCollectionConfigurationExtensions return hostBuilderContext.Configuration as IConfigurationRoot; } - return services.GetSingletonInstance(); + return services.GetSingletonInstanceOrNull(); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index 87ddf14c1b..eec9af02fb 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -44,7 +44,7 @@ public abstract class AbpApplicationBase : IAbpApplication var options = new AbpApplicationCreationOptions(services); optionsAction?.Invoke(options); - ApplicationName = options.ApplicationName; + ApplicationName = GetApplicationName(options); services.AddSingleton(this); services.AddSingleton(this); @@ -312,4 +312,30 @@ public abstract class AbpApplicationBase : IAbpApplication _configuredServices = true; } + + private static string GetApplicationName(AbpApplicationCreationOptions options) + { + if (!string.IsNullOrWhiteSpace(options.ApplicationName)) + { + return options.ApplicationName; + } + + var configuration = options.Services.GetConfigurationOrNull(); + if (configuration != null) + { + var appNameConfig = configuration["ApplicationName"]; + if (string.IsNullOrWhiteSpace(appNameConfig)) + { + return appNameConfig; + } + } + + var entryAssembly = Assembly.GetEntryAssembly(); + if (entryAssembly != null) + { + return entryAssembly.GetName().Name; + } + + return null; + } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs index 0047fcbcdf..e814a0c317 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs @@ -1,3 +1,5 @@ +using JetBrains.Annotations; + namespace Volo.Abp; public interface IApplicationNameAccessor @@ -7,5 +9,6 @@ public interface IApplicationNameAccessor /// This is useful for systems with multiple applications, to distinguish /// resources of the applications located together. /// + [CanBeNull] string ApplicationName { get; } } \ No newline at end of file From f24d51dca35c4a2296ad5f689c1efa4ca3a516a3 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 21 Oct 2022 08:58:52 +0800 Subject: [PATCH 2/2] Add unit test. --- .../Volo/Abp/AbpApplicationBase.cs | 12 ++--- .../Abp/AbpApplication_Initialize_Tests.cs | 51 ++++++++++++++++--- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index eec9af02fb..74f263198b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -23,7 +23,7 @@ public abstract class AbpApplicationBase : IAbpApplication public IServiceCollection Services { get; } public IReadOnlyList Modules { get; } - + public string ApplicationName { get; } private bool _configuredServices; @@ -43,7 +43,7 @@ public abstract class AbpApplicationBase : IAbpApplication var options = new AbpApplicationCreationOptions(services); optionsAction?.Invoke(options); - + ApplicationName = GetApplicationName(options); services.AddSingleton(this); @@ -147,7 +147,7 @@ public abstract class AbpApplicationBase : IAbpApplication public virtual async Task ConfigureServicesAsync() { CheckMultipleConfigureServices(); - + var context = new ServiceConfigurationContext(Services); Services.AddSingleton(context); @@ -312,7 +312,7 @@ public abstract class AbpApplicationBase : IAbpApplication _configuredServices = true; } - + private static string GetApplicationName(AbpApplicationCreationOptions options) { if (!string.IsNullOrWhiteSpace(options.ApplicationName)) @@ -324,12 +324,12 @@ public abstract class AbpApplicationBase : IAbpApplication if (configuration != null) { var appNameConfig = configuration["ApplicationName"]; - if (string.IsNullOrWhiteSpace(appNameConfig)) + if (!string.IsNullOrWhiteSpace(appNameConfig)) { return appNameConfig; } } - + var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly != null) { diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs index 9eff208198..0123bf1d0d 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs @@ -1,10 +1,16 @@ -using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using NSubstitute; using Shouldly; using Volo.Abp.DependencyInjection; using Volo.Abp.Modularity; using Volo.Abp.Modularity.PlugIns; using Xunit; +using IConfiguration = Castle.Core.Configuration.IConfiguration; namespace Volo.Abp; @@ -147,8 +153,8 @@ public class AbpApplication_Initialize_Tests [Fact] public void Should_Set_And_Get_ApplicationName() { - const string applicationName = "MyApplication"; - + var applicationName = "MyApplication"; + using (var application = AbpApplicationFactory.Create(options => { options.ApplicationName = applicationName; @@ -156,16 +162,49 @@ public class AbpApplication_Initialize_Tests { application.ApplicationName.ShouldBe(applicationName); application.Services.GetApplicationName().ShouldBe(applicationName); - + application.Initialize(); - + + application.ServiceProvider + .GetRequiredService() + .ApplicationName + .ShouldBe(applicationName); + } + + using (var application = AbpApplicationFactory.Create(options => + { + options.Services.ReplaceConfiguration(new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary {{"ApplicationName", applicationName}}) + .Build()); + })) + { + + application.ApplicationName.ShouldBe(applicationName); + application.Services.GetApplicationName().ShouldBe(applicationName); + + application.Initialize(); + + application.ServiceProvider + .GetRequiredService() + .ApplicationName + .ShouldBe(applicationName); + } + + applicationName = Assembly.GetEntryAssembly()?.GetName().Name; + using (var application = AbpApplicationFactory.Create()) + { + application.ApplicationName.ShouldBe(applicationName); + application.Services.GetApplicationName().ShouldBe(applicationName); + + application.Initialize(); + application.ServiceProvider .GetRequiredService() .ApplicationName .ShouldBe(applicationName); } } - + [Fact] public async Task Should_Resolve_Root_Service_Provider() {