From 78a47a81c030ba30c9212cd3e614f8361fed3efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Apr 2021 23:55:21 +0300 Subject: [PATCH] Added ability to set/create service provider without initializing the ABP application. --- ...pApplicationWithExternalServiceProvider.cs | 19 ++++++++++++++++++- ...pApplicationWithInternalServiceProvider.cs | 13 ++++++++++++- ...pApplicationWithExternalServiceProvider.cs | 10 ++++++++++ ...pApplicationWithInternalServiceProvider.cs | 15 ++++++++++++++- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs index 58f75f3b96..df732e9bbc 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs @@ -18,7 +18,24 @@ namespace Volo.Abp services.AddSingleton(this); } - public void Initialize(IServiceProvider serviceProvider) + void IAbpApplicationWithExternalServiceProvider.SetServiceProvider([NotNull] IServiceProvider serviceProvider) + { + Check.NotNull(serviceProvider, nameof(serviceProvider)); + + if (ServiceProvider != null) + { + if (ServiceProvider != serviceProvider) + { + throw new AbpException("Service provider was already set before to another service provider instance."); + } + + return; + } + + SetServiceProvider(serviceProvider); + } + + public void Initialize([NotNull] IServiceProvider serviceProvider) { Check.NotNull(serviceProvider, nameof(serviceProvider)); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs index 2ba93dd513..8429a00bcc 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs @@ -31,11 +31,22 @@ namespace Volo.Abp Services.AddSingleton(this); } - public void Initialize() + public IServiceProvider CreateServiceProvider() { + if (ServiceProvider != null) + { + return ServiceProvider; + } + ServiceScope = Services.BuildServiceProviderFromFactory().CreateScope(); SetServiceProvider(ServiceScope.ServiceProvider); + return ServiceProvider; + } + + public void Initialize() + { + CreateServiceProvider(); InitializeModules(); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs index 8968fdf918..fcff07fc66 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs @@ -5,6 +5,16 @@ namespace Volo.Abp { public interface IAbpApplicationWithExternalServiceProvider : IAbpApplication { + /// + /// Sets the service provider, but not initializes the modules. + /// + void SetServiceProvider([NotNull] IServiceProvider serviceProvider); + + /// + /// Sets the service provider and initializes all the modules. + /// If was called before, the same + /// instance should be passed to this method. + /// void Initialize([NotNull] IServiceProvider serviceProvider); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs index b598535292..78d2829489 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs @@ -1,7 +1,20 @@ -namespace Volo.Abp +using System; + +namespace Volo.Abp { public interface IAbpApplicationWithInternalServiceProvider : IAbpApplication { + /// + /// Creates the service provider, but not initializes the modules. + /// Multiple calls returns the same service provider without creating again. + /// + IServiceProvider CreateServiceProvider(); + + /// + /// Creates the service provider and initializes all the modules. + /// If method was called before, + /// it does not re-create it, but uses the previous one. + /// void Initialize(); } } \ No newline at end of file