Browse Source

Make AbpApplication disposable.

pull/96/head
Halil İbrahim Kalkan 9 years ago
parent
commit
361598539d
  1. 19
      src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs
  2. 3
      src/Volo.Abp.TestBase/AbpIntegratedTest.cs
  3. 7
      src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs
  4. 2
      src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs
  5. 51
      src/Volo.Abp/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs
  6. 2
      src/Volo.Abp/Volo/Abp/IAbpApplication.cs
  7. 72
      test/Volo.Abp.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs

19
src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs

@ -25,22 +25,23 @@ namespace AbpDesk.ConsoleDemo
{
var services = new ServiceCollection();
var application = services.AddApplication<AbpDeskConsoleDemoModule>(options =>
using (var application = services.AddApplication<AbpDeskConsoleDemoModule>(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();
}
}
}

3
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();
}
}
}

7
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<IModuleManager>()
.ShutdownModules(new ApplicationShutdownContext());
}
public virtual void Dispose()
{
}
}
}

2
src/Volo.Abp/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs

@ -27,7 +27,7 @@ namespace Volo.Abp
ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(serviceProvider));
.InitializeModules(new ApplicationInitializationContext(ServiceProvider));
}
}
}

51
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<AbpApplicationCreationOptions> optionsAction
) : this(
startupModuleType,
new ServiceCollection(),
optionsAction)
{
}
private AbpApplicationWithInternalServiceProvider(
[NotNull] Type startupModuleType,
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction
) : base(
startupModuleType,
services,
optionsAction)
{
services.AddSingleton<IAbpApplicationWithInternalServiceProvider>(_ => this);
ServiceScope = services.BuildServiceProviderFromFactory().CreateScope();
ServiceProvider = ServiceScope.ServiceProvider;
}
public void Initialize()
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(ServiceProvider));
}
public override void Dispose()
{
base.Dispose();
ServiceScope.Dispose();
}
}
}

2
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; }

72
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<IndependentEmptyModule>();
//Assert
var module = services.GetSingletonInstance<IndependentEmptyModule>();
module.PreConfigureServicesIsCalled.ShouldBeTrue();
module.ConfigureServicesIsCalled.ShouldBeTrue();
module.PostConfigureServicesIsCalled.ShouldBeTrue();
using (var scope = services.BuildServiceProvider().CreateScope())
using (var application = services.AddApplication<IndependentEmptyModule>())
{
//Act
application.Initialize(scope.ServiceProvider);
//Assert
application.ServiceProvider.GetRequiredService<IndependentEmptyModule>().ShouldBeSameAs(module);
module.OnApplicationInitializeIsCalled.ShouldBeTrue();
var module = services.GetSingletonInstance<IndependentEmptyModule>();
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<IndependentEmptyModule>().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<IndependentEmptyModule>(options =>
using (var application = services.AddApplication<IndependentEmptyModule>(options =>
{
options.PlugInSources.AddTypes(typeof(IndependentEmptyPlugInModule));
});
//Assert
var plugInModule = services.GetSingletonInstance<IndependentEmptyPlugInModule>();
plugInModule.PreConfigureServicesIsCalled.ShouldBeTrue();
plugInModule.ConfigureServicesIsCalled.ShouldBeTrue();
plugInModule.PostConfigureServicesIsCalled.ShouldBeTrue();
}))
{
//Assert
var plugInModule = services.GetSingletonInstance<IndependentEmptyPlugInModule>();
plugInModule.PreConfigureServicesIsCalled.ShouldBeTrue();
plugInModule.ConfigureServicesIsCalled.ShouldBeTrue();
plugInModule.PostConfigureServicesIsCalled.ShouldBeTrue();
//Act
application.Initialize(services.BuildServiceProvider());
//Act
application.Initialize(services.BuildServiceProvider());
//Assert
application.ServiceProvider.GetRequiredService<IndependentEmptyPlugInModule>().ShouldBeSameAs(plugInModule);
plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue();
//Assert
application.ServiceProvider.GetRequiredService<IndependentEmptyPlugInModule>().ShouldBeSameAs(plugInModule);
plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue();
//Act
application.Shutdown();
//Act
application.Shutdown();
//Assert
plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue();
//Assert
plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue();
}
}
}
}
Loading…
Cancel
Save