AbpKernelModule.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. using System;
  2. using System.IO;
  3. using System.Linq.Expressions;
  4. using Abp.Application.Features;
  5. using Abp.Application.Navigation;
  6. using Abp.Application.Services;
  7. using Abp.Auditing;
  8. using Abp.Authorization;
  9. using Abp.BackgroundJobs;
  10. using Abp.Collections.Extensions;
  11. using Abp.Configuration;
  12. using Abp.Configuration.Startup;
  13. using Abp.Dependency;
  14. using Abp.Domain.Uow;
  15. using Abp.EntityHistory;
  16. using Abp.Events.Bus;
  17. using Abp.Localization;
  18. using Abp.Localization.Dictionaries;
  19. using Abp.Localization.Dictionaries.Xml;
  20. using Abp.Modules;
  21. using Abp.MultiTenancy;
  22. using Abp.Net.Mail;
  23. using Abp.Notifications;
  24. using Abp.RealTime;
  25. using Abp.Reflection.Extensions;
  26. using Abp.Runtime;
  27. using Abp.Runtime.Caching;
  28. using Abp.Runtime.Remoting;
  29. using Abp.Runtime.Validation.Interception;
  30. using Abp.Threading;
  31. using Abp.Threading.BackgroundWorkers;
  32. using Abp.Timing;
  33. using Castle.MicroKernel.Registration;
  34. namespace Abp
  35. {
  36. /// <summary>
  37. /// Kernel (core) module of the ABP system.
  38. /// No need to depend on this, it's automatically the first module always.
  39. /// </summary>
  40. public sealed class AbpKernelModule : AbpModule
  41. {
  42. public override void PreInitialize()
  43. {
  44. IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());
  45. IocManager.Register<IScopedIocResolver, ScopedIocResolver>(DependencyLifeStyle.Transient);
  46. IocManager.Register(typeof(IAmbientScopeProvider<>), typeof(DataContextAmbientScopeProvider<>), DependencyLifeStyle.Transient);
  47. AddAuditingSelectors();
  48. AddLocalizationSources();
  49. AddSettingProviders();
  50. AddUnitOfWorkFilters();
  51. ConfigureCaches();
  52. AddIgnoredTypes();
  53. AddMethodParameterValidators();
  54. AddDefaultNotificationDistributor();
  55. }
  56. public override void Initialize()
  57. {
  58. foreach (var replaceAction in ((AbpStartupConfiguration)Configuration).ServiceReplaceActions.Values)
  59. {
  60. replaceAction();
  61. }
  62. IocManager.IocContainer.Install(new EventBusInstaller(IocManager));
  63. IocManager.Register(typeof(IOnlineClientManager<>), typeof(OnlineClientManager<>), DependencyLifeStyle.Singleton);
  64. IocManager.Register(typeof(EventTriggerAsyncBackgroundJob<>),DependencyLifeStyle.Transient);
  65. IocManager.RegisterAssemblyByConvention(typeof(AbpKernelModule).GetAssembly(),
  66. new ConventionalRegistrationConfig
  67. {
  68. InstallInstallers = false
  69. });
  70. }
  71. public override void PostInitialize()
  72. {
  73. RegisterMissingComponents();
  74. IocManager.Resolve<SettingDefinitionManager>().Initialize();
  75. IocManager.Resolve<FeatureManager>().Initialize();
  76. IocManager.Resolve<PermissionManager>().Initialize();
  77. IocManager.Resolve<LocalizationManager>().Initialize();
  78. IocManager.Resolve<NotificationDefinitionManager>().Initialize();
  79. IocManager.Resolve<NavigationManager>().Initialize();
  80. if (Configuration.BackgroundJobs.IsJobExecutionEnabled)
  81. {
  82. var workerManager = IocManager.Resolve<IBackgroundWorkerManager>();
  83. workerManager.Start();
  84. workerManager.Add(IocManager.Resolve<IBackgroundJobManager>());
  85. }
  86. }
  87. public override void Shutdown()
  88. {
  89. if (Configuration.BackgroundJobs.IsJobExecutionEnabled)
  90. {
  91. IocManager.Resolve<IBackgroundWorkerManager>().StopAndWaitToStop();
  92. }
  93. }
  94. private void AddUnitOfWorkFilters()
  95. {
  96. Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.SoftDelete, true);
  97. Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MustHaveTenant, true);
  98. Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MayHaveTenant, true);
  99. }
  100. private void AddSettingProviders()
  101. {
  102. Configuration.Settings.Providers.Add<LocalizationSettingProvider>();
  103. Configuration.Settings.Providers.Add<EmailSettingProvider>();
  104. Configuration.Settings.Providers.Add<NotificationSettingProvider>();
  105. Configuration.Settings.Providers.Add<TimingSettingProvider>();
  106. }
  107. private void AddAuditingSelectors()
  108. {
  109. Configuration.Auditing.Selectors.Add(
  110. new NamedTypeSelector(
  111. "Abp.ApplicationServices",
  112. type => typeof(IApplicationService).IsAssignableFrom(type)
  113. )
  114. );
  115. }
  116. private void AddLocalizationSources()
  117. {
  118. Configuration.Localization.Sources.Add(
  119. new DictionaryBasedLocalizationSource(
  120. AbpConsts.LocalizationSourceName,
  121. new XmlEmbeddedFileLocalizationDictionaryProvider(
  122. typeof(AbpKernelModule).GetAssembly(), "Abp.Localization.Sources.AbpXmlSource"
  123. )));
  124. }
  125. private void ConfigureCaches()
  126. {
  127. Configuration.Caching.Configure(AbpCacheNames.ApplicationSettings, cache =>
  128. {
  129. cache.DefaultSlidingExpireTime = TimeSpan.FromHours(8);
  130. });
  131. Configuration.Caching.Configure(AbpCacheNames.TenantSettings, cache =>
  132. {
  133. cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes(60);
  134. });
  135. Configuration.Caching.Configure(AbpCacheNames.UserSettings, cache =>
  136. {
  137. cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes(20);
  138. });
  139. }
  140. private void AddIgnoredTypes()
  141. {
  142. var commonIgnoredTypes = new[]
  143. {
  144. typeof(Stream),
  145. typeof(Expression)
  146. };
  147. foreach (var ignoredType in commonIgnoredTypes)
  148. {
  149. Configuration.Auditing.IgnoredTypes.AddIfNotContains(ignoredType);
  150. Configuration.Validation.IgnoredTypes.AddIfNotContains(ignoredType);
  151. }
  152. var validationIgnoredTypes = new[] { typeof(Type) };
  153. foreach (var ignoredType in validationIgnoredTypes)
  154. {
  155. Configuration.Validation.IgnoredTypes.AddIfNotContains(ignoredType);
  156. }
  157. }
  158. private void AddMethodParameterValidators()
  159. {
  160. Configuration.Validation.Validators.Add<DataAnnotationsValidator>();
  161. Configuration.Validation.Validators.Add<ValidatableObjectValidator>();
  162. Configuration.Validation.Validators.Add<CustomValidator>();
  163. }
  164. private void AddDefaultNotificationDistributor()
  165. {
  166. Configuration.Notifications.Distributers.Add<DefaultNotificationDistributer>();
  167. }
  168. private void RegisterMissingComponents()
  169. {
  170. if (!IocManager.IsRegistered<IGuidGenerator>())
  171. {
  172. IocManager.IocContainer.Register(
  173. Component
  174. .For<IGuidGenerator, SequentialGuidGenerator>()
  175. .Instance(SequentialGuidGenerator.Instance)
  176. );
  177. }
  178. IocManager.RegisterIfNot<IUnitOfWork, NullUnitOfWork>(DependencyLifeStyle.Transient);
  179. IocManager.RegisterIfNot<IAuditingStore, SimpleLogAuditingStore>(DependencyLifeStyle.Singleton);
  180. IocManager.RegisterIfNot<IPermissionChecker, NullPermissionChecker>(DependencyLifeStyle.Singleton);
  181. IocManager.RegisterIfNot<IRealTimeNotifier, NullRealTimeNotifier>(DependencyLifeStyle.Singleton);
  182. IocManager.RegisterIfNot<INotificationStore, NullNotificationStore>(DependencyLifeStyle.Singleton);
  183. IocManager.RegisterIfNot<IUnitOfWorkFilterExecuter, NullUnitOfWorkFilterExecuter>(DependencyLifeStyle.Singleton);
  184. IocManager.RegisterIfNot<IClientInfoProvider, NullClientInfoProvider>(DependencyLifeStyle.Singleton);
  185. IocManager.RegisterIfNot<ITenantStore, NullTenantStore>(DependencyLifeStyle.Singleton);
  186. IocManager.RegisterIfNot<ITenantResolverCache, NullTenantResolverCache>(DependencyLifeStyle.Singleton);
  187. IocManager.RegisterIfNot<IEntityHistoryStore, NullEntityHistoryStore>(DependencyLifeStyle.Singleton);
  188. if (Configuration.BackgroundJobs.IsJobExecutionEnabled)
  189. {
  190. IocManager.RegisterIfNot<IBackgroundJobStore, InMemoryBackgroundJobStore>(DependencyLifeStyle.Singleton);
  191. }
  192. else
  193. {
  194. IocManager.RegisterIfNot<IBackgroundJobStore, NullBackgroundJobStore>(DependencyLifeStyle.Singleton);
  195. }
  196. }
  197. }
  198. }