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 services = new ServiceCollection();
var application = services.AddApplication<AbpDeskConsoleDemoModule>(options => using (var application = services.AddApplication<AbpDeskConsoleDemoModule>(options =>
{ {
options.UseAutofac(); options.UseAutofac();
AddPlugIns(options); 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.WriteLine("Press ENTER to exit...");
Console.ReadLine(); 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 IServiceProvider ServiceProvider => Application.ServiceProvider;
protected IServiceScope MainServiceScope { get; private set; } protected IServiceScope MainServiceScope { get; }
public AbpIntegratedTest() public AbpIntegratedTest()
{ {
@ -59,6 +59,7 @@ namespace Volo.Abp.TestBase
{ {
Application.Shutdown(); Application.Shutdown();
MainServiceScope.Dispose(); 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 ServiceProvider
.GetRequiredService<IModuleManager>() .GetRequiredService<IModuleManager>()
.ShutdownModules(new ApplicationShutdownContext()); .ShutdownModules(new ApplicationShutdownContext());
} }
public virtual void Dispose()
{
}
} }
} }

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

@ -27,7 +27,7 @@ namespace Volo.Abp
ServiceProvider ServiceProvider
.GetRequiredService<IModuleManager>() .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 namespace Volo.Abp
{ {
public interface IAbpApplication public interface IAbpApplication : IDisposable
{ {
Type StartupModuleType { get; } Type StartupModuleType { get; }

72
test/Volo.Abp.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs

@ -13,28 +13,29 @@ namespace Volo.Abp
{ {
//Arrange //Arrange
var services = new ServiceCollection(); var services = new ServiceCollection();
var application = services.AddApplication<IndependentEmptyModule>(); using (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())
{ {
//Act
application.Initialize(scope.ServiceProvider);
//Assert //Assert
application.ServiceProvider.GetRequiredService<IndependentEmptyModule>().ShouldBeSameAs(module); var module = services.GetSingletonInstance<IndependentEmptyModule>();
module.OnApplicationInitializeIsCalled.ShouldBeTrue(); module.PreConfigureServicesIsCalled.ShouldBeTrue();
module.ConfigureServicesIsCalled.ShouldBeTrue();
module.PostConfigureServicesIsCalled.ShouldBeTrue();
//Act using (var scope = services.BuildServiceProvider().CreateScope())
application.Shutdown(); {
//Act
application.Initialize(scope.ServiceProvider);
//Assert //Assert
module.OnApplicationShutdownIsCalled.ShouldBeTrue(); 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(); var services = new ServiceCollection();
//Act //Act
var application = services.AddApplication<IndependentEmptyModule>(options => using (var application = services.AddApplication<IndependentEmptyModule>(options =>
{ {
options.PlugInSources.AddTypes(typeof(IndependentEmptyPlugInModule)); options.PlugInSources.AddTypes(typeof(IndependentEmptyPlugInModule));
}); }))
{
//Assert //Assert
var plugInModule = services.GetSingletonInstance<IndependentEmptyPlugInModule>(); var plugInModule = services.GetSingletonInstance<IndependentEmptyPlugInModule>();
plugInModule.PreConfigureServicesIsCalled.ShouldBeTrue(); plugInModule.PreConfigureServicesIsCalled.ShouldBeTrue();
plugInModule.ConfigureServicesIsCalled.ShouldBeTrue(); plugInModule.ConfigureServicesIsCalled.ShouldBeTrue();
plugInModule.PostConfigureServicesIsCalled.ShouldBeTrue(); plugInModule.PostConfigureServicesIsCalled.ShouldBeTrue();
//Act //Act
application.Initialize(services.BuildServiceProvider()); application.Initialize(services.BuildServiceProvider());
//Assert //Assert
application.ServiceProvider.GetRequiredService<IndependentEmptyPlugInModule>().ShouldBeSameAs(plugInModule); application.ServiceProvider.GetRequiredService<IndependentEmptyPlugInModule>().ShouldBeSameAs(plugInModule);
plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue(); plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue();
//Act //Act
application.Shutdown(); application.Shutdown();
//Assert //Assert
plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue(); plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue();
}
} }
} }
} }
Loading…
Cancel
Save