Browse Source

Improved module initialize and DI code.

pull/81/head
Halil İbrahim Kalkan 10 years ago
parent
commit
7dd4f6011d
  1. 6
      src/Volo.Abp/Abp/AbpApplication.cs
  2. 13
      src/Volo.Abp/Abp/AbpKernelModule.cs
  3. 1
      src/Volo.Abp/Abp/AbpServiceCollectionExtensions.cs
  4. 17
      src/Volo.Abp/Abp/Modularity/AbpModule.cs
  5. 1
      src/Volo.Abp/Abp/Modularity/AbpModuleDescriptor.cs
  6. 10
      src/Volo.Abp/Abp/Modularity/DefaultModuleInitializer.cs
  7. 2
      src/Volo.Abp/Abp/Modularity/DependsOnAttribute.cs
  8. 3
      src/Volo.Abp/Abp/Modularity/IModuleLoader.cs
  9. 7
      src/Volo.Abp/Abp/Modularity/IOnApplicationInitialize.cs
  10. 17
      src/Volo.Abp/Abp/Modularity/ModuleLoader.cs
  11. 3
      src/Volo.Abp/Abp/Modularity/ModuleManager.cs
  12. 17
      src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs
  13. 9
      src/Volo.DependencyInjection/DependencyInjection/DisableAutoDependencyInjectionRegistrationAttribute.cs
  14. 13
      test/Volo.Abp.Tests/AbpApplication_Tests.cs
  15. 15
      test/Volo.Abp.Tests/Modularity/IndependentEmptyModule.cs

6
src/Volo.Abp/Abp/AbpApplication.cs

@ -8,7 +8,7 @@ namespace Volo.Abp
{ {
public Type StartupModuleType { get; } public Type StartupModuleType { get; }
private IServiceProvider _serviceProvider; public IServiceProvider ServiceProvider { get; private set; }
private AbpApplication(Type startupModuleType, IServiceCollection services) private AbpApplication(Type startupModuleType, IServiceCollection services)
{ {
@ -28,8 +28,8 @@ namespace Volo.Abp
public void Initialize(IServiceProvider serviceProvider) public void Initialize(IServiceProvider serviceProvider)
{ {
_serviceProvider = serviceProvider; ServiceProvider = serviceProvider;
_serviceProvider.GetRequiredService<IModuleManager>().Initialize(); ServiceProvider.GetRequiredService<IModuleManager>().Initialize();
} }
public void Dispose() public void Dispose()

13
src/Volo.Abp/Abp/AbpKernelModule.cs

@ -1,17 +1,14 @@
using System; using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.DependencyInjection;
namespace Volo.Abp namespace Volo.Abp
{ {
public class AbpKernelModule : IAbpModule public class AbpKernelModule : AbpModule
{ {
public void ConfigureServices(IServiceCollection services) public override void ConfigureServices(IServiceCollection services)
{ {
services.AddAssemblyOf<AbpKernelModule>();
} }
} }
} }

1
src/Volo.Abp/Abp/AbpServiceCollectionExtensions.cs

@ -29,7 +29,6 @@ namespace Volo.Abp
internal static void AddCoreAbpServices(this IServiceCollection services) internal static void AddCoreAbpServices(this IServiceCollection services)
{ {
services.TryAddSingleton<IModuleLoader>(new ModuleLoader()); services.TryAddSingleton<IModuleLoader>(new ModuleLoader());
services.TryAddSingleton<IModuleManager, ModuleManager>();
} }
} }
} }

17
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()
{
}
}
}

1
src/Volo.Abp/Abp/Modularity/AbpModuleDescriptor.cs

@ -19,6 +19,7 @@ namespace Volo.Abp.Modularity
Type = type; Type = type;
Instance = instance; Instance = instance;
Dependencies = new List<AbpModuleDescriptor>(); Dependencies = new List<AbpModuleDescriptor>();
} }
} }

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

2
src/Volo.Abp/Abp/Modularity/DependsOnAttribute.cs

@ -23,7 +23,7 @@ namespace Volo.Abp.Modularity
DependedModuleTypes = dependedModuleTypes; DependedModuleTypes = dependedModuleTypes;
} }
public Type[] GetDependedModuleTypes() public virtual Type[] GetDependedModuleTypes()
{ {
return DependedModuleTypes; return DependedModuleTypes;
} }

3
src/Volo.Abp/Abp/Modularity/IModuleLoader.cs

@ -1,11 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.DependencyInjection;
namespace Volo.Abp.Modularity namespace Volo.Abp.Modularity
{ {
public interface IModuleLoader : ISingletonDependency public interface IModuleLoader
{ {
IReadOnlyList<AbpModuleDescriptor> Modules { get; } IReadOnlyList<AbpModuleDescriptor> Modules { get; }

7
src/Volo.Abp/Abp/Modularity/IOnApplicationInitialize.cs

@ -0,0 +1,7 @@
namespace Volo.Abp.Modularity
{
public interface IOnApplicationInitialize
{
void OnApplicationInitialize();
}
}

17
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!"); throw new InvalidOperationException($"{nameof(LoadAll)} should be called only once!");
} }
FillModules(startupModuleType); FillModules(services, startupModuleType);
SetModuleDependencies(); SetModuleDependencies();
SortByDependency(startupModuleType); SortByDependency(startupModuleType);
ConfigureServices(services); ConfigureServices(services);
} }
private void FillModules(Type startupModuleType) private void FillModules(IServiceCollection services, Type startupModuleType)
{ {
foreach (var moduleType in FindAllModuleTypes(startupModuleType).Distinct()) 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; 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) protected virtual void ConfigureServices(IServiceCollection services)

3
src/Volo.Abp/Abp/Modularity/ModuleManager.cs

@ -1,8 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using Volo.DependencyInjection;
namespace Volo.Abp.Modularity namespace Volo.Abp.Modularity
{ {
public class ModuleManager : IModuleManager public class ModuleManager : IModuleManager, ISingletonDependency
{ {
private readonly IModuleLoader _moduleLoader; private readonly IModuleLoader _moduleLoader;
private readonly IEnumerable<IModuleInitializer> _initializers; private readonly IEnumerable<IModuleInitializer> _initializers;

17
src/Volo.DependencyInjection/DependencyInjection/AbpConventionalDependencyInjectionExtensions.cs

@ -19,7 +19,13 @@ namespace Volo.DependencyInjection
public static void AddAssembly(this IServiceCollection services, Assembly assembly) 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) public static void AddTypes(this IServiceCollection services, params Type[] types)
@ -81,14 +87,5 @@ namespace Volo.DependencyInjection
return serviceTypes; return serviceTypes;
} }
private static IEnumerable<Type> FilterInjectableTypes(this IEnumerable<Type> types)
{
return types.Where(t =>
{
var typeInfo = t.GetTypeInfo();
return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsGenericType;
});
}
} }
} }

9
src/Volo.DependencyInjection/DependencyInjection/DisableAutoDependencyInjectionRegistrationAttribute.cs

@ -0,0 +1,9 @@
using System;
namespace Volo.DependencyInjection
{
public class DisableAutoDependencyInjectionRegistrationAttribute : Attribute
{
}
}

13
test/Volo.Abp.Tests/AbpApplication_Tests.cs

@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Tests.Modularity; using Volo.Abp.Tests.Modularity;
using Xunit; using Xunit;
@ -7,13 +8,23 @@ namespace Volo.Abp.Tests
public class AbpApplication_Tests public class AbpApplication_Tests
{ {
[Fact] [Fact]
public void Should_Start_And_Stop_Empty_Application() public void Should_Initialize_SingleModule_Application()
{ {
//Arrange
var services = new ServiceCollection(); var services = new ServiceCollection();
using (var application = AbpApplication.Create<IndependentEmptyModule>(services)) using (var application = AbpApplication.Create<IndependentEmptyModule>(services))
{ {
//Act
application.Initialize(services.BuildServiceProvider()); application.Initialize(services.BuildServiceProvider());
//Assert
var module = application.ServiceProvider.GetRequiredService<IndependentEmptyModule>();
module.ConfigureServicesIsCalled.ShouldBeTrue();
module.OnApplicationInitializeIsCalled.ShouldBeTrue();
} }
} }
} }

15
test/Volo.Abp.Tests/Modularity/IndependentEmptyModule.cs

@ -3,11 +3,20 @@ using Volo.Abp.Modularity;
namespace Volo.Abp.Tests.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;
} }
} }
} }

Loading…
Cancel
Save