From 7dd4f6011d2690f29f0e0028138cf1628514ec61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 5 Dec 2016 23:56:02 +0300 Subject: [PATCH] Improved module initialize and DI code. --- src/Volo.Abp/Abp/AbpApplication.cs | 6 +++--- src/Volo.Abp/Abp/AbpKernelModule.cs | 13 +++++-------- .../Abp/AbpServiceCollectionExtensions.cs | 1 - src/Volo.Abp/Abp/Modularity/AbpModule.cs | 17 +++++++++++++++++ .../Abp/Modularity/AbpModuleDescriptor.cs | 1 + .../Abp/Modularity/DefaultModuleInitializer.cs | 10 ++++++++++ .../Abp/Modularity/DependsOnAttribute.cs | 2 +- src/Volo.Abp/Abp/Modularity/IModuleLoader.cs | 3 +-- .../Abp/Modularity/IOnApplicationInitialize.cs | 7 +++++++ src/Volo.Abp/Abp/Modularity/ModuleLoader.cs | 17 ++++++++++++----- src/Volo.Abp/Abp/Modularity/ModuleManager.cs | 3 ++- ...ConventionalDependencyInjectionExtensions.cs | 17 +++++++---------- ...oDependencyInjectionRegistrationAttribute.cs | 9 +++++++++ test/Volo.Abp.Tests/AbpApplication_Tests.cs | 13 ++++++++++++- .../Modularity/IndependentEmptyModule.cs | 15 ++++++++++++--- 15 files changed, 99 insertions(+), 35 deletions(-) create mode 100644 src/Volo.Abp/Abp/Modularity/AbpModule.cs create mode 100644 src/Volo.Abp/Abp/Modularity/DefaultModuleInitializer.cs create mode 100644 src/Volo.Abp/Abp/Modularity/IOnApplicationInitialize.cs create mode 100644 src/Volo.DependencyInjection/DependencyInjection/DisableAutoDependencyInjectionRegistrationAttribute.cs diff --git a/src/Volo.Abp/Abp/AbpApplication.cs b/src/Volo.Abp/Abp/AbpApplication.cs index edf67e8dfb..cb33119d3a 100644 --- a/src/Volo.Abp/Abp/AbpApplication.cs +++ b/src/Volo.Abp/Abp/AbpApplication.cs @@ -8,7 +8,7 @@ namespace Volo.Abp { public Type StartupModuleType { get; } - private IServiceProvider _serviceProvider; + public IServiceProvider ServiceProvider { get; private set; } private AbpApplication(Type startupModuleType, IServiceCollection services) { @@ -28,8 +28,8 @@ namespace Volo.Abp public void Initialize(IServiceProvider serviceProvider) { - _serviceProvider = serviceProvider; - _serviceProvider.GetRequiredService().Initialize(); + ServiceProvider = serviceProvider; + ServiceProvider.GetRequiredService().Initialize(); } public void Dispose() diff --git a/src/Volo.Abp/Abp/AbpKernelModule.cs b/src/Volo.Abp/Abp/AbpKernelModule.cs index 6fc0910396..322a68c2d0 100644 --- a/src/Volo.Abp/Abp/AbpKernelModule.cs +++ b/src/Volo.Abp/Abp/AbpKernelModule.cs @@ -1,17 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; +using Volo.DependencyInjection; namespace Volo.Abp { - public class AbpKernelModule : IAbpModule + public class AbpKernelModule : AbpModule { - public void ConfigureServices(IServiceCollection services) + public override void ConfigureServices(IServiceCollection services) { - + services.AddAssemblyOf(); } } } diff --git a/src/Volo.Abp/Abp/AbpServiceCollectionExtensions.cs b/src/Volo.Abp/Abp/AbpServiceCollectionExtensions.cs index e63f88fc96..f3df14f649 100644 --- a/src/Volo.Abp/Abp/AbpServiceCollectionExtensions.cs +++ b/src/Volo.Abp/Abp/AbpServiceCollectionExtensions.cs @@ -29,7 +29,6 @@ namespace Volo.Abp internal static void AddCoreAbpServices(this IServiceCollection services) { services.TryAddSingleton(new ModuleLoader()); - services.TryAddSingleton(); } } } \ No newline at end of file diff --git a/src/Volo.Abp/Abp/Modularity/AbpModule.cs b/src/Volo.Abp/Abp/Modularity/AbpModule.cs new file mode 100644 index 0000000000..6daa73f5e6 --- /dev/null +++ b/src/Volo.Abp/Abp/Modularity/AbpModule.cs @@ -0,0 +1,17 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Volo.Abp.Modularity +{ + public abstract class AbpModule : IAbpModule, IOnApplicationInitialize + { + public virtual void ConfigureServices(IServiceCollection services) + { + + } + + public virtual void OnApplicationInitialize() + { + + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Abp/Modularity/AbpModuleDescriptor.cs b/src/Volo.Abp/Abp/Modularity/AbpModuleDescriptor.cs index e1091506d3..5d37a81604 100644 --- a/src/Volo.Abp/Abp/Modularity/AbpModuleDescriptor.cs +++ b/src/Volo.Abp/Abp/Modularity/AbpModuleDescriptor.cs @@ -19,6 +19,7 @@ namespace Volo.Abp.Modularity Type = type; Instance = instance; + Dependencies = new List(); } } diff --git a/src/Volo.Abp/Abp/Modularity/DefaultModuleInitializer.cs b/src/Volo.Abp/Abp/Modularity/DefaultModuleInitializer.cs new file mode 100644 index 0000000000..201bffd4fc --- /dev/null +++ b/src/Volo.Abp/Abp/Modularity/DefaultModuleInitializer.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.Modularity +{ + public class DefaultModuleInitializer : IModuleInitializer + { + public void Initialize(IAbpModule module) + { + (module as IOnApplicationInitialize)?.OnApplicationInitialize(); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Abp/Modularity/DependsOnAttribute.cs b/src/Volo.Abp/Abp/Modularity/DependsOnAttribute.cs index ed9c01ca09..2a44b69492 100644 --- a/src/Volo.Abp/Abp/Modularity/DependsOnAttribute.cs +++ b/src/Volo.Abp/Abp/Modularity/DependsOnAttribute.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.Modularity DependedModuleTypes = dependedModuleTypes; } - public Type[] GetDependedModuleTypes() + public virtual Type[] GetDependedModuleTypes() { return DependedModuleTypes; } diff --git a/src/Volo.Abp/Abp/Modularity/IModuleLoader.cs b/src/Volo.Abp/Abp/Modularity/IModuleLoader.cs index 8f4eaced4a..53dc007713 100644 --- a/src/Volo.Abp/Abp/Modularity/IModuleLoader.cs +++ b/src/Volo.Abp/Abp/Modularity/IModuleLoader.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; -using Volo.DependencyInjection; namespace Volo.Abp.Modularity { - public interface IModuleLoader : ISingletonDependency + public interface IModuleLoader { IReadOnlyList Modules { get; } diff --git a/src/Volo.Abp/Abp/Modularity/IOnApplicationInitialize.cs b/src/Volo.Abp/Abp/Modularity/IOnApplicationInitialize.cs new file mode 100644 index 0000000000..bcee268f2e --- /dev/null +++ b/src/Volo.Abp/Abp/Modularity/IOnApplicationInitialize.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.Modularity +{ + public interface IOnApplicationInitialize + { + void OnApplicationInitialize(); + } +} \ No newline at end of file diff --git a/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs b/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs index 9a86277ee7..5a3fe1c9cb 100644 --- a/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs +++ b/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs @@ -25,17 +25,17 @@ namespace Volo.Abp.Modularity throw new InvalidOperationException($"{nameof(LoadAll)} should be called only once!"); } - FillModules(startupModuleType); + FillModules(services, startupModuleType); SetModuleDependencies(); SortByDependency(startupModuleType); ConfigureServices(services); } - private void FillModules(Type startupModuleType) + private void FillModules(IServiceCollection services, Type startupModuleType) { foreach (var moduleType in FindAllModuleTypes(startupModuleType).Distinct()) { - _modules.Add(CreateModuleDescriptor(moduleType)); + _modules.Add(CreateModuleDescriptor(services, moduleType)); } } @@ -62,9 +62,16 @@ namespace Volo.Abp.Modularity return moduleTypes; } - protected virtual AbpModuleDescriptor CreateModuleDescriptor(Type moduleType) + protected virtual AbpModuleDescriptor CreateModuleDescriptor(IServiceCollection services, Type moduleType) { - return new AbpModuleDescriptor(moduleType, (IAbpModule)Activator.CreateInstance(moduleType)); + return new AbpModuleDescriptor(moduleType, CreateAndRegisterModule(services, moduleType)); + } + + private IAbpModule CreateAndRegisterModule(IServiceCollection services, Type moduleType) + { + var module = (IAbpModule) Activator.CreateInstance(moduleType); + services.AddSingleton(moduleType, module); + return module; } protected virtual void ConfigureServices(IServiceCollection services) diff --git a/src/Volo.Abp/Abp/Modularity/ModuleManager.cs b/src/Volo.Abp/Abp/Modularity/ModuleManager.cs index e223590b81..49474fae33 100644 --- a/src/Volo.Abp/Abp/Modularity/ModuleManager.cs +++ b/src/Volo.Abp/Abp/Modularity/ModuleManager.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; +using Volo.DependencyInjection; namespace Volo.Abp.Modularity { - public class ModuleManager : IModuleManager + public class ModuleManager : IModuleManager, ISingletonDependency { private readonly IModuleLoader _moduleLoader; private readonly IEnumerable _initializers; diff --git a/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs b/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs index ad4f3df41f..3d7f764f8f 100644 --- a/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs +++ b/src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs @@ -19,7 +19,13 @@ namespace Volo.DependencyInjection public static void AddAssembly(this IServiceCollection services, Assembly assembly) { - services.AddTypes(AssemblyHelper.GetAllTypes(assembly).FilterInjectableTypes().ToArray()); + var types = AssemblyHelper.GetAllTypes(assembly).Where(t => + { + var typeInfo = t.GetTypeInfo(); + return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsGenericType && !typeInfo.IsDefined(typeof(DisableAutoDependencyInjectionRegistrationAttribute)); + }); + + services.AddTypes(types.ToArray()); } public static void AddTypes(this IServiceCollection services, params Type[] types) @@ -81,14 +87,5 @@ namespace Volo.DependencyInjection return serviceTypes; } - - private static IEnumerable FilterInjectableTypes(this IEnumerable types) - { - return types.Where(t => - { - var typeInfo = t.GetTypeInfo(); - return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsGenericType; - }); - } } } diff --git a/src/Volo.DependencyInjection/DependencyInjection/DisableAutoDependencyInjectionRegistrationAttribute.cs b/src/Volo.DependencyInjection/DependencyInjection/DisableAutoDependencyInjectionRegistrationAttribute.cs new file mode 100644 index 0000000000..6d40fd9a1f --- /dev/null +++ b/src/Volo.DependencyInjection/DependencyInjection/DisableAutoDependencyInjectionRegistrationAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.DependencyInjection +{ + public class DisableAutoDependencyInjectionRegistrationAttribute : Attribute + { + + } +} \ No newline at end of file diff --git a/test/Volo.Abp.Tests/AbpApplication_Tests.cs b/test/Volo.Abp.Tests/AbpApplication_Tests.cs index d18b74084b..d8858fafb6 100644 --- a/test/Volo.Abp.Tests/AbpApplication_Tests.cs +++ b/test/Volo.Abp.Tests/AbpApplication_Tests.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Shouldly; using Volo.Abp.Tests.Modularity; using Xunit; @@ -7,13 +8,23 @@ namespace Volo.Abp.Tests public class AbpApplication_Tests { [Fact] - public void Should_Start_And_Stop_Empty_Application() + public void Should_Initialize_SingleModule_Application() { + //Arrange + var services = new ServiceCollection(); using (var application = AbpApplication.Create(services)) { + //Act + application.Initialize(services.BuildServiceProvider()); + + //Assert + + var module = application.ServiceProvider.GetRequiredService(); + module.ConfigureServicesIsCalled.ShouldBeTrue(); + module.OnApplicationInitializeIsCalled.ShouldBeTrue(); } } } diff --git a/test/Volo.Abp.Tests/Modularity/IndependentEmptyModule.cs b/test/Volo.Abp.Tests/Modularity/IndependentEmptyModule.cs index fa79ee56aa..e6365cde95 100644 --- a/test/Volo.Abp.Tests/Modularity/IndependentEmptyModule.cs +++ b/test/Volo.Abp.Tests/Modularity/IndependentEmptyModule.cs @@ -3,11 +3,20 @@ using Volo.Abp.Modularity; namespace Volo.Abp.Tests.Modularity { - public class IndependentEmptyModule : IAbpModule + public class IndependentEmptyModule : AbpModule { - public void ConfigureServices(IServiceCollection services) + public bool ConfigureServicesIsCalled { get; set; } + + public bool OnApplicationInitializeIsCalled { get; set; } + + public override void ConfigureServices(IServiceCollection services) + { + ConfigureServicesIsCalled = true; + } + + public override void OnApplicationInitialize() { - + OnApplicationInitializeIsCalled = true; } } }