diff --git a/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs b/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs index aeadd66108..f64bc5719a 100644 --- a/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs +++ b/src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs @@ -25,22 +25,23 @@ namespace AbpDesk.ConsoleDemo { var services = new ServiceCollection(); - var application = services.AddApplication(options => + using (var application = services.AddApplication(options => { options.UseAutofac(); AddPlugIns(options); - }); - - using (var scope = services.BuildServiceProviderFromFactory().CreateScope()) + })) { - application.Initialize(scope.ServiceProvider); + using (var scope = services.BuildServiceProviderFromFactory().CreateScope()) + { + application.Initialize(scope.ServiceProvider); - RunListers(application); + RunListers(application); - Console.WriteLine("Press ENTER to exit..."); - Console.ReadLine(); + Console.WriteLine("Press ENTER to exit..."); + Console.ReadLine(); - application.Shutdown(); + application.Shutdown(); + } } } diff --git a/src/Volo.Abp.TestBase/AbpIntegratedTest.cs b/src/Volo.Abp.TestBase/AbpIntegratedTest.cs index ed8058ab5c..a5a4e4e8a7 100644 --- a/src/Volo.Abp.TestBase/AbpIntegratedTest.cs +++ b/src/Volo.Abp.TestBase/AbpIntegratedTest.cs @@ -11,7 +11,7 @@ namespace Volo.Abp.TestBase protected IServiceProvider ServiceProvider => Application.ServiceProvider; - protected IServiceScope MainServiceScope { get; private set; } + protected IServiceScope MainServiceScope { get; } public AbpIntegratedTest() { @@ -59,6 +59,7 @@ namespace Volo.Abp.TestBase { Application.Shutdown(); MainServiceScope.Dispose(); + Application.Dispose(); } } } diff --git a/src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs b/src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs index 60ee713feb..a220c53535 100644 --- a/src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs +++ b/src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs @@ -46,11 +46,16 @@ namespace Volo.Abp ); } - public void Shutdown() //TODO: Why not disposable? + public virtual void Shutdown() { ServiceProvider .GetRequiredService() .ShutdownModules(new ApplicationShutdownContext()); } + + public virtual void Dispose() + { + + } } } \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs b/src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs index 79270ad93d..9be306c8c5 100644 --- a/src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs +++ b/src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs @@ -27,7 +27,7 @@ namespace Volo.Abp ServiceProvider .GetRequiredService() - .InitializeModules(new ApplicationInitializationContext(serviceProvider)); + .InitializeModules(new ApplicationInitializationContext(ServiceProvider)); } } } diff --git a/src/Volo.Abp/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs b/src/Volo.Abp/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs new file mode 100644 index 0000000000..bf34158eaf --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs @@ -0,0 +1,51 @@ +using System; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp +{ + internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, IAbpApplicationWithInternalServiceProvider + { + public IServiceScope ServiceScope { get; } + + public AbpApplicationWithInternalServiceProvider( + [NotNull] Type startupModuleType, + [CanBeNull] Action optionsAction + ) : this( + startupModuleType, + new ServiceCollection(), + optionsAction) + { + + } + + private AbpApplicationWithInternalServiceProvider( + [NotNull] Type startupModuleType, + [NotNull] IServiceCollection services, + [CanBeNull] Action optionsAction + ) : base( + startupModuleType, + services, + optionsAction) + { + services.AddSingleton(_ => this); + + ServiceScope = services.BuildServiceProviderFromFactory().CreateScope(); + ServiceProvider = ServiceScope.ServiceProvider; + } + + public void Initialize() + { + ServiceProvider + .GetRequiredService() + .InitializeModules(new ApplicationInitializationContext(ServiceProvider)); + } + + public override void Dispose() + { + base.Dispose(); + ServiceScope.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Volo/Abp/IAbpApplication.cs b/src/Volo.Abp/Volo/Abp/IAbpApplication.cs index c08d0eb452..501a6c5efe 100644 --- a/src/Volo.Abp/Volo/Abp/IAbpApplication.cs +++ b/src/Volo.Abp/Volo/Abp/IAbpApplication.cs @@ -3,7 +3,7 @@ using Volo.Abp.Modularity; namespace Volo.Abp { - public interface IAbpApplication + public interface IAbpApplication : IDisposable { Type StartupModuleType { get; } diff --git a/test/Volo.Abp.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs b/test/Volo.Abp.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs index b6f5bf5f9c..404aedf588 100644 --- a/test/Volo.Abp.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs +++ b/test/Volo.Abp.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs @@ -13,28 +13,29 @@ namespace Volo.Abp { //Arrange var services = new ServiceCollection(); - var application = services.AddApplication(); - - //Assert - var module = services.GetSingletonInstance(); - module.PreConfigureServicesIsCalled.ShouldBeTrue(); - module.ConfigureServicesIsCalled.ShouldBeTrue(); - module.PostConfigureServicesIsCalled.ShouldBeTrue(); - - using (var scope = services.BuildServiceProvider().CreateScope()) + using (var application = services.AddApplication()) { - //Act - application.Initialize(scope.ServiceProvider); - //Assert - application.ServiceProvider.GetRequiredService().ShouldBeSameAs(module); - module.OnApplicationInitializeIsCalled.ShouldBeTrue(); + var module = services.GetSingletonInstance(); + module.PreConfigureServicesIsCalled.ShouldBeTrue(); + module.ConfigureServicesIsCalled.ShouldBeTrue(); + module.PostConfigureServicesIsCalled.ShouldBeTrue(); - //Act - application.Shutdown(); + using (var scope = services.BuildServiceProvider().CreateScope()) + { + //Act + application.Initialize(scope.ServiceProvider); - //Assert - module.OnApplicationShutdownIsCalled.ShouldBeTrue(); + //Assert + application.ServiceProvider.GetRequiredService().ShouldBeSameAs(module); + module.OnApplicationInitializeIsCalled.ShouldBeTrue(); + + //Act + application.Shutdown(); + + //Assert + module.OnApplicationShutdownIsCalled.ShouldBeTrue(); + } } } @@ -45,29 +46,30 @@ namespace Volo.Abp var services = new ServiceCollection(); //Act - var application = services.AddApplication(options => + using (var application = services.AddApplication(options => { options.PlugInSources.AddTypes(typeof(IndependentEmptyPlugInModule)); - }); - - //Assert - var plugInModule = services.GetSingletonInstance(); - plugInModule.PreConfigureServicesIsCalled.ShouldBeTrue(); - plugInModule.ConfigureServicesIsCalled.ShouldBeTrue(); - plugInModule.PostConfigureServicesIsCalled.ShouldBeTrue(); + })) + { + //Assert + var plugInModule = services.GetSingletonInstance(); + plugInModule.PreConfigureServicesIsCalled.ShouldBeTrue(); + plugInModule.ConfigureServicesIsCalled.ShouldBeTrue(); + plugInModule.PostConfigureServicesIsCalled.ShouldBeTrue(); - //Act - application.Initialize(services.BuildServiceProvider()); + //Act + application.Initialize(services.BuildServiceProvider()); - //Assert - application.ServiceProvider.GetRequiredService().ShouldBeSameAs(plugInModule); - plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue(); + //Assert + application.ServiceProvider.GetRequiredService().ShouldBeSameAs(plugInModule); + plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue(); - //Act - application.Shutdown(); + //Act + application.Shutdown(); - //Assert - plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue(); + //Assert + plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue(); + } } } } \ No newline at end of file