using System;
using System.IO;
using System.Linq.Expressions;
using Abp.Application.Features;
using Abp.Application.Navigation;
using Abp.Application.Services;
using Abp.Auditing;
using Abp.Authorization;
using Abp.BackgroundJobs;
using Abp.Collections.Extensions;
using Abp.Configuration;
using Abp.Configuration.Startup;
using Abp.Dependency;
using Abp.Domain.Uow;
using Abp.EntityHistory;
using Abp.Events.Bus;
using Abp.Localization;
using Abp.Localization.Dictionaries;
using Abp.Localization.Dictionaries.Xml;
using Abp.Modules;
using Abp.MultiTenancy;
using Abp.Net.Mail;
using Abp.Notifications;
using Abp.RealTime;
using Abp.Reflection.Extensions;
using Abp.Runtime;
using Abp.Runtime.Caching;
using Abp.Runtime.Remoting;
using Abp.Runtime.Validation.Interception;
using Abp.Threading;
using Abp.Threading.BackgroundWorkers;
using Abp.Timing;
using Castle.MicroKernel.Registration;
namespace Abp
{
///
/// Kernel (core) module of the ABP system.
/// No need to depend on this, it's automatically the first module always.
///
public sealed class AbpKernelModule : AbpModule
{
public override void PreInitialize()
{
IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());
IocManager.Register(DependencyLifeStyle.Transient);
IocManager.Register(typeof(IAmbientScopeProvider<>), typeof(DataContextAmbientScopeProvider<>), DependencyLifeStyle.Transient);
AddAuditingSelectors();
AddLocalizationSources();
AddSettingProviders();
AddUnitOfWorkFilters();
ConfigureCaches();
AddIgnoredTypes();
AddMethodParameterValidators();
AddDefaultNotificationDistributor();
}
public override void Initialize()
{
foreach (var replaceAction in ((AbpStartupConfiguration)Configuration).ServiceReplaceActions.Values)
{
replaceAction();
}
IocManager.IocContainer.Install(new EventBusInstaller(IocManager));
IocManager.Register(typeof(IOnlineClientManager<>), typeof(OnlineClientManager<>), DependencyLifeStyle.Singleton);
IocManager.Register(typeof(EventTriggerAsyncBackgroundJob<>),DependencyLifeStyle.Transient);
IocManager.RegisterAssemblyByConvention(typeof(AbpKernelModule).GetAssembly(),
new ConventionalRegistrationConfig
{
InstallInstallers = false
});
}
public override void PostInitialize()
{
RegisterMissingComponents();
IocManager.Resolve().Initialize();
IocManager.Resolve().Initialize();
IocManager.Resolve().Initialize();
IocManager.Resolve().Initialize();
IocManager.Resolve().Initialize();
IocManager.Resolve().Initialize();
if (Configuration.BackgroundJobs.IsJobExecutionEnabled)
{
var workerManager = IocManager.Resolve();
workerManager.Start();
workerManager.Add(IocManager.Resolve());
}
}
public override void Shutdown()
{
if (Configuration.BackgroundJobs.IsJobExecutionEnabled)
{
IocManager.Resolve().StopAndWaitToStop();
}
}
private void AddUnitOfWorkFilters()
{
Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.SoftDelete, true);
Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MustHaveTenant, true);
Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MayHaveTenant, true);
}
private void AddSettingProviders()
{
Configuration.Settings.Providers.Add();
Configuration.Settings.Providers.Add();
Configuration.Settings.Providers.Add();
Configuration.Settings.Providers.Add();
}
private void AddAuditingSelectors()
{
Configuration.Auditing.Selectors.Add(
new NamedTypeSelector(
"Abp.ApplicationServices",
type => typeof(IApplicationService).IsAssignableFrom(type)
)
);
}
private void AddLocalizationSources()
{
Configuration.Localization.Sources.Add(
new DictionaryBasedLocalizationSource(
AbpConsts.LocalizationSourceName,
new XmlEmbeddedFileLocalizationDictionaryProvider(
typeof(AbpKernelModule).GetAssembly(), "Abp.Localization.Sources.AbpXmlSource"
)));
}
private void ConfigureCaches()
{
Configuration.Caching.Configure(AbpCacheNames.ApplicationSettings, cache =>
{
cache.DefaultSlidingExpireTime = TimeSpan.FromHours(8);
});
Configuration.Caching.Configure(AbpCacheNames.TenantSettings, cache =>
{
cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes(60);
});
Configuration.Caching.Configure(AbpCacheNames.UserSettings, cache =>
{
cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes(20);
});
}
private void AddIgnoredTypes()
{
var commonIgnoredTypes = new[]
{
typeof(Stream),
typeof(Expression)
};
foreach (var ignoredType in commonIgnoredTypes)
{
Configuration.Auditing.IgnoredTypes.AddIfNotContains(ignoredType);
Configuration.Validation.IgnoredTypes.AddIfNotContains(ignoredType);
}
var validationIgnoredTypes = new[] { typeof(Type) };
foreach (var ignoredType in validationIgnoredTypes)
{
Configuration.Validation.IgnoredTypes.AddIfNotContains(ignoredType);
}
}
private void AddMethodParameterValidators()
{
Configuration.Validation.Validators.Add();
Configuration.Validation.Validators.Add();
Configuration.Validation.Validators.Add();
}
private void AddDefaultNotificationDistributor()
{
Configuration.Notifications.Distributers.Add();
}
private void RegisterMissingComponents()
{
if (!IocManager.IsRegistered())
{
IocManager.IocContainer.Register(
Component
.For()
.Instance(SequentialGuidGenerator.Instance)
);
}
IocManager.RegisterIfNot(DependencyLifeStyle.Transient);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
if (Configuration.BackgroundJobs.IsJobExecutionEnabled)
{
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
}
else
{
IocManager.RegisterIfNot(DependencyLifeStyle.Singleton);
}
}
}
}