abp
376 строк · 13.3 Кб
1using Microsoft.AspNetCore.Extensions.DependencyInjection;2using Microsoft.Extensions.DependencyInjection.Extensions;3using Microsoft.OpenApi.Models;4using MyCompanyName.MyProjectName.Data;5using MyCompanyName.MyProjectName.Localization;6using MyCompanyName.MyProjectName.Menus;7using OpenIddict.Validation.AspNetCore;8using Volo.Abp;9using Volo.Abp.Uow;10using Volo.Abp.Account;11using Volo.Abp.Account.Web;12using Volo.Abp.AspNetCore.Mvc;13using Volo.Abp.AspNetCore.Mvc.Localization;14using Volo.Abp.AspNetCore.Mvc.UI.Bundling;15using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite;16using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling;17using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;18using Volo.Abp.AspNetCore.Serilog;19using Volo.Abp.AuditLogging.EntityFrameworkCore;20using Volo.Abp.Autofac;21using Volo.Abp.AutoMapper;22using Volo.Abp.Emailing;23using Volo.Abp.EntityFrameworkCore;24using Volo.Abp.EntityFrameworkCore.SqlServer;25using Volo.Abp.FeatureManagement;26using Volo.Abp.FeatureManagement.EntityFrameworkCore;27using Volo.Abp.Identity;28using Volo.Abp.Identity.EntityFrameworkCore;29using Volo.Abp.Identity.Web;30using Volo.Abp.Localization;31using Volo.Abp.Localization.ExceptionHandling;32using Volo.Abp.Modularity;33using Volo.Abp.MultiTenancy;34using Volo.Abp.OpenIddict.EntityFrameworkCore;35using Volo.Abp.PermissionManagement;36using Volo.Abp.PermissionManagement.EntityFrameworkCore;37using Volo.Abp.PermissionManagement.HttpApi;38using Volo.Abp.PermissionManagement.Identity;39using Volo.Abp.PermissionManagement.OpenIddict;40using Volo.Abp.SettingManagement;41using Volo.Abp.SettingManagement.EntityFrameworkCore;42using Volo.Abp.SettingManagement.Web;43using Volo.Abp.Swashbuckle;44using Volo.Abp.TenantManagement;45using Volo.Abp.TenantManagement.EntityFrameworkCore;46using Volo.Abp.TenantManagement.Web;47using Volo.Abp.OpenIddict;48using Volo.Abp.Security.Claims;49using Volo.Abp.UI.Navigation;50using Volo.Abp.UI.Navigation.Urls;51using Volo.Abp.Validation.Localization;52using Volo.Abp.VirtualFileSystem;53
54namespace MyCompanyName.MyProjectName;55
56[DependsOn(57// ABP Framework packages58typeof(AbpAspNetCoreMvcModule),59typeof(AbpAutofacModule),60typeof(AbpAutoMapperModule),61typeof(AbpEntityFrameworkCoreSqlServerModule),62typeof(AbpSwashbuckleModule),63typeof(AbpAspNetCoreSerilogModule),64typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule),65
66// Account module packages67typeof(AbpAccountApplicationModule),68typeof(AbpAccountHttpApiModule),69typeof(AbpAccountWebOpenIddictModule),70
71// Identity module packages72typeof(AbpPermissionManagementDomainIdentityModule),73typeof(AbpPermissionManagementDomainOpenIddictModule),74typeof(AbpIdentityApplicationModule),75typeof(AbpIdentityHttpApiModule),76typeof(AbpIdentityEntityFrameworkCoreModule),77typeof(AbpOpenIddictEntityFrameworkCoreModule),78typeof(AbpIdentityWebModule),79
80// Audit logging module packages81typeof(AbpAuditLoggingEntityFrameworkCoreModule),82
83// Permission Management module packages84typeof(AbpPermissionManagementApplicationModule),85typeof(AbpPermissionManagementHttpApiModule),86typeof(AbpPermissionManagementEntityFrameworkCoreModule),87
88// Tenant Management module packages89typeof(AbpTenantManagementApplicationModule),90typeof(AbpTenantManagementHttpApiModule),91typeof(AbpTenantManagementEntityFrameworkCoreModule),92typeof(AbpTenantManagementWebModule),93
94// Feature Management module packages95typeof(AbpFeatureManagementApplicationModule),96typeof(AbpFeatureManagementEntityFrameworkCoreModule),97typeof(AbpFeatureManagementHttpApiModule),98typeof(AbpFeatureManagementWebModule),99
100// Setting Management module packages101typeof(AbpSettingManagementApplicationModule),102typeof(AbpSettingManagementEntityFrameworkCoreModule),103typeof(AbpSettingManagementHttpApiModule),104typeof(AbpSettingManagementWebModule)105)]106public class MyProjectNameModule : AbpModule107{
108/* Single point to enable/disable multi-tenancy */109public const bool IsMultiTenant = true;110
111public override void PreConfigureServices(ServiceConfigurationContext context)112{113var hostingEnvironment = context.Services.GetHostingEnvironment();114var configuration = context.Services.GetConfiguration();115
116context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>117{118options.AddAssemblyResource(119typeof(MyProjectNameResource)120);121});122
123PreConfigure<OpenIddictBuilder>(builder =>124{125builder.AddValidation(options =>126{127options.AddAudiences("MyProjectName");128options.UseLocalServer();129options.UseAspNetCore();130});131});132
133if (!hostingEnvironment.IsDevelopment())134{135PreConfigure<AbpOpenIddictAspNetCoreOptions>(options =>136{137options.AddDevelopmentEncryptionAndSigningCertificate = false;138});139
140PreConfigure<OpenIddictServerBuilder>(serverBuilder =>141{142serverBuilder.AddProductionEncryptionAndSigningCertificate("openiddict.pfx", "00000000-0000-0000-0000-000000000000");143});144}145
146MyProjectNameGlobalFeatureConfigurator.Configure();147MyProjectNameModuleExtensionConfigurator.Configure();148MyProjectNameEfCoreEntityExtensionMappings.Configure();149}150
151public override void ConfigureServices(ServiceConfigurationContext context)152{153var hostingEnvironment = context.Services.GetHostingEnvironment();154var configuration = context.Services.GetConfiguration();155
156if (hostingEnvironment.IsDevelopment())157{158context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());159}160
161ConfigureAuthentication(context);162ConfigureMultiTenancy();163ConfigureUrls(configuration);164ConfigureBundles();165ConfigureAutoMapper(context);166ConfigureSwagger(context.Services);167ConfigureNavigationServices();168ConfigureAutoApiControllers();169ConfigureVirtualFiles(hostingEnvironment);170ConfigureLocalization();171ConfigureEfCore(context);172}173
174private void ConfigureAuthentication(ServiceConfigurationContext context)175{176context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme);177context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>178{179options.IsDynamicClaimsEnabled = true;180});181}182
183private void ConfigureMultiTenancy()184{185Configure<AbpMultiTenancyOptions>(options =>186{187options.IsEnabled = IsMultiTenant;188});189}190
191
192private void ConfigureUrls(IConfiguration configuration)193{194Configure<AppUrlOptions>(options =>195{196options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];197});198}199
200private void ConfigureBundles()201{202Configure<AbpBundlingOptions>(options =>203{204options.StyleBundles.Configure(205LeptonXLiteThemeBundles.Styles.Global,206bundle =>207{208bundle.AddFiles("/global-styles.css");209}210);211});212}213
214private void ConfigureLocalization()215{216Configure<AbpLocalizationOptions>(options =>217{218options.Resources219.Add<MyProjectNameResource>("en")220.AddBaseTypes(typeof(AbpValidationResource))221.AddVirtualJson("/Localization/MyProjectName");222
223options.DefaultResourceType = typeof(MyProjectNameResource);224
225options.Languages.Add(new LanguageInfo("en", "en", "English"));226options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));227options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));228options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));229options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));230options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));231options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));232options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));233options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi"));234options.Languages.Add(new LanguageInfo("is", "is", "Icelandic"));235options.Languages.Add(new LanguageInfo("it", "it", "Italiano"));236options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));237options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));238options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));239options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));240options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));241options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));242options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));243options.Languages.Add(new LanguageInfo("es", "es", "Español"));244options.Languages.Add(new LanguageInfo("el", "el", "Ελληνικά"));245});246
247Configure<AbpExceptionLocalizationOptions>(options =>248{249options.MapCodeNamespace("MyProjectName", typeof(MyProjectNameResource));250});251}252
253private void ConfigureVirtualFiles(IWebHostEnvironment hostingEnvironment)254{255Configure<AbpVirtualFileSystemOptions>(options =>256{257options.FileSets.AddEmbedded<MyProjectNameModule>();258if (hostingEnvironment.IsDevelopment())259{260/* Using physical files in development, so we don't need to recompile on changes */261options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameModule>(hostingEnvironment.ContentRootPath);262}263});264}265
266private void ConfigureNavigationServices()267{268Configure<AbpNavigationOptions>(options =>269{270options.MenuContributors.Add(new MyProjectNameMenuContributor());271});272}273
274private void ConfigureAutoApiControllers()275{276Configure<AbpAspNetCoreMvcOptions>(options =>277{278options.ConventionalControllers.Create(typeof(MyProjectNameModule).Assembly);279});280}281
282private void ConfigureSwagger(IServiceCollection services)283{284services.AddAbpSwaggerGen(285options =>286{287options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });288options.DocInclusionPredicate((docName, description) => true);289options.CustomSchemaIds(type => type.FullName);290}291);292}293
294private void ConfigureAutoMapper(ServiceConfigurationContext context)295{296context.Services.AddAutoMapperObjectMapper<MyProjectNameModule>();297Configure<AbpAutoMapperOptions>(options =>298{299/* Uncomment `validate: true` if you want to enable the Configuration Validation feature.300* See AutoMapper's documentation to learn what it is:
301* https://docs.automapper.org/en/stable/Configuration-validation.html
302*/
303options.AddMaps<MyProjectNameModule>(/* validate: true */);304});305}306
307private void ConfigureEfCore(ServiceConfigurationContext context)308{309context.Services.AddAbpDbContext<MyProjectNameDbContext>(options =>310{311/* You can remove "includeAllEntities: true" to create312* default repositories only for aggregate roots
313* Documentation: https://docs.abp.io/en/abp/latest/Entity-Framework-Core#add-default-repositories
314*/
315options.AddDefaultRepositories(includeAllEntities: true);316});317
318Configure<AbpDbContextOptions>(options =>319{320options.Configure(configurationContext =>321{322configurationContext.UseSqlServer();323});324});325
326//<TEMPLATE-REMOVE IF-NOT='dbms:SQLite'>327Configure<AbpUnitOfWorkDefaultOptions>(options =>328{329options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;330});331//</TEMPLATE-REMOVE>332}333
334public override void OnApplicationInitialization(ApplicationInitializationContext context)335{336var app = context.GetApplicationBuilder();337var env = context.GetEnvironment();338
339if (env.IsDevelopment())340{341app.UseDeveloperExceptionPage();342}343
344app.UseAbpRequestLocalization();345
346if (!env.IsDevelopment())347{348app.UseErrorPage();349}350
351app.UseCorrelationId();352app.UseStaticFiles();353app.UseRouting();354app.UseAuthentication();355app.UseAbpOpenIddictValidation();356
357if (IsMultiTenant)358{359app.UseMultiTenancy();360}361
362app.UseUnitOfWork();363app.UseDynamicClaims();364app.UseAuthorization();365
366app.UseSwagger();367app.UseAbpSwaggerUI(options =>368{369options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API");370});371
372app.UseAuditing();373app.UseAbpSerilogEnrichers();374app.UseConfiguredEndpoints();375}376}
377