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