@ -13,6 +13,22 @@ namespace Volo.Abp.Modularity
IPreConfigureServices,
IPostConfigureServices
{
protected internal ServiceConfigurationContext ServiceConfigurationContext
get
if (_serviceConfigurationContext == null)
throw new AbpException($"{nameof(ServiceConfigurationContext)} is only available in the {nameof(PreConfigureServices)}, {nameof(PreConfigureServices)} and {nameof(PreConfigureServices)} methods.");
}
return _serviceConfigurationContext;
internal set => _serviceConfigurationContext = value;
private ServiceConfigurationContext _serviceConfigurationContext;
public virtual void PreConfigureServices(ServiceConfigurationContext context)
@ -66,5 +82,11 @@ namespace Volo.Abp.Modularity
throw new ArgumentException("Given type is not an ABP module: " + moduleType.AssemblyQualifiedName);
protected void Configure<TOptions>(Action<TOptions> configureOptions)
where TOptions : class
ServiceConfigurationContext.Services.Configure(configureOptions);
@ -94,6 +94,14 @@ namespace Volo.Abp.Modularity
var context = new ServiceConfigurationContext(services);
services.AddSingleton(context);
foreach (var module in modules)
if (module.Instance is AbpModule abpModule)
abpModule.ServiceConfigurationContext = context;
//PreConfigureServices
foreach (var module in modules.Where(m => m.Instance is IPreConfigureServices))
@ -111,6 +119,14 @@ namespace Volo.Abp.Modularity
((IPostConfigureServices)module.Instance).PostConfigureServices(context);
abpModule.ServiceConfigurationContext = null;
protected virtual void SetDependencies(List<AbpModuleDescriptor> modules, AbpModuleDescriptor module)
@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
@ -33,7 +34,14 @@ namespace Volo.Abp.UI.Navigation
NormalizeMenu(menu);
return menu;
protected virtual void NormalizeMenu(ApplicationMenu menu)
menu.Items.RemoveAll(item => item.IsLeaf && item.Url.IsNullOrEmpty());