Browse Source

Refactored.

pull/96/head
Halil İbrahim Kalkan 9 years ago
parent
commit
7511853740
  1. 17
      src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs
  2. 3
      src/Volo.Abp/Volo/Abp/AbpApplicationBase.cs
  3. 30
      src/Volo.Abp/Volo/Abp/AbpApplicationFactory.cs
  4. 9
      src/Volo.Abp/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs
  5. 20
      src/Volo.Abp/Volo/Abp/IAbpApplication.cs
  6. 37
      test/Volo.Abp.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs

17
src/AbpDesk/AbpDesk.ConsoleDemo/AbpDesk/ConsoleDemo/Program.cs

@ -23,25 +23,20 @@ namespace AbpDesk.ConsoleDemo
private static void RunDemo() private static void RunDemo()
{ {
var services = new ServiceCollection(); using (var application = AbpApplicationFactory.Create<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();
{
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/Volo/Abp/AbpApplicationBase.cs

@ -13,6 +13,8 @@ namespace Volo.Abp
public IServiceProvider ServiceProvider { get; protected set; } public IServiceProvider ServiceProvider { get; protected set; }
public IServiceCollection Services { get; }
[NotNull] [NotNull]
public AbpModuleDescriptor[] Modules { get; } public AbpModuleDescriptor[] Modules { get; }
@ -25,6 +27,7 @@ namespace Volo.Abp
Check.NotNull(services, nameof(services)); Check.NotNull(services, nameof(services));
StartupModuleType = startupModuleType; StartupModuleType = startupModuleType;
Services = services;
var options = new AbpApplicationCreationOptions(services); var options = new AbpApplicationCreationOptions(services);
optionsAction?.Invoke(options); optionsAction?.Invoke(options);

30
src/Volo.Abp/Volo/Abp/AbpApplicationFactory.cs

@ -7,32 +7,36 @@ namespace Volo.Abp
{ {
public static class AbpApplicationFactory public static class AbpApplicationFactory
{ {
public static IAbpApplicationWithExternalServiceProvider Create<TStartupModule>( // IAbpApplicationWithExternalServiceProvider //////////////////////////////////////
[NotNull] IServiceCollection services)
public static IAbpApplicationWithInternalServiceProvider Create<TStartupModule>(
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
where TStartupModule : IAbpModule where TStartupModule : IAbpModule
{ {
return Create<TStartupModule>(services, null); return Create(typeof(TStartupModule), optionsAction);
} }
public static IAbpApplicationWithExternalServiceProvider Create<TStartupModule>( public static IAbpApplicationWithInternalServiceProvider Create(
[NotNull] IServiceCollection services, [NotNull] Type startupModuleType,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction) [CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
where TStartupModule : IAbpModule
{ {
return new AbpApplicationWithExternalServiceProvider(typeof(TStartupModule), services, optionsAction); return new AbpApplicationWithInternalServiceProvider(startupModuleType, optionsAction);
} }
public static IAbpApplicationWithExternalServiceProvider Create( // IAbpApplicationWithExternalServiceProvider //////////////////////////////////////
[NotNull] Type startupModuleType,
[NotNull] IServiceCollection services) public static IAbpApplicationWithExternalServiceProvider Create<TStartupModule>(
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
where TStartupModule : IAbpModule
{ {
return Create(startupModuleType, services, null); return Create(typeof(TStartupModule), services, optionsAction);
} }
public static IAbpApplicationWithExternalServiceProvider Create( public static IAbpApplicationWithExternalServiceProvider Create(
[NotNull] Type startupModuleType, [NotNull] Type startupModuleType,
[NotNull] IServiceCollection services, [NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction) [CanBeNull] Action<AbpApplicationCreationOptions> optionsAction = null)
{ {
return new AbpApplicationWithExternalServiceProvider(startupModuleType, services, optionsAction); return new AbpApplicationWithExternalServiceProvider(startupModuleType, services, optionsAction);
} }

9
src/Volo.Abp/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs

@ -7,7 +7,7 @@ namespace Volo.Abp
{ {
internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, IAbpApplicationWithInternalServiceProvider internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, IAbpApplicationWithInternalServiceProvider
{ {
public IServiceScope ServiceScope { get; } public IServiceScope ServiceScope { get; private set; }
public AbpApplicationWithInternalServiceProvider( public AbpApplicationWithInternalServiceProvider(
[NotNull] Type startupModuleType, [NotNull] Type startupModuleType,
@ -29,14 +29,13 @@ namespace Volo.Abp
services, services,
optionsAction) optionsAction)
{ {
services.AddSingleton<IAbpApplicationWithInternalServiceProvider>(_ => this); Services.AddSingleton<IAbpApplicationWithInternalServiceProvider>(_ => this);
ServiceScope = services.BuildServiceProviderFromFactory().CreateScope();
ServiceProvider = ServiceScope.ServiceProvider;
} }
public void Initialize() public void Initialize()
{ {
ServiceScope = Services.BuildServiceProviderFromFactory().CreateScope();
ServiceProvider = ServiceScope.ServiceProvider;
ServiceProvider ServiceProvider
.GetRequiredService<IModuleManager>() .GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(ServiceProvider)); .InitializeModules(new ApplicationInitializationContext(ServiceProvider));

20
src/Volo.Abp/Volo/Abp/IAbpApplication.cs

@ -1,16 +1,36 @@
using System; using System;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Volo.Abp namespace Volo.Abp
{ {
public interface IAbpApplication : IDisposable public interface IAbpApplication : IDisposable
{ {
/// <summary>
/// Type of the startup (entrance) module of the application.
/// </summary>
Type StartupModuleType { get; } Type StartupModuleType { get; }
/// <summary>
/// List of services registered to this application.
/// Can not add new services to this collection after application initialize.
/// </summary>
IServiceCollection Services { get; }
/// <summary>
/// Reference to the root service provider used by the application.
/// This can not be used before initialize the application.
/// </summary>
IServiceProvider ServiceProvider { get; } IServiceProvider ServiceProvider { get; }
/// <summary>
/// List of modules loaded into this application.
/// </summary>
AbpModuleDescriptor[] Modules { get; } AbpModuleDescriptor[] Modules { get; }
/// <summary>
/// Used to gracefully shutdown the application and all modules.
/// </summary>
void Shutdown(); void Shutdown();
} }
} }

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

@ -11,54 +11,45 @@ namespace Volo.Abp
[Fact] [Fact]
public void Should_Initialize_Single_Module() public void Should_Initialize_Single_Module()
{ {
//Arrange using (var application = AbpApplicationFactory.Create<IndependentEmptyModule>())
var services = new ServiceCollection();
using (var application = services.AddApplication<IndependentEmptyModule>())
{ {
//Assert //Assert
var module = services.GetSingletonInstance<IndependentEmptyModule>(); var module = application.Services.GetSingletonInstance<IndependentEmptyModule>();
module.PreConfigureServicesIsCalled.ShouldBeTrue(); module.PreConfigureServicesIsCalled.ShouldBeTrue();
module.ConfigureServicesIsCalled.ShouldBeTrue(); module.ConfigureServicesIsCalled.ShouldBeTrue();
module.PostConfigureServicesIsCalled.ShouldBeTrue(); module.PostConfigureServicesIsCalled.ShouldBeTrue();
using (var scope = services.BuildServiceProvider().CreateScope()) //Act
{ application.Initialize();
//Act
application.Initialize(scope.ServiceProvider);
//Assert //Assert
application.ServiceProvider.GetRequiredService<IndependentEmptyModule>().ShouldBeSameAs(module); application.ServiceProvider.GetRequiredService<IndependentEmptyModule>().ShouldBeSameAs(module);
module.OnApplicationInitializeIsCalled.ShouldBeTrue(); module.OnApplicationInitializeIsCalled.ShouldBeTrue();
//Act //Act
application.Shutdown(); application.Shutdown();
//Assert //Assert
module.OnApplicationShutdownIsCalled.ShouldBeTrue(); module.OnApplicationShutdownIsCalled.ShouldBeTrue();
}
} }
} }
[Fact] [Fact]
public void Should_Initialize_PlugIn() public void Should_Initialize_PlugIn()
{ {
//Arrange using (var application = AbpApplicationFactory.Create<IndependentEmptyModule>(options =>
var services = new ServiceCollection();
//Act
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 = application.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();
//Assert //Assert
application.ServiceProvider.GetRequiredService<IndependentEmptyPlugInModule>().ShouldBeSameAs(plugInModule); application.ServiceProvider.GetRequiredService<IndependentEmptyPlugInModule>().ShouldBeSameAs(plugInModule);

Loading…
Cancel
Save