diff --git a/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs b/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs index c4169e9186..aeadd66108 100644 --- a/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs +++ b/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs @@ -44,7 +44,7 @@ namespace AbpDesk.ConsoleDemo } } - private static void RunListers(AbpApplication application) + private static void RunListers(IAbpApplication application) { application .ServiceProvider diff --git a/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index 7082785868..5ab6e59158 100644 --- a/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Builder Check.NotNull(app, nameof(app)); app.ApplicationServices.GetRequiredService>().Value = app; - app.ApplicationServices.GetRequiredService().Initialize(app.ApplicationServices); + app.ApplicationServices.GetRequiredService().Initialize(app.ApplicationServices); } } } diff --git a/src/Volo.Abp.TestBase/AbpIntegratedTest.cs b/src/Volo.Abp.TestBase/AbpIntegratedTest.cs index a036717745..ed8058ab5c 100644 --- a/src/Volo.Abp.TestBase/AbpIntegratedTest.cs +++ b/src/Volo.Abp.TestBase/AbpIntegratedTest.cs @@ -7,7 +7,7 @@ namespace Volo.Abp.TestBase public class AbpIntegratedTest : IDisposable where TStartupModule : IAbpModule { - protected AbpApplication Application { get; } + protected IAbpApplication Application { get; } protected IServiceProvider ServiceProvider => Application.ServiceProvider; @@ -19,14 +19,15 @@ namespace Volo.Abp.TestBase BeforeAddApplication(services); - Application = services.AddApplication(SetAbpApplicationCreationOptions); + var application = services.AddApplication(SetAbpApplicationCreationOptions); + Application = application; AfterAddApplication(services); MainServiceScope = CreateServiceProvider(services).CreateScope(); var serviceProvider = MainServiceScope.ServiceProvider; - Application.Initialize(serviceProvider); + application.Initialize(serviceProvider); } protected virtual IServiceCollection CreateServiceCollection() diff --git a/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs b/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs index bdd2139d42..627ba14c52 100644 --- a/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs +++ b/src/Volo.Abp/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs @@ -7,34 +7,34 @@ namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionApplicationExtensions { - public static AbpApplication AddApplication( + public static IAbpApplicationWithExternalServiceProvider AddApplication( [NotNull] this IServiceCollection services) where TStartupModule : IAbpModule { - return AbpApplication.Create(services); + return AbpApplicationFactory.Create(services); } - public static AbpApplication AddApplication( + public static IAbpApplicationWithExternalServiceProvider AddApplication( [NotNull] this IServiceCollection services, [CanBeNull] Action optionsAction) where TStartupModule : IAbpModule { - return AbpApplication.Create(services, optionsAction); + return AbpApplicationFactory.Create(services, optionsAction); } - public static AbpApplication AddApplication( + public static IAbpApplicationWithExternalServiceProvider AddApplication( [NotNull] this IServiceCollection services, [NotNull] Type startupModuleType) { - return AbpApplication.Create(startupModuleType, services); + return AbpApplicationFactory.Create(startupModuleType, services); } - public static AbpApplication AddApplication( + public static IAbpApplicationWithExternalServiceProvider AddApplication( [NotNull] this IServiceCollection services, [NotNull] Type startupModuleType, [CanBeNull] Action optionsAction) { - return AbpApplication.Create(startupModuleType, services, optionsAction); + return AbpApplicationFactory.Create(startupModuleType, services, optionsAction); } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/AbpApplication.cs b/src/Volo.Abp/Volo/Abp/AbpApplication.cs deleted file mode 100644 index 348636b501..0000000000 --- a/src/Volo.Abp/Volo/Abp/AbpApplication.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Internal; -using Volo.Abp.Modularity; - -namespace Volo.Abp -{ - public class AbpApplication - { - [NotNull] - public Type StartupModuleType { get; } - - public IServiceProvider ServiceProvider { get; private set; } - - [NotNull] - internal AbpModuleDescriptor[] Modules { get; } - - private AbpApplication( - [NotNull] Type startupModuleType, - [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction) - { - Check.NotNull(startupModuleType, nameof(startupModuleType)); - Check.NotNull(services, nameof(services)); - - StartupModuleType = startupModuleType; - - var options = new AbpApplicationCreationOptions(services); - optionsAction?.Invoke(options); - - services.AddCoreAbpServices(this); - Modules = LoadModules(services, options); - } - - internal static AbpApplication Create([NotNull] IServiceCollection services) - where TStartupModule : IAbpModule - { - return Create(services, null); - } - - internal static AbpApplication Create( - [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction) - where TStartupModule : IAbpModule - { - return new AbpApplication(typeof(TStartupModule), services, optionsAction); - } - - internal static AbpApplication Create( - [NotNull] Type startupModuleType, - [NotNull] IServiceCollection services) - { - return Create(startupModuleType, services, null); - } - - internal static AbpApplication Create( - [NotNull] Type startupModuleType, - [NotNull] IServiceCollection services, - [CanBeNull] Action optionsAction) - { - return new AbpApplication(startupModuleType, services, optionsAction); - } - - public void Initialize([NotNull] IServiceProvider serviceProvider) - { - Check.NotNull(serviceProvider, nameof(serviceProvider)); - - ServiceProvider = serviceProvider; - - ServiceProvider - .GetRequiredService() - .InitializeModules(new ApplicationInitializationContext(serviceProvider)); - } - - private AbpModuleDescriptor[] LoadModules(IServiceCollection services, AbpApplicationCreationOptions options) - { - return services - .GetSingletonInstance() - .LoadModules( - services, - StartupModuleType, - options.PlugInSources - ); - } - - public void Shutdown() - { - ServiceProvider - .GetRequiredService() - .ShutdownModules(new ApplicationShutdownContext()); - } - } -} diff --git a/src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs b/src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs new file mode 100644 index 0000000000..60ee713feb --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs @@ -0,0 +1,56 @@ +using System; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Internal; +using Volo.Abp.Modularity; + +namespace Volo.Abp +{ + public abstract class AbpApplicationBase : IAbpApplication + { + [NotNull] + public Type StartupModuleType { get; } + + public IServiceProvider ServiceProvider { get; protected set; } + + [NotNull] + public AbpModuleDescriptor[] Modules { get; } + + internal AbpApplicationBase( + [NotNull] Type startupModuleType, + [NotNull] IServiceCollection services, + [CanBeNull] Action optionsAction) + { + Check.NotNull(startupModuleType, nameof(startupModuleType)); + Check.NotNull(services, nameof(services)); + + StartupModuleType = startupModuleType; + + var options = new AbpApplicationCreationOptions(services); + optionsAction?.Invoke(options); + + services.AddSingleton(_ => this); + services.AddCoreAbpServices(); + + Modules = LoadModules(services, options); + } + + private AbpModuleDescriptor[] LoadModules(IServiceCollection services, AbpApplicationCreationOptions options) + { + return services + .GetSingletonInstance() + .LoadModules( + services, + StartupModuleType, + options.PlugInSources + ); + } + + public void Shutdown() //TODO: Why not disposable? + { + ServiceProvider + .GetRequiredService() + .ShutdownModules(new ApplicationShutdownContext()); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/AbpApplicationFactory.cs b/src/Volo.Abp/Volo/Abp/AbpApplicationFactory.cs new file mode 100644 index 0000000000..f77cb136b2 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/AbpApplicationFactory.cs @@ -0,0 +1,40 @@ +using System; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp +{ + public static class AbpApplicationFactory + { + public static IAbpApplicationWithExternalServiceProvider Create( + [NotNull] IServiceCollection services) + where TStartupModule : IAbpModule + { + return Create(services, null); + } + + public static IAbpApplicationWithExternalServiceProvider Create( + [NotNull] IServiceCollection services, + [CanBeNull] Action optionsAction) + where TStartupModule : IAbpModule + { + return new AbpApplicationWithExternalServiceProvider(typeof(TStartupModule), services, optionsAction); + } + + public static IAbpApplicationWithExternalServiceProvider Create( + [NotNull] Type startupModuleType, + [NotNull] IServiceCollection services) + { + return Create(startupModuleType, services, null); + } + + public static IAbpApplicationWithExternalServiceProvider Create( + [NotNull] Type startupModuleType, + [NotNull] IServiceCollection services, + [CanBeNull] Action optionsAction) + { + return new AbpApplicationWithExternalServiceProvider(startupModuleType, services, optionsAction); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs b/src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs new file mode 100644 index 0000000000..79270ad93d --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs @@ -0,0 +1,33 @@ +using System; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp +{ + internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, IAbpApplicationWithExternalServiceProvider + { + public AbpApplicationWithExternalServiceProvider( + [NotNull] Type startupModuleType, + [NotNull] IServiceCollection services, + [CanBeNull] Action optionsAction + ) : base( + startupModuleType, + services, + optionsAction) + { + services.AddSingleton(_ => this); + } + + public void Initialize(IServiceProvider serviceProvider) + { + Check.NotNull(serviceProvider, nameof(serviceProvider)); + + ServiceProvider = serviceProvider; + + ServiceProvider + .GetRequiredService() + .InitializeModules(new ApplicationInitializationContext(serviceProvider)); + } + } +} diff --git a/src/Volo.Abp/Volo/Abp/IAbpApplication.cs b/src/Volo.Abp/Volo/Abp/IAbpApplication.cs new file mode 100644 index 0000000000..c08d0eb452 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/IAbpApplication.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.Modularity; + +namespace Volo.Abp +{ + public interface IAbpApplication + { + Type StartupModuleType { get; } + + IServiceProvider ServiceProvider { get; } + + AbpModuleDescriptor[] Modules { get; } + + void Shutdown(); + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs b/src/Volo.Abp/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs new file mode 100644 index 0000000000..1c522a438a --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs @@ -0,0 +1,10 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp +{ + public interface IAbpApplicationWithExternalServiceProvider : IAbpApplication + { + void Initialize([NotNull] IServiceProvider serviceProvider); + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs b/src/Volo.Abp/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs new file mode 100644 index 0000000000..b598535292 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp +{ + public interface IAbpApplicationWithInternalServiceProvider : IAbpApplication + { + void Initialize(); + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs b/src/Volo.Abp/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs index 7cff8bf66c..9127803a0e 100644 --- a/src/Volo.Abp/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs +++ b/src/Volo.Abp/Volo/Abp/Internal/InternalServiceCollectionExtensions.cs @@ -6,9 +6,8 @@ namespace Volo.Abp.Internal { internal static class InternalServiceCollectionExtensions { - internal static void AddCoreAbpServices(this IServiceCollection services, AbpApplication application) + internal static void AddCoreAbpServices(this IServiceCollection services) { - services.AddSingleton(application); services.TryAddSingleton(new ModuleLoader()); } } diff --git a/src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs b/src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs index bbb629d8d7..0541b5e6c7 100644 --- a/src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs +++ b/src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.Modularity private readonly ILogger _logger; public ModuleManager( - AbpApplication application, + IAbpApplication application, IEnumerable lifecycleContributers, ILogger logger) {