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