Browse Source

Merge pull request #14403 from abpframework/appname-default

Get application name's default value from the entrance assembly
pull/14410/head
maliming 4 years ago
committed by GitHub
parent
commit
7106bc3025
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionConfigurationExtensions.cs
  2. 34
      framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs
  3. 3
      framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs
  4. 51
      framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs

14
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.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Volo.Abp;
namespace Microsoft.Extensions.DependencyInjection; namespace Microsoft.Extensions.DependencyInjection;
@ -11,7 +13,15 @@ public static class ServiceCollectionConfigurationExtensions
return services.Replace(ServiceDescriptor.Singleton<IConfiguration>(configuration)); return services.Replace(ServiceDescriptor.Singleton<IConfiguration>(configuration));
} }
[NotNull]
public static IConfiguration GetConfiguration(this IServiceCollection services) 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<HostBuilderContext>(); var hostBuilderContext = services.GetSingletonInstanceOrNull<HostBuilderContext>();
if (hostBuilderContext?.Configuration != null) if (hostBuilderContext?.Configuration != null)
@ -19,6 +29,6 @@ public static class ServiceCollectionConfigurationExtensions
return hostBuilderContext.Configuration as IConfigurationRoot; return hostBuilderContext.Configuration as IConfigurationRoot;
} }
return services.GetSingletonInstance<IConfiguration>(); return services.GetSingletonInstanceOrNull<IConfiguration>();
} }
} }

34
framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs

@ -23,7 +23,7 @@ public abstract class AbpApplicationBase : IAbpApplication
public IServiceCollection Services { get; } public IServiceCollection Services { get; }
public IReadOnlyList<IAbpModuleDescriptor> Modules { get; } public IReadOnlyList<IAbpModuleDescriptor> Modules { get; }
public string ApplicationName { get; } public string ApplicationName { get; }
private bool _configuredServices; private bool _configuredServices;
@ -43,8 +43,8 @@ public abstract class AbpApplicationBase : IAbpApplication
var options = new AbpApplicationCreationOptions(services); var options = new AbpApplicationCreationOptions(services);
optionsAction?.Invoke(options); optionsAction?.Invoke(options);
ApplicationName = options.ApplicationName; ApplicationName = GetApplicationName(options);
services.AddSingleton<IAbpApplication>(this); services.AddSingleton<IAbpApplication>(this);
services.AddSingleton<IApplicationNameAccessor>(this); services.AddSingleton<IApplicationNameAccessor>(this);
@ -147,7 +147,7 @@ public abstract class AbpApplicationBase : IAbpApplication
public virtual async Task ConfigureServicesAsync() public virtual async Task ConfigureServicesAsync()
{ {
CheckMultipleConfigureServices(); CheckMultipleConfigureServices();
var context = new ServiceConfigurationContext(Services); var context = new ServiceConfigurationContext(Services);
Services.AddSingleton(context); Services.AddSingleton(context);
@ -312,4 +312,30 @@ public abstract class AbpApplicationBase : IAbpApplication
_configuredServices = true; _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;
}
} }

3
framework/src/Volo.Abp.Core/Volo/Abp/IApplicationNameAccessor.cs

@ -1,3 +1,5 @@
using JetBrains.Annotations;
namespace Volo.Abp; namespace Volo.Abp;
public interface IApplicationNameAccessor public interface IApplicationNameAccessor
@ -7,5 +9,6 @@ public interface IApplicationNameAccessor
/// This is useful for systems with multiple applications, to distinguish /// This is useful for systems with multiple applications, to distinguish
/// resources of the applications located together. /// resources of the applications located together.
/// </summary> /// </summary>
[CanBeNull]
string ApplicationName { get; } string ApplicationName { get; }
} }

51
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 Microsoft.Extensions.DependencyInjection;
using NSubstitute;
using Shouldly; using Shouldly;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Modularity.PlugIns; using Volo.Abp.Modularity.PlugIns;
using Xunit; using Xunit;
using IConfiguration = Castle.Core.Configuration.IConfiguration;
namespace Volo.Abp; namespace Volo.Abp;
@ -147,8 +153,8 @@ public class AbpApplication_Initialize_Tests
[Fact] [Fact]
public void Should_Set_And_Get_ApplicationName() public void Should_Set_And_Get_ApplicationName()
{ {
const string applicationName = "MyApplication"; var applicationName = "MyApplication";
using (var application = AbpApplicationFactory.Create<IndependentEmptyModule>(options => using (var application = AbpApplicationFactory.Create<IndependentEmptyModule>(options =>
{ {
options.ApplicationName = applicationName; options.ApplicationName = applicationName;
@ -156,16 +162,49 @@ public class AbpApplication_Initialize_Tests
{ {
application.ApplicationName.ShouldBe(applicationName); application.ApplicationName.ShouldBe(applicationName);
application.Services.GetApplicationName().ShouldBe(applicationName); application.Services.GetApplicationName().ShouldBe(applicationName);
application.Initialize(); application.Initialize();
application.ServiceProvider
.GetRequiredService<IApplicationNameAccessor>()
.ApplicationName
.ShouldBe(applicationName);
}
using (var application = AbpApplicationFactory.Create<IndependentEmptyModule>(options =>
{
options.Services.ReplaceConfiguration(new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string> {{"ApplicationName", applicationName}})
.Build());
}))
{
application.ApplicationName.ShouldBe(applicationName);
application.Services.GetApplicationName().ShouldBe(applicationName);
application.Initialize();
application.ServiceProvider
.GetRequiredService<IApplicationNameAccessor>()
.ApplicationName
.ShouldBe(applicationName);
}
applicationName = Assembly.GetEntryAssembly()?.GetName().Name;
using (var application = AbpApplicationFactory.Create<IndependentEmptyModule>())
{
application.ApplicationName.ShouldBe(applicationName);
application.Services.GetApplicationName().ShouldBe(applicationName);
application.Initialize();
application.ServiceProvider application.ServiceProvider
.GetRequiredService<IApplicationNameAccessor>() .GetRequiredService<IApplicationNameAccessor>()
.ApplicationName .ApplicationName
.ShouldBe(applicationName); .ShouldBe(applicationName);
} }
} }
[Fact] [Fact]
public async Task Should_Resolve_Root_Service_Provider() public async Task Should_Resolve_Root_Service_Provider()
{ {

Loading…
Cancel
Save