#82 Introduce IAbpApplication and other interface and base classes to sperate internal and external service provider based applications.

pull/96/head
Halil İbrahim Kalkan 8 years ago
parent 977f7f59b8
commit 754a711c24

@ -44,7 +44,7 @@ namespace AbpDesk.ConsoleDemo
}
}
private static void RunListers(AbpApplication application)
private static void RunListers(IAbpApplication application)
{
application
.ServiceProvider

@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Builder
Check.NotNull(app, nameof(app));
app.ApplicationServices.GetRequiredService<ObjectAccessor<IApplicationBuilder>>().Value = app;
app.ApplicationServices.GetRequiredService<AbpApplication>().Initialize(app.ApplicationServices);
app.ApplicationServices.GetRequiredService<IAbpApplicationWithExternalServiceProvider>().Initialize(app.ApplicationServices);
}
}
}

@ -7,7 +7,7 @@ namespace Volo.Abp.TestBase
public class AbpIntegratedTest<TStartupModule> : 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<TStartupModule>(SetAbpApplicationCreationOptions);
var application = services.AddApplication<TStartupModule>(SetAbpApplicationCreationOptions);
Application = application;
AfterAddApplication(services);
MainServiceScope = CreateServiceProvider(services).CreateScope();
var serviceProvider = MainServiceScope.ServiceProvider;
Application.Initialize(serviceProvider);
application.Initialize(serviceProvider);
}
protected virtual IServiceCollection CreateServiceCollection()

@ -7,34 +7,34 @@ namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionApplicationExtensions
{
public static AbpApplication AddApplication<TStartupModule>(
public static IAbpApplicationWithExternalServiceProvider AddApplication<TStartupModule>(
[NotNull] this IServiceCollection services)
where TStartupModule : IAbpModule
{
return AbpApplication.Create<TStartupModule>(services);
return AbpApplicationFactory.Create<TStartupModule>(services);
}
public static AbpApplication AddApplication<TStartupModule>(
public static IAbpApplicationWithExternalServiceProvider AddApplication<TStartupModule>(
[NotNull] this IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> optionsAction)
where TStartupModule : IAbpModule
{
return AbpApplication.Create<TStartupModule>(services, optionsAction);
return AbpApplicationFactory.Create<TStartupModule>(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<AbpApplicationCreationOptions> optionsAction)
{
return AbpApplication.Create(startupModuleType, services, optionsAction);
return AbpApplicationFactory.Create(startupModuleType, services, optionsAction);
}
}
}

@ -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<AbpApplicationCreationOptions> 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<TStartupModule>([NotNull] IServiceCollection services)
where TStartupModule : IAbpModule
{
return Create<TStartupModule>(services, null);
}
internal static AbpApplication Create<TStartupModule>(
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> 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<AbpApplicationCreationOptions> optionsAction)
{
return new AbpApplication(startupModuleType, services, optionsAction);
}
public void Initialize([NotNull] IServiceProvider serviceProvider)
{
Check.NotNull(serviceProvider, nameof(serviceProvider));
ServiceProvider = serviceProvider;
ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(serviceProvider));
}
private AbpModuleDescriptor[] LoadModules(IServiceCollection services, AbpApplicationCreationOptions options)
{
return services
.GetSingletonInstance<IModuleLoader>()
.LoadModules(
services,
StartupModuleType,
options.PlugInSources
);
}
public void Shutdown()
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.ShutdownModules(new ApplicationShutdownContext());
}
}
}

@ -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<AbpApplicationCreationOptions> optionsAction)
{
Check.NotNull(startupModuleType, nameof(startupModuleType));
Check.NotNull(services, nameof(services));
StartupModuleType = startupModuleType;
var options = new AbpApplicationCreationOptions(services);
optionsAction?.Invoke(options);
services.AddSingleton<IAbpApplication>(_ => this);
services.AddCoreAbpServices();
Modules = LoadModules(services, options);
}
private AbpModuleDescriptor[] LoadModules(IServiceCollection services, AbpApplicationCreationOptions options)
{
return services
.GetSingletonInstance<IModuleLoader>()
.LoadModules(
services,
StartupModuleType,
options.PlugInSources
);
}
public void Shutdown() //TODO: Why not disposable?
{
ServiceProvider
.GetRequiredService<IModuleManager>()
.ShutdownModules(new ApplicationShutdownContext());
}
}
}

@ -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<TStartupModule>(
[NotNull] IServiceCollection services)
where TStartupModule : IAbpModule
{
return Create<TStartupModule>(services, null);
}
public static IAbpApplicationWithExternalServiceProvider Create<TStartupModule>(
[NotNull] IServiceCollection services,
[CanBeNull] Action<AbpApplicationCreationOptions> 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<AbpApplicationCreationOptions> optionsAction)
{
return new AbpApplicationWithExternalServiceProvider(startupModuleType, services, optionsAction);
}
}
}

@ -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<AbpApplicationCreationOptions> optionsAction
) : base(
startupModuleType,
services,
optionsAction)
{
services.AddSingleton<IAbpApplicationWithExternalServiceProvider>(_ => this);
}
public void Initialize(IServiceProvider serviceProvider)
{
Check.NotNull(serviceProvider, nameof(serviceProvider));
ServiceProvider = serviceProvider;
ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(serviceProvider));
}
}
}

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

@ -0,0 +1,10 @@
using System;
using JetBrains.Annotations;
namespace Volo.Abp
{
public interface IAbpApplicationWithExternalServiceProvider : IAbpApplication
{
void Initialize([NotNull] IServiceProvider serviceProvider);
}
}

@ -0,0 +1,7 @@
namespace Volo.Abp
{
public interface IAbpApplicationWithInternalServiceProvider : IAbpApplication
{
void Initialize();
}
}

@ -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<IModuleLoader>(new ModuleLoader());
}
}

@ -15,7 +15,7 @@ namespace Volo.Abp.Modularity
private readonly ILogger<ModuleManager> _logger;
public ModuleManager(
AbpApplication application,
IAbpApplication application,
IEnumerable<IModuleLifecycleContributer> lifecycleContributers,
ILogger<ModuleManager> logger)
{

Loading…
Cancel
Save