From 777c3ddd7a69289d2434acf16b90c7db2e8dc36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 Oct 2021 14:50:23 +0300 Subject: [PATCH 01/57] Use new hosting model for the MVC app. --- .../Program.cs | 21 +++++++++---------- .../Startup.cs | 18 ---------------- 2 files changed, 10 insertions(+), 29 deletions(-) delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Startup.cs diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs index e6d0635c7c..3cc35d4291 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs @@ -1,6 +1,8 @@ using System; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; @@ -29,7 +31,14 @@ namespace MyCompanyName.MyProjectName.Web try { Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + builder.Services.AddApplication(); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); return 0; } catch (Exception ex) @@ -42,15 +51,5 @@ namespace MyCompanyName.MyProjectName.Web Log.CloseAndFlush(); } } - - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) - .UseAutofac() - .UseSerilog(); } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Startup.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Startup.cs deleted file mode 100644 index 5bacb0f77e..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Startup.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace MyCompanyName.MyProjectName.Web -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} From 1e2aa8d39c82f8d1d08284388c07f0cb8e82d154 Mon Sep 17 00:00:00 2001 From: "ismail.yilmaz" Date: Mon, 13 Dec 2021 11:32:33 +0300 Subject: [PATCH 02/57] Fixes #10920 --- .../Volo/Abp/Cli/AbpCliCoreModule.cs | 41 +++++++++---------- .../Volo/Abp/Cli/Commands/AddModuleCommand.cs | 2 + .../Abp/Cli/Commands/AddPackageCommand.cs | 2 + .../Volo/Abp/Cli/Commands/BuildCommand.cs | 2 + .../Volo/Abp/Cli/Commands/BundleCommand.cs | 2 + .../CreateMigrationAndRunMigratorCommand.cs | 2 + .../Volo/Abp/Cli/Commands/GetSourceCommand.cs | 2 + .../Volo/Abp/Cli/Commands/HelpCommand.cs | 2 + .../Abp/Cli/Commands/InstallLibsCommand.cs | 2 + .../Abp/Cli/Commands/ListModulesCommand.cs | 2 + .../Volo/Abp/Cli/Commands/LoginCommand.cs | 2 + .../Volo/Abp/Cli/Commands/LoginInfoCommand.cs | 2 + .../Volo/Abp/Cli/Commands/LogoutCommand.cs | 2 + .../Volo/Abp/Cli/Commands/NewCommand.cs | 2 + .../Volo/Abp/Cli/Commands/PromptCommand.cs | 2 + .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 2 + .../Cli/Commands/SwitchToNightlyCommand.cs | 2 + .../Cli/Commands/SwitchToPreviewCommand.cs | 2 + .../Abp/Cli/Commands/SwitchToStableCommand.cs | 2 + .../Volo/Abp/Cli/Commands/TranslateCommand.cs | 2 + .../Volo/Abp/Cli/Commands/UpdateCommand.cs | 2 + 21 files changed, 60 insertions(+), 21 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index 303acd7e00..83a9352faf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -41,29 +41,28 @@ public class AbpCliCoreModule : AbpModule Configure(options => { - //TODO: Define constants like done for GenerateProxyCommand.Name. - options.Commands["help"] = typeof(HelpCommand); - options.Commands["prompt"] = typeof(PromptCommand); - options.Commands["new"] = typeof(NewCommand); - options.Commands["get-source"] = typeof(GetSourceCommand); - options.Commands["update"] = typeof(UpdateCommand); - options.Commands["add-package"] = typeof(AddPackageCommand); - options.Commands["add-module"] = typeof(AddModuleCommand); - options.Commands["list-modules"] = typeof(ListModulesCommand); - options.Commands["login"] = typeof(LoginCommand); - options.Commands["login-info"] = typeof(LoginInfoCommand); - options.Commands["logout"] = typeof(LogoutCommand); + options.Commands[HelpCommand.Name] = typeof(HelpCommand); + options.Commands[PromptCommand.Name] = typeof(PromptCommand); + options.Commands[NewCommand.Name] = typeof(NewCommand); + options.Commands[GetSourceCommand.Name] = typeof(GetSourceCommand); + options.Commands[UpdateCommand.Name] = typeof(UpdateCommand); + options.Commands[AddPackageCommand.Name] = typeof(AddPackageCommand); + options.Commands[AddModuleCommand.Name] = typeof(AddModuleCommand); + options.Commands[ListModulesCommand.Name] = typeof(ListModulesCommand); + options.Commands[LoginCommand.Name] = typeof(LoginCommand); + options.Commands[LoginInfoCommand.Name] = typeof(LoginInfoCommand); + options.Commands[LogoutCommand.Name] = typeof(LogoutCommand); options.Commands[GenerateProxyCommand.Name] = typeof(GenerateProxyCommand); options.Commands[RemoveProxyCommand.Name] = typeof(RemoveProxyCommand); - options.Commands["suite"] = typeof(SuiteCommand); - options.Commands["switch-to-preview"] = typeof(SwitchToPreviewCommand); - options.Commands["switch-to-stable"] = typeof(SwitchToStableCommand); - options.Commands["switch-to-nightly"] = typeof(SwitchToNightlyCommand); - options.Commands["translate"] = typeof(TranslateCommand); - options.Commands["build"] = typeof(BuildCommand); - options.Commands["bundle"] = typeof(BundleCommand); - options.Commands["create-migration-and-run-migrator"] = typeof(CreateMigrationAndRunMigratorCommand); - options.Commands["install-libs"] = typeof(InstallLibsCommand); + options.Commands[SuiteCommand.Name] = typeof(SuiteCommand); + options.Commands[SwitchToPreviewCommand.Name] = typeof(SwitchToPreviewCommand); + options.Commands[SwitchToStableCommand.Name] = typeof(SwitchToStableCommand); + options.Commands[SwitchToNightlyCommand.Name] = typeof(SwitchToNightlyCommand); + options.Commands[TranslateCommand.Name] = typeof(TranslateCommand); + options.Commands[BuildCommand.Name] = typeof(BuildCommand); + options.Commands[BundleCommand.Name] = typeof(BundleCommand); + options.Commands[CreateMigrationAndRunMigratorCommand.Name] = typeof(CreateMigrationAndRunMigratorCommand); + options.Commands[InstallLibsCommand.Name] = typeof(InstallLibsCommand); }); Configure(options => diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddModuleCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddModuleCommand.cs index df38d7c57b..df81fe4cb7 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddModuleCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddModuleCommand.cs @@ -14,6 +14,8 @@ namespace Volo.Abp.Cli.Commands; public class AddModuleCommand : IConsoleCommand, ITransientDependency { + public const string Name = "add-module"; + private AddModuleInfoOutput _lastAddedModuleInfo; public ILogger Logger { get; set; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddPackageCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddPackageCommand.cs index 41d9824c6b..d21730dbb8 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddPackageCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/AddPackageCommand.cs @@ -14,6 +14,8 @@ namespace Volo.Abp.Cli.Commands; public class AddPackageCommand : IConsoleCommand, ITransientDependency { + public const string Name = "add-package"; + public ILogger Logger { get; set; } protected ProjectNugetPackageAdder ProjectNugetPackageAdder { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs index 52c7fdd56c..327b737e89 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.Cli.Commands; public class BuildCommand : IConsoleCommand, ITransientDependency { + public const string Name = "build"; + public IDotNetProjectDependencyFiller DotNetProjectDependencyFiller { get; set; } public IChangedProjectFinder ChangedProjectFinder { get; set; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs index 5367e7461a..e758d22dd3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs @@ -11,6 +11,8 @@ namespace Volo.Abp.Cli.Commands; public class BundleCommand : IConsoleCommand, ITransientDependency { + public const string Name = "bundle"; + public ILogger Logger { get; set; } public IBundlingService BundlingService { get; set; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs index a0ffbeacea..3b6fbefe98 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CreateMigrationAndRunMigratorCommand.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.Cli.Commands; public class CreateMigrationAndRunMigratorCommand : IConsoleCommand, ITransientDependency { + public const string Name = "create-migration-and-run-migrator"; + public ICmdHelper CmdHelper { get; } public ILogger Logger { get; set; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs index 164fc52193..1cccf87f7b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GetSourceCommand.cs @@ -13,6 +13,8 @@ namespace Volo.Abp.Cli.Commands; public class GetSourceCommand : IConsoleCommand, ITransientDependency { + public const string Name = "get-source"; + private readonly SourceCodeDownloadService _sourceCodeDownloadService; public ModuleProjectBuilder ModuleProjectBuilder { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs index 317b1f34ea..918136c8d1 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/HelpCommand.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.Cli.Commands; public class HelpCommand : IConsoleCommand, ITransientDependency { + public const string Name = "help"; + public ILogger Logger { get; set; } protected AbpCliOptions AbpCliOptions { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/InstallLibsCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/InstallLibsCommand.cs index df95204f51..0cf2fd525b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/InstallLibsCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/InstallLibsCommand.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.Cli.Commands; public class InstallLibsCommand : IConsoleCommand, ITransientDependency { + public const string Name = "install-libs"; + public ILogger Logger { get; set; } protected IInstallLibsService InstallLibsService { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs index 1c59a37c46..a916598aac 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ListModulesCommand.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.Cli.Commands; public class ListModulesCommand : IConsoleCommand, ITransientDependency { + public const string Name = "list-modules"; + public ModuleInfoProvider ModuleInfoProvider { get; } public ILogger Logger { get; set; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs index 9cd84a4d41..d98beb268d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs @@ -18,6 +18,8 @@ namespace Volo.Abp.Cli.Commands; public class LoginCommand : IConsoleCommand, ITransientDependency { + public const string Name = "login"; + public ILogger Logger { get; set; } protected AuthService AuthService { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand.cs index 19ce3853cd..0c456f0bca 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginInfoCommand.cs @@ -11,6 +11,8 @@ namespace Volo.Abp.Cli.Commands; public class LoginInfoCommand : IConsoleCommand, ITransientDependency { + public const string Name = "login-info"; + public ILogger Logger { get; set; } protected AuthService AuthService { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LogoutCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LogoutCommand.cs index 6cefaad8e4..ed571dd7b4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LogoutCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LogoutCommand.cs @@ -9,6 +9,8 @@ namespace Volo.Abp.Cli.Commands; public class LogoutCommand : IConsoleCommand, ITransientDependency { + public const string Name = "logout"; + public ILogger Logger { get; set; } protected AuthService AuthService { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 6b01d93de9..2a8542d640 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -19,6 +19,8 @@ namespace Volo.Abp.Cli.Commands; public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransientDependency { + public const string Name = "new"; + public ILogger Logger { get; set; } protected TemplateProjectBuilder TemplateProjectBuilder { get; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/PromptCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/PromptCommand.cs index f1ff0f6025..cbd9267989 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/PromptCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/PromptCommand.cs @@ -7,6 +7,8 @@ namespace Volo.Abp.Cli.Commands; public class PromptCommand : IConsoleCommand, ITransientDependency { + public const string Name = "prompt"; + public Task ExecuteAsync(CommandLineArgs commandLineArgs) { return Task.CompletedTask; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index 760cbb0e45..0e797e682f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -15,6 +15,8 @@ namespace Volo.Abp.Cli.Commands; public class SuiteCommand : IConsoleCommand, ITransientDependency { + public const string Name = "suite"; + public ICmdHelper CmdHelper { get; } private readonly AbpNuGetIndexUrlService _nuGetIndexUrlService; private readonly NuGetService _nuGetService; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToNightlyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToNightlyCommand.cs index 0bfb3ea24b..4893680004 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToNightlyCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToNightlyCommand.cs @@ -8,6 +8,8 @@ namespace Volo.Abp.Cli.Commands; public class SwitchToNightlyCommand : IConsoleCommand, ITransientDependency { + public const string Name = "switch-to-nightly"; + private readonly PackagePreviewSwitcher _packagePreviewSwitcher; public SwitchToNightlyCommand(PackagePreviewSwitcher packagePreviewSwitcher) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToPreviewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToPreviewCommand.cs index 2917a58449..84b58d6b8b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToPreviewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToPreviewCommand.cs @@ -8,6 +8,8 @@ namespace Volo.Abp.Cli.Commands; public class SwitchToPreviewCommand : IConsoleCommand, ITransientDependency { + public const string Name = "switch-to-preview"; + private readonly PackagePreviewSwitcher _packagePreviewSwitcher; public SwitchToPreviewCommand(PackagePreviewSwitcher packagePreviewSwitcher) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToStableCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToStableCommand.cs index 84400f85ef..cc0fa9ff75 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToStableCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SwitchToStableCommand.cs @@ -8,6 +8,8 @@ namespace Volo.Abp.Cli.Commands; public class SwitchToStableCommand : IConsoleCommand, ITransientDependency { + public const string Name = "switch-to-stable"; + private readonly PackagePreviewSwitcher _packagePreviewSwitcher; public SwitchToStableCommand(PackagePreviewSwitcher packagePreviewSwitcher) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/TranslateCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/TranslateCommand.cs index f4895538da..ea6b1d45f6 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/TranslateCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/TranslateCommand.cs @@ -15,6 +15,8 @@ namespace Volo.Abp.Cli.Commands; public class TranslateCommand : IConsoleCommand, ITransientDependency { + public const string Name = "translate"; + public ILogger Logger { get; set; } public Task ExecuteAsync(CommandLineArgs commandLineArgs) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs index 7057df1dd0..fdc9b83fcf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs @@ -13,6 +13,8 @@ namespace Volo.Abp.Cli.Commands; public class UpdateCommand : IConsoleCommand, ITransientDependency { + public const string Name = "update"; + public ILogger Logger { get; set; } private readonly VoloNugetPackagesVersionUpdater _nugetPackagesVersionUpdater; From 77deb88ff193d810b413afa1ff9888dc56e4bda8 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 13 Dec 2021 12:38:11 +0300 Subject: [PATCH 03/57] Create initial "How to Integrate the Syncfusion MVC Components to the ABP MVC UI" article post --- .../POST.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md new file mode 100644 index 0000000000..2485b922d6 --- /dev/null +++ b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md @@ -0,0 +1,42 @@ +# How to Integrate the Syncfusion MVC Components to the ABP MVC UI? + +## Introduction + +Hi, in this step by step article we will see how we can integrate the Syncfusion MVC Components to our ABP MVC UI. + + +## Prerequisites + +* [.NET 6](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) + + * In this article, I will create a new startup template in v5.0.0-rc.2 and if you follow this article from top to end and create a new startup template with me, you need to install the [.NET 6 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) before starting. + + +Also update your ABP CLI to the v5.0.0-rc.2, you can use the below command to update your CLI version: + +```bash +dotnet tool update Volo.Abp.Cli -g --version 5.0.0-rc.2 +``` + +or install if you haven't installed before: + +```bash +dotnet tool install Volo.Abp.Cli -g --version 5.0.0-rc.2 +``` + +## Creating the Solution + +In this article, I will create a new startup template with EF Core as a database provider and MVC for UI framework. But if you already have a project with MVC UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project. + +> If you already have a project, you can skip this section and starts to follow from TODO: step x. + +We can create a new startup template by using the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI): + +```bash +abp new SyncfusionComponentsDemo -t app --preview +``` + +Our project boilerplate will be ready after the download is finished. Then, we can open the solution and start developing. + +## Starting the Development + From c5833066de453c36b77434def700f8098e2da205 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 13 Dec 2021 17:00:12 +0300 Subject: [PATCH 04/57] Update the "How to Integrate the Syncfusion MVC Components to the ABP MVC UI?" post --- .../POST.md | 226 +++++++++++++++++- .../calendar-component.png | Bin 0 -> 26590 bytes .../component-folder-structure.png | Bin 0 -> 15226 bytes .../copy-license-key.png | Bin 0 -> 30386 bytes .../manage-trial-1.png | Bin 0 -> 45966 bytes .../manage-trial-2.png | Bin 0 -> 25376 bytes .../syncfusion-package.png | Bin 0 -> 54111 bytes 7 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/calendar-component.png create mode 100644 docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/component-folder-structure.png create mode 100644 docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/copy-license-key.png create mode 100644 docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/manage-trial-1.png create mode 100644 docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/manage-trial-2.png create mode 100644 docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/syncfusion-package.png diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md index 2485b922d6..fde6c11d5e 100644 --- a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md +++ b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md @@ -4,6 +4,9 @@ Hi, in this step by step article we will see how we can integrate the Syncfusion MVC Components to our ABP MVC UI. +## Source Code + +You can find the source code of the application at https://github.com/EngincanV/ABP-Syncfusion-Components-Demo. ## Prerequisites @@ -28,7 +31,7 @@ dotnet tool install Volo.Abp.Cli -g --version 5.0.0-rc.2 In this article, I will create a new startup template with EF Core as a database provider and MVC for UI framework. But if you already have a project with MVC UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project. -> If you already have a project, you can skip this section and starts to follow from TODO: step x. +> If you already have a project, you can skip this section. We can create a new startup template by using the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI): @@ -40,3 +43,224 @@ Our project boilerplate will be ready after the download is finished. Then, we c ## Starting the Development +### Pre-requisite + +> If you've already had a license from Syncfusion, you can skip this section and starts with Step 1. + +* First thing we need to do is creating an account to be able to get license from Syncfusion. Let's navigate to https://www.syncfusion.com/aspnet-core-ui-controls and click the "Download Free Trial" button. + +* Then fill the form and starts your 30-day free trial. + +* After that, navigates to https://www.syncfusion.com/account/manage-trials/downloads to get our license key that will be used in our application. + +![](./manage-trial-1.png) + +click the "Get License Key" link for "ASP.NET Core (Essential JS 2)". + +![](./manage-trial-2.png) + +Then a modal will be open like above, select the version and click the "Get License Key" button. + +![](./copy-license-key.png) + +* Lastly, copy the generated license key value. This license key will be used in our application, to let Syncfusion check do our license is not expired and valid. + + +### Step 1 (Configurations) + +After providing a license key from Syncfusion, we can start with configuration thats need to be done in our application. + +* We need to install the `Syncfusion.EJ2.AspNet.Core` Nuget package to our Web project (*.Web). + +![](./syncfusion-package.png) + +* After installing the package, we need to register our license key to be able to use the Syncfusion Components. + +* To register the license key, open your web module class and update the `ConfigureServices` methods as follows: + +```csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); + + //Register Syncfusion license + Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(licenseKey: configuration["Syncfusion:LicenseKey"]); + + ConfigureUrls(configuration); + ConfigureBundles(); + ConfigureAuthentication(context, configuration); + ConfigureAutoMapper(); + ConfigureVirtualFileSystem(hostingEnvironment); + ConfigureLocalizationServices(); + ConfigureNavigationServices(); + ConfigureAutoApiControllers(); + ConfigureSwaggerServices(context.Services); +} +``` + +Instead of writing the license key in here we can define it in **appsettings.json** file and use it in here by using the Configuration system of .NET. + +* Open your **appsettings.json** file and add a new section named "Syncfusion": + +```json +{ + //... + + "Syncfusion": { + "LicenseKey": "" + } +} +``` + +> Replace the ` part with your license key that we've obtained in the previous section.` + +* To be able to use the Syncfusion Components we need to define it as tag helper in our **_ViewImports.cshtml** file. By doing that we can use the Syncfusion components everywhere in our application. + +* So open your **/Pages/_ViewImports.cshtml** file and add a new tag helper: + +```cshtml +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling +@addTagHelper *, Syncfusion.EJ2 //use Syncfusion components +``` + +### Step 2 - (Add styles and script to our application) + +* Last thing we need to do is, add some style and script files that provided by Syncfusion, between to our head-body tags. + +* We can do this by creating two view component (one for Styles and other for Scripts). Let's do that. + +First, create folder structure like below under the **Components** folder. + +![](./component-folder-structure.png) + +Then open the related files and add the following codes to each of these files. + +* **Default.cshtml** (/Components/Syncfusion/Script/Default.cshtml) + +```cshtml +@addTagHelper *, Syncfusion.EJ2 //add this line + + + + + + +``` + +* **SyncfusionScriptComponent.cs** + +```csharp +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; + +namespace SyncfusionComponentsDemo.Web.Components.Syncfusion.Script +{ + public class SyncfusionScriptComponent : AbpViewComponent + { + public IViewComponentResult Invoke() + { + return View("~/Components/Syncfusion/Script/Default.cshtml"); + } + } +} +``` + +* **Default.cshtml** (/Components/Syncfusion/Style/Default.cshtml) + +```cshtml + + +``` + +* SyncfusionStyleComponent.cs + +```csharp +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; + +namespace SyncfusionComponentsDemo.Web.Components.Syncfusion.Style +{ + public class SyncfusionStyleComponent : AbpViewComponent + { + public IViewComponentResult Invoke() + { + return View("~/Components/Syncfusion/Style/Default.cshtml"); + } + } +} +``` + +After creating these two components, we can use the [**Layout Hooks**](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Layout-Hooks) system of ABP to inject this two components between head and script tags. + +To do this, open your web module class and update the `ConfigureServices` method as below: + + +```csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); + + //Register Syncfusion license + var licenseKey = configuration["Syncfusion:LicenseKey"].ToString(); + Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(licenseKey: licenseKey); + + Configure(options => + { + //Now, the SyncfusionStyleComponent code will be inserted in the head of the page as the last item. + options.Add(LayoutHooks.Head.Last, typeof(SyncfusionStyleComponent)); + + //the SyncfusionScriptComponent will be inserted in the body of the page as the last item. + options.Add(LayoutHooks.Body.Last, typeof(SyncfusionScriptComponent)); + }); + + ConfigureUrls(configuration); + ConfigureBundles(); + ConfigureAuthentication(context, configuration); + ConfigureAutoMapper(); + ConfigureVirtualFileSystem(hostingEnvironment); + ConfigureLocalizationServices(); + ConfigureNavigationServices(); + ConfigureAutoApiControllers(); + ConfigureSwaggerServices(context.Services); +} +``` + +After injecting the Syncfusion style and script into our application our configurations have been completed. We can try with a simple component to see if it works as we expected. + +Let's try with the [Calendar](https://www.syncfusion.com/aspnet-core-ui-controls/calendar) component. Open your **Index.cshtml** file and update with the below content: + +```cshtml +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using SyncfusionComponentsDemo.Localization +@using Volo.Abp.Users +@model SyncfusionComponentsDemo.Web.Pages.IndexModel + +@section styles { + +} + +@section scripts { + +} + +
+

Syncfusion - Calendar Component

+ +
+``` + +* Then when we run the application, we need to see the relevant calendar component as below. + +![](./calendar-component.png) + +--- + +## See the Syncfusion Components in Action + +//TODO: create a todo application and show some components. \ No newline at end of file diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/calendar-component.png b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/calendar-component.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7f36367ad03faf816d50bba8bdbba8347d0faf GIT binary patch literal 26590 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 Watz#SmshX&P$Wf! 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 J{jBHrzW@NoZbAS6 literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/copy-license-key.png b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/copy-license-key.png new file mode 100644 index 0000000000000000000000000000000000000000..847be0363d73568efc6fe3567a63ca9bbb466551 GIT binary patch literal 30386 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 z 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 LcWxD_KYac-t_MKC literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/syncfusion-package.png b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/syncfusion-package.png new file mode 100644 index 0000000000000000000000000000000000000000..6792ea0c325c3fc3d2bf6ce6dc009733abffb342 GIT binary patch literal 54111 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 QX#z6O)78&qol`;+01k=F)&Kwi literal 0 HcmV?d00001 From d7381d70709802b2e58de1c90d172236948ff74c Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 13 Dec 2021 17:52:57 +0300 Subject: [PATCH 05/57] Update POST.md --- .../POST.md | 68 ++++++++++++------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md index fde6c11d5e..5eae0bb7e6 100644 --- a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md +++ b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md @@ -2,7 +2,7 @@ ## Introduction -Hi, in this step by step article we will see how we can integrate the Syncfusion MVC Components to our ABP MVC UI. +Hi, in this article we will see how we can integrate the Syncfusion MVC Components into our application. ## Source Code @@ -15,7 +15,7 @@ You can find the source code of the application at https://github.com/EngincanV/ * In this article, I will create a new startup template in v5.0.0-rc.2 and if you follow this article from top to end and create a new startup template with me, you need to install the [.NET 6 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) before starting. -Also update your ABP CLI to the v5.0.0-rc.2, you can use the below command to update your CLI version: +Also, update your ABP CLI to the v5.0.0-rc.2, you can use the below command to update your CLI version: ```bash dotnet tool update Volo.Abp.Cli -g --version 5.0.0-rc.2 @@ -31,7 +31,7 @@ dotnet tool install Volo.Abp.Cli -g --version 5.0.0-rc.2 In this article, I will create a new startup template with EF Core as a database provider and MVC for UI framework. But if you already have a project with MVC UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project. -> If you already have a project, you can skip this section. +> If you already have a project with MVC/Razor Pages UI, you can skip this section. We can create a new startup template by using the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI): @@ -45,9 +45,11 @@ Our project boilerplate will be ready after the download is finished. Then, we c ### Pre-requisite -> If you've already had a license from Syncfusion, you can skip this section and starts with Step 1. +> If you've already had a license from Syncfusion, you can skip this section. -* First thing we need to do is creating an account to be able to get license from Syncfusion. Let's navigate to https://www.syncfusion.com/aspnet-core-ui-controls and click the "Download Free Trial" button. +* The first thing we need to do is create an account to be able to get a license from Syncfusion. + +* So, let's navigate to https://www.syncfusion.com/aspnet-core-ui-controls and click the "Download Free Trial" button. * Then fill the form and starts your 30-day free trial. @@ -55,28 +57,43 @@ Our project boilerplate will be ready after the download is finished. Then, we c ![](./manage-trial-1.png) -click the "Get License Key" link for "ASP.NET Core (Essential JS 2)". +Click the "Get License Key" link for "ASP.NET Core (Essential JS 2)". ![](./manage-trial-2.png) -Then a modal will be open like above, select the version and click the "Get License Key" button. +Then a modal will be open like in the above image, select a version and click the "Get License Key" button. ![](./copy-license-key.png) -* Lastly, copy the generated license key value. This license key will be used in our application, to let Syncfusion check do our license is not expired and valid. +Lastly, copy the generated license key value. + +In order to use the relevant components, Syncfusion needs to check this license key to know that our license is valid. + +### Configurations +After providing a license key from Syncfusion, we can start with the configuration that needs to be done in our application. -### Step 1 (Configurations) +#### 1-) Install the Syncfusion.EJ2.AspNet.Core package -After providing a license key from Syncfusion, we can start with configuration thats need to be done in our application. +We need to install the `Syncfusion.EJ2.AspNet.Core` Nuget package to our Web project (*.Web). -* We need to install the `Syncfusion.EJ2.AspNet.Core` Nuget package to our Web project (*.Web). +We can install it via **Visual Studio's Nuget Package Manager**: ![](./syncfusion-package.png) +or via dotnet cli: + +```bash +dotnet add package Syncfusion.EJ2.AspNet.Core --version 19.3.0.57 +``` + +> In this article, I've used the package in version 19.3.0.57. + +#### 2-) Register the License Key + * After installing the package, we need to register our license key to be able to use the Syncfusion Components. -* To register the license key, open your web module class and update the `ConfigureServices` methods as follows: +* To register the license key, open your web module class and update the `ConfigureServices` method as follows: ```csharp public override void ConfigureServices(ServiceConfigurationContext context) @@ -85,7 +102,7 @@ public override void ConfigureServices(ServiceConfigurationContext context) var configuration = context.Services.GetConfiguration(); //Register Syncfusion license - Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(licenseKey: configuration["Syncfusion:LicenseKey"]); + Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(licenseKey: configuration["Syncfusion:LicenseKey"].ToString()); ConfigureUrls(configuration); ConfigureBundles(); @@ -99,9 +116,10 @@ public override void ConfigureServices(ServiceConfigurationContext context) } ``` -Instead of writing the license key in here we can define it in **appsettings.json** file and use it in here by using the Configuration system of .NET. +Instead of writing the license key directly in here we can define it in the **appsettings.json** file and use it here by using the Configuration system of .NET. + -* Open your **appsettings.json** file and add a new section named "Syncfusion": +* Open your **appsettings.json** file and add a new section named "Syncfusion" as below: ```json { @@ -115,9 +133,9 @@ Instead of writing the license key in here we can define it in **appsettings.jso > Replace the ` part with your license key that we've obtained in the previous section.` -* To be able to use the Syncfusion Components we need to define it as tag helper in our **_ViewImports.cshtml** file. By doing that we can use the Syncfusion components everywhere in our application. +* To be able to use the Syncfusion Components we need to define them in our **_ViewImports.cshtml** file. By doing that we can use the Syncfusion components everywhere in our application. -* So open your **/Pages/_ViewImports.cshtml** file and add a new tag helper: +* Open your **/Pages/_ViewImports.cshtml** file and add a new tag helper: ```cshtml @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @@ -127,13 +145,13 @@ Instead of writing the license key in here we can define it in **appsettings.jso @addTagHelper *, Syncfusion.EJ2 //use Syncfusion components ``` -### Step 2 - (Add styles and script to our application) +#### 3-) Adding Syncfusion styles and scripts to our application -* Last thing we need to do is, add some style and script files that provided by Syncfusion, between to our head-body tags. +* The last thing we need to do is, add some style and script files provided by Syncfusion, between our head-body tags. -* We can do this by creating two view component (one for Styles and other for Scripts). Let's do that. +* We can do this by creating two view components (one for Styles and the other for Scripts). Let's do that. -First, create folder structure like below under the **Components** folder. +First, create a folder structure like below under the **Components** folder. ![](./component-folder-structure.png) @@ -232,7 +250,7 @@ public override void ConfigureServices(ServiceConfigurationContext context) After injecting the Syncfusion style and script into our application our configurations have been completed. We can try with a simple component to see if it works as we expected. -Let's try with the [Calendar](https://www.syncfusion.com/aspnet-core-ui-controls/calendar) component. Open your **Index.cshtml** file and update with the below content: +* Let's try with the [Calendar](https://www.syncfusion.com/aspnet-core-ui-controls/calendar) component. Open your **Index.cshtml** file and update with the below content: ```cshtml @page @@ -259,8 +277,8 @@ Let's try with the [Calendar](https://www.syncfusion.com/aspnet-core-ui-controls ![](./calendar-component.png) ---- +### Conclusion -## See the Syncfusion Components in Action +In this article, I've explained how to integrate the **Syncfusion Components** into our applications. After following this article, you can use the Syncfusion components in your application. -//TODO: create a todo application and show some components. \ No newline at end of file +Thanks for reading the article, I hope you've found it useful :) \ No newline at end of file From 969b93cd4dbf0c7148ae355ccc168832b38f3665 Mon Sep 17 00:00:00 2001 From: braim23 <94292623+braim23@users.noreply.github.com> Date: Mon, 13 Dec 2021 18:18:54 +0300 Subject: [PATCH 06/57] braim's edit I've edited simple things and typos, feel free to cherry pick what you want, especially where I changed the I's to we's. --- .../POST.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md index 5eae0bb7e6..95ef4cdddc 100644 --- a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md +++ b/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md @@ -1,4 +1,4 @@ -# How to Integrate the Syncfusion MVC Components to the ABP MVC UI? +# Integrating the Syncfusion MVC Components to the ABP MVC UI ## Introduction @@ -12,16 +12,16 @@ You can find the source code of the application at https://github.com/EngincanV/ * [.NET 6](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) - * In this article, I will create a new startup template in v5.0.0-rc.2 and if you follow this article from top to end and create a new startup template with me, you need to install the [.NET 6 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) before starting. + * In this article, we will create a new startup template in v5.0.0-rc.2 and if you follow this article from top to bottom and create a new startup template with me, you need to install the [.NET 6 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) before starting. -Also, update your ABP CLI to the v5.0.0-rc.2, you can use the below command to update your CLI version: +Also, you need to update your ABP CLI to the v5.0.0-rc.2, you can use the command below to update your CLI version: ```bash dotnet tool update Volo.Abp.Cli -g --version 5.0.0-rc.2 ``` -or install if you haven't installed before: +or install it if you haven't installed it before: ```bash dotnet tool install Volo.Abp.Cli -g --version 5.0.0-rc.2 @@ -29,7 +29,7 @@ dotnet tool install Volo.Abp.Cli -g --version 5.0.0-rc.2 ## Creating the Solution -In this article, I will create a new startup template with EF Core as a database provider and MVC for UI framework. But if you already have a project with MVC UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project. +In this article, we will create a new startup template with EF Core as a database provider and MVC for the UI framework. But if you already have a project with MVC UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project. > If you already have a project with MVC/Razor Pages UI, you can skip this section. @@ -51,9 +51,9 @@ Our project boilerplate will be ready after the download is finished. Then, we c * So, let's navigate to https://www.syncfusion.com/aspnet-core-ui-controls and click the "Download Free Trial" button. -* Then fill the form and starts your 30-day free trial. +* Then fill the form and start your 30-day free trial. -* After that, navigates to https://www.syncfusion.com/account/manage-trials/downloads to get our license key that will be used in our application. +* After that, navigate to https://www.syncfusion.com/account/manage-trials/downloads to get our license key that will be used in our application. ![](./manage-trial-1.png) @@ -61,7 +61,7 @@ Click the "Get License Key" link for "ASP.NET Core (Essential JS 2)". ![](./manage-trial-2.png) -Then a modal will be open like in the above image, select a version and click the "Get License Key" button. +Then a modal will be opened like in the above image, select a version and click the "Get License Key" button. ![](./copy-license-key.png) @@ -151,7 +151,7 @@ Instead of writing the license key directly in here we can define it in the **ap * We can do this by creating two view components (one for Styles and the other for Scripts). Let's do that. -First, create a folder structure like below under the **Components** folder. +First, create a folder structure as shown below under the **Components** folder. ![](./component-folder-structure.png) @@ -212,7 +212,7 @@ namespace SyncfusionComponentsDemo.Web.Components.Syncfusion.Style } ``` -After creating these two components, we can use the [**Layout Hooks**](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Layout-Hooks) system of ABP to inject this two components between head and script tags. +After creating these two components, we can use the [**Layout Hooks**](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Layout-Hooks) system of ABP to inject these two components between head and script tags. To do this, open your web module class and update the `ConfigureServices` method as below: @@ -248,7 +248,7 @@ public override void ConfigureServices(ServiceConfigurationContext context) } ``` -After injecting the Syncfusion style and script into our application our configurations have been completed. We can try with a simple component to see if it works as we expected. +After injecting the Syncfusion style and script into our application, our configurations have been completed. We can try with a simple component to see if it works as we expected. * Let's try with the [Calendar](https://www.syncfusion.com/aspnet-core-ui-controls/calendar) component. Open your **Index.cshtml** file and update with the below content: @@ -279,6 +279,6 @@ After injecting the Syncfusion style and script into our application our configu ### Conclusion -In this article, I've explained how to integrate the **Syncfusion Components** into our applications. After following this article, you can use the Syncfusion components in your application. +In this article, we've explained how to integrate the **Syncfusion Components** into our applications. After following this article, you can use the Syncfusion components in your application. Thanks for reading the article, I hope you've found it useful :) \ No newline at end of file From 2437e3e627622d8651c732f9b6998549cfc6c447 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 14 Dec 2021 10:28:02 +0800 Subject: [PATCH 07/57] Use new hosting model for the app template. --- .../Program.cs | 77 +++++++++---------- .../Startup.cs | 19 ----- .../Program.cs | 77 +++++++++---------- .../Startup.cs | 19 ----- .../Program.cs | 77 +++++++++---------- .../Startup.cs | 20 ----- .../Program.cs | 77 +++++++++---------- .../Startup.cs | 20 ----- .../Program.cs | 77 +++++++++---------- .../Startup.cs | 18 ----- .../Menus/MyProjectNameMenuContributor.cs | 4 +- .../Program.cs | 77 +++++++++---------- .../Startup.cs | 19 ----- .../Program.cs | 72 ++++++++--------- 14 files changed, 266 insertions(+), 387 deletions(-) delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Startup.cs delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Startup.cs delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Startup.cs delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Startup.cs delete mode 100644 templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Startup.cs diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs index 5ec3416569..a64b17a3f9 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs @@ -1,56 +1,55 @@ using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; -namespace MyCompanyName.MyProjectName.Blazor.Server.Tiered +namespace MyCompanyName.MyProjectName.Blazor.Server.Tiered; + +public class Program { - public class Program + public static int Main(string[] args) { - public static int Main(string[] args) - { - Log.Logger = new LoggerConfiguration() + Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); - - try - { - Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } + .CreateLogger(); - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) + try + { + Log.Information("Starting web host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); + builder.Services.AddApplication(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Startup.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Startup.cs deleted file mode 100644 index c1624c69e8..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Startup.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; - -namespace MyCompanyName.MyProjectName.Blazor.Server.Tiered -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.InitializeApplication(); - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs index 636f823d17..ef9b6dcf35 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs @@ -1,56 +1,55 @@ using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; -namespace MyCompanyName.MyProjectName.Blazor.Server +namespace MyCompanyName.MyProjectName.Blazor.Server; + +public class Program { - public class Program + public static int Main(string[] args) { - public static int Main(string[] args) - { - Log.Logger = new LoggerConfiguration() + Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); - - try - { - Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } + .CreateLogger(); - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) + try + { + Log.Information("Starting web host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); + builder.Services.AddApplication(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Startup.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Startup.cs deleted file mode 100644 index 309255b725..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Startup.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; - -namespace MyCompanyName.MyProjectName.Blazor.Server -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.InitializeApplication(); - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs index e16edddb92..e6f48c54c2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs @@ -1,56 +1,55 @@ using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; -namespace MyCompanyName.MyProjectName +namespace MyCompanyName.MyProjectName; + +public class Program { - public class Program + public static int Main(string[] args) { - public static int Main(string[] args) - { - Log.Logger = new LoggerConfiguration() + Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); - - try - { - Log.Information("Starting MyCompanyName.MyProjectName.HttpApi.Host."); - CreateHostBuilder(args).Build().Run(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } + .CreateLogger(); - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) + try + { + Log.Information("Starting MyCompanyName.MyProjectName.HttpApi.Host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); + builder.Services.AddApplication(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs deleted file mode 100644 index 644425b274..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MyCompanyName.MyProjectName -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs index e16edddb92..e6f48c54c2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs @@ -1,56 +1,55 @@ using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; -namespace MyCompanyName.MyProjectName +namespace MyCompanyName.MyProjectName; + +public class Program { - public class Program + public static int Main(string[] args) { - public static int Main(string[] args) - { - Log.Logger = new LoggerConfiguration() + Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); - - try - { - Log.Information("Starting MyCompanyName.MyProjectName.HttpApi.Host."); - CreateHostBuilder(args).Build().Run(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } + .CreateLogger(); - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) + try + { + Log.Information("Starting MyCompanyName.MyProjectName.HttpApi.Host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); + builder.Services.AddApplication(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Startup.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Startup.cs deleted file mode 100644 index 644425b274..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Startup.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MyCompanyName.MyProjectName -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs index 8a57ded111..499c2e2b41 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs @@ -1,56 +1,55 @@ using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; -namespace MyCompanyName.MyProjectName +namespace MyCompanyName.MyProjectName; + +public class Program { - public class Program + public static int Main(string[] args) { - public static int Main(string[] args) - { - Log.Logger = new LoggerConfiguration() + Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); - - try - { - Log.Information("Starting MyCompanyName.MyProjectName.IdentityServer."); - CreateHostBuilder(args).Build().Run(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "MyCompanyName.MyProjectName.IdentityServer terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } + .CreateLogger(); - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) + try + { + Log.Information("Starting MyCompanyName.MyProjectName.IdentityServer."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); + builder.Services.AddApplication(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "MyCompanyName.MyProjectName.IdentityServer terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Startup.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Startup.cs deleted file mode 100644 index 7fd62325bd..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Startup.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace MyCompanyName.MyProjectName -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs index 47298887a4..2ac495d63d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs @@ -50,7 +50,7 @@ namespace MyCompanyName.MyProjectName.Web.Menus order: 0 ) ); - + if (MultiTenancyConsts.IsEnabled) { administration.SetSubItemOrder(TenantManagementMenuNames.GroupName, 1); @@ -59,7 +59,7 @@ namespace MyCompanyName.MyProjectName.Web.Menus { administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName); } - + administration.SetSubItemOrder(IdentityMenuNames.GroupName, 2); administration.SetSubItemOrder(SettingManagementMenuNames.GroupName, 3); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs index e6d0635c7c..cdb4a395cc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs @@ -1,56 +1,55 @@ using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; -namespace MyCompanyName.MyProjectName.Web +namespace MyCompanyName.MyProjectName.Web; + +public class Program { - public class Program + public static int Main(string[] args) { - public static int Main(string[] args) - { - Log.Logger = new LoggerConfiguration() + Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); - - try - { - Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } + .CreateLogger(); - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) + try + { + Log.Information("Starting web host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); + builder.Services.AddApplication(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Startup.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Startup.cs deleted file mode 100644 index 9428c74114..0000000000 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Startup.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MyCompanyName.MyProjectName.Web -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } - } -} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs index 3cc35d4291..cdb4a395cc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs @@ -1,55 +1,55 @@ using System; using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; -namespace MyCompanyName.MyProjectName.Web +namespace MyCompanyName.MyProjectName.Web; + +public class Program { - public class Program + public static int Main(string[] args) { - public static int Main(string[] args) - { - Log.Logger = new LoggerConfiguration() + Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) - .Enrich.FromLogContext() - .WriteTo.Async(c => c.File("Logs/logs.txt")) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); + .CreateLogger(); - try - { - Log.Information("Starting web host."); - var builder = WebApplication.CreateBuilder(args); - builder.Host.AddAppSettingsSecretsJson() - .UseAutofac() - .UseSerilog(); - builder.Services.AddApplication(); - var app = builder.Build(); - app.InitializeApplication(); - app.Run(); - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally + try + { + Log.Information("Starting web host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + builder.Services.AddApplication(options => { - Log.CloseAndFlush(); - } + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + app.InitializeApplication(); + app.Run(); + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); } } } From 458dc0dcc8997b79ec1278d6e073d82b2f375834 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 14 Dec 2021 10:56:16 +0800 Subject: [PATCH 08/57] Update MyProjectNameMenuContributor.cs --- .../Menus/MyProjectNameMenuContributor.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs index 961cd44519..fd918a71db 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs @@ -60,6 +60,9 @@ public class MyProjectNameMenuContributor : IMenuContributor administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName); } + administration.SetSubItemOrder(IdentityMenuNames.GroupName, 2); + administration.SetSubItemOrder(SettingManagementMenuNames.GroupName, 3); + return Task.CompletedTask; } From 57892088d81fff45a5437988da4bcc0b08acb7cd Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 14 Dec 2021 09:25:34 +0300 Subject: [PATCH 09/57] Change folder name for syncfusion article --- .../POST.md | 0 .../calendar-component.png | Bin .../component-folder-structure.png | Bin .../copy-license-key.png | Bin .../manage-trial-1.png | Bin .../manage-trial-2.png | Bin .../syncfusion-package.png | Bin 7 files changed, 0 insertions(+), 0 deletions(-) rename docs/en/Community-Articles/{2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component => 2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI}/POST.md (100%) rename docs/en/Community-Articles/{2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component => 2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI}/calendar-component.png (100%) rename docs/en/Community-Articles/{2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component => 2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI}/component-folder-structure.png (100%) rename docs/en/Community-Articles/{2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component => 2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI}/copy-license-key.png (100%) rename docs/en/Community-Articles/{2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component => 2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI}/manage-trial-1.png (100%) rename docs/en/Community-Articles/{2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component => 2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI}/manage-trial-2.png (100%) rename docs/en/Community-Articles/{2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component => 2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI}/syncfusion-package.png (100%) diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md similarity index 100% rename from docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/POST.md rename to docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/calendar-component.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/calendar-component.png similarity index 100% rename from docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/calendar-component.png rename to docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/calendar-component.png diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/component-folder-structure.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/component-folder-structure.png similarity index 100% rename from docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/component-folder-structure.png rename to docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/component-folder-structure.png diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/copy-license-key.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/copy-license-key.png similarity index 100% rename from docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/copy-license-key.png rename to docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/copy-license-key.png diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/manage-trial-1.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-1.png similarity index 100% rename from docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/manage-trial-1.png rename to docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-1.png diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/manage-trial-2.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-2.png similarity index 100% rename from docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/manage-trial-2.png rename to docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/manage-trial-2.png diff --git a/docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/syncfusion-package.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-package.png similarity index 100% rename from docs/en/Community-Articles/2021-12-13-How-to-Integrate-the-Syncfusion-MVC-Component/syncfusion-package.png rename to docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-package.png From b059eb4dca3170075bf98a45279ee96b20f81a23 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Tue, 14 Dec 2021 10:35:49 +0300 Subject: [PATCH 10/57] Use local package files instead of CDN for Syncfusion --- .../POST.md | 42 ++++++++++++++++-- .../syncfusion-libs.png | Bin 0 -> 14990 bytes 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-libs.png diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md index 95ef4cdddc..b2d41a5211 100644 --- a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md +++ b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md @@ -147,7 +147,43 @@ Instead of writing the license key directly in here we can define it in the **ap #### 3-) Adding Syncfusion styles and scripts to our application -* The last thing we need to do is, add some style and script files provided by Syncfusion, between our head-body tags. +Firstly, let's install the `@syncfusion/ej2` package from **npm**. + +* Open your **package.json** file and add the `@syncfusion/ej2` package with version **19.3.57**: + +```json +{ + "version": "1.0.0", + "name": "my-app", + "private": true, + "dependencies": { + "@abp/aspnetcore.mvc.ui.theme.basic": "^5.0.0-rc.2", + "@syncfusion/ej2": "^19.3.57" + } +} +``` + +* Then, open the **abp.resourcemapping.js** file and update the **mappings** section: + +```js +module.exports = { + aliases: { + + }, + mappings: { + "@node_modules/@syncfusion/ej2/dist/ej2.min.js": "@libs/syncfusion/", + "@node_modules/@syncfusion/ej2/material.css": "@libs/syncfusion/" + } +}; +``` + +> ABP copies related packages from **node_modules** folder to the **libs** folder by examining this file. You can read this [document](docs.abp.io/en/abp/latest/UI/AspNetCore/Client-Side-Package-Management#mapping-the-library-resources) for more info. + +* Then run the `abp install-libs` to install the dependencies and copy them into the libs folder by your mappings configuration. After running this command, in your **libs** folder it should be a folder named **syncfusion** folder. + +![](./syncfusion-libs.png) + +The last thing we need to do is, add some style and script files provided by Syncfusion, between our head-body tags. * We can do this by creating two view components (one for Styles and the other for Scripts). Let's do that. @@ -163,7 +199,7 @@ Then open the related files and add the following codes to each of these files. @addTagHelper *, Syncfusion.EJ2 //add this line - + @@ -191,7 +227,7 @@ namespace SyncfusionComponentsDemo.Web.Components.Syncfusion.Script ```cshtml - + ``` * SyncfusionStyleComponent.cs diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-libs.png b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/syncfusion-libs.png new file mode 100644 index 0000000000000000000000000000000000000000..d75935d8fd4d503717cdf8eea47808a05970586d GIT binary patch literal 14990 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 literal 0 HcmV?d00001 From 9e9c2020d9734be8a69c9244cf7ad612d5377249 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 15 Dec 2021 17:48:24 +0800 Subject: [PATCH 11/57] Update ABP Blazor UI v4.x to v5.0 Migration Guide --- docs/en/Migration-Guides/Abp-5-0-Blazor.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/en/Migration-Guides/Abp-5-0-Blazor.md b/docs/en/Migration-Guides/Abp-5-0-Blazor.md index f0c69b679a..beead81bf1 100644 --- a/docs/en/Migration-Guides/Abp-5-0-Blazor.md +++ b/docs/en/Migration-Guides/Abp-5-0-Blazor.md @@ -4,4 +4,16 @@ ## Upgrading to the latest Blazorise -ABP 5.0 uses the latest version of the [Blazorise](https://blazorise.com/) library. Please upgrade the Blazorise NuGet packages in your solution. \ No newline at end of file +ABP 5.0 uses the latest version of the [Blazorise](https://blazorise.com/) library. Please upgrade the Blazorise NuGet packages in your solution. + +## Bootstrap 5 + +ABP 5.0 now works with Bootstrap 5. For details, please refer to the official migration guide provided by Bootstrap. + +Replace `Blazorise.Bootstrap` with `Blazorise.Bootstrap5` package. + +Replace `AddBootstrapProviders()` with `AddBootstrap5Providers()`. + +## Update Bundle + +Use `abp bundle` command to update bundles if you are using Blazor WebAssembly. \ No newline at end of file From 7fe562e280f9a268aa515de9d0306a7398449b25 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 15 Dec 2021 17:51:39 +0800 Subject: [PATCH 12/57] Update Abp-5-0-Blazor.md --- docs/en/Migration-Guides/Abp-5-0-Blazor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Migration-Guides/Abp-5-0-Blazor.md b/docs/en/Migration-Guides/Abp-5-0-Blazor.md index beead81bf1..326bac55d5 100644 --- a/docs/en/Migration-Guides/Abp-5-0-Blazor.md +++ b/docs/en/Migration-Guides/Abp-5-0-Blazor.md @@ -8,7 +8,7 @@ ABP 5.0 uses the latest version of the [Blazorise](https://blazorise.com/) libra ## Bootstrap 5 -ABP 5.0 now works with Bootstrap 5. For details, please refer to the official migration guide provided by Bootstrap. +ABP 5.0 now works with Bootstrap 5. For details, please refer to the official [migration guide](https://getbootstrap.com/docs/5.0/migration/) provided by Bootstrap. Replace `Blazorise.Bootstrap` with `Blazorise.Bootstrap5` package. From 8c5e3cd30aeb34eff42a3c292a9f1a4d4b19355e Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 17 Dec 2021 21:39:19 +0800 Subject: [PATCH 13/57] Async configure and initialize the module. --- .../AbpApplicationBuilderExtensions.cs | 22 ++++ .../ServiceCollectionApplicationExtensions.cs | 17 +++ .../Volo/Abp/AbpApplicationBase.cs | 107 +++++++++++++++++- .../Volo/Abp/AbpApplicationCreationOptions.cs | 3 + .../Volo/Abp/AbpApplicationFactory.cs | 55 +++++++++ ...pApplicationWithExternalServiceProvider.cs | 10 ++ ...pApplicationWithInternalServiceProvider.cs | 7 ++ .../Volo.Abp.Core/Volo/Abp/IAbpApplication.cs | 6 + ...pApplicationWithExternalServiceProvider.cs | 13 +++ ...pApplicationWithInternalServiceProvider.cs | 13 +++ .../Volo/Abp/IOnApplicationInitialization.cs | 5 +- .../Volo/Abp/IOnApplicationShutdown.cs | 5 +- .../Volo/Abp/Modularity/AbpModule.cs | 43 +++++++ .../DefaultModuleLifecycleContributor.cs | 36 +++++- .../Volo/Abp/Modularity/IAbpModule.cs | 6 +- .../Modularity/IModuleLifecycleContributor.cs | 7 +- .../Volo/Abp/Modularity/IModuleManager.cs | 7 +- .../IOnPostApplicationInitialization.cs | 5 +- .../IOnPreApplicationInitialization.cs | 5 +- .../Abp/Modularity/IPostConfigureServices.cs | 4 +- .../Abp/Modularity/IPreConfigureServices.cs | 4 +- .../ModuleLifecycleContributorBase.cs | 14 ++- .../Volo/Abp/Modularity/ModuleManager.cs | 41 +++++++ .../Abp/AbpApplication_Initialize_Tests.cs | 82 +++++++++++++- .../ConfigurationAccessor_Tests.cs | 36 +++++- .../AutoServiceRegistration_Tests.cs | 15 +++ .../HybridServiceScopeFactory_Tests.cs | 31 +++++ .../Volo/Abp/Modularity/TestModuleBase.cs | 68 ++++++++++- 28 files changed, 647 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index 2e8b221b3c..b15167fa1d 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.AspNetCore.RequestLocalization; using Microsoft.Extensions.DependencyInjection; @@ -18,6 +19,27 @@ public static class AbpApplicationBuilderExtensions { private const string ExceptionHandlingMiddlewareMarker = "_AbpExceptionHandlingMiddleware_Added"; + public async static Task InitializeApplicationAsync([NotNull] this IApplicationBuilder app) + { + Check.NotNull(app, nameof(app)); + + app.ApplicationServices.GetRequiredService>().Value = app; + var application = app.ApplicationServices.GetRequiredService(); + var applicationLifetime = app.ApplicationServices.GetRequiredService(); + + applicationLifetime.ApplicationStopping.Register(() => + { + application.ShutdownAsync(); + }); + + applicationLifetime.ApplicationStopped.Register(() => + { + application.Dispose(); + }); + + await application.InitializeAsync(app.ApplicationServices); + } + public static void InitializeApplication([NotNull] this IApplicationBuilder app) { Check.NotNull(app, nameof(app)); diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs index 7748953cc4..ce4af2befa 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionApplicationExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; using Volo.Abp; using Volo.Abp.Modularity; @@ -22,4 +23,20 @@ public static class ServiceCollectionApplicationExtensions { return AbpApplicationFactory.Create(startupModuleType, services, optionsAction); } + + public async static Task AddApplicationAsync( + [NotNull] this IServiceCollection services, + [CanBeNull] Action optionsAction = null) + where TStartupModule : IAbpModule + { + return await AbpApplicationFactory.CreateAsync(services, optionsAction); + } + + public async static Task AddApplicationAsync( + [NotNull] this IServiceCollection services, + [NotNull] Type startupModuleType, + [CanBeNull] Action optionsAction = null) + { + return await AbpApplicationFactory.CreateAsync(startupModuleType, services, optionsAction); + } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index 85b1989445..c6e86b4af8 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -46,7 +47,21 @@ public abstract class AbpApplicationBase : IAbpApplication services.AddCoreAbpServices(this, options); Modules = LoadModules(services, options); - ConfigureServices(); + + if (!options.ManualConfigureServices) + { + ConfigureServices(); + } + } + + public virtual async Task ShutdownAsync() + { + using (var scope = ServiceProvider.CreateScope()) + { + await scope.ServiceProvider + .GetRequiredService() + .ShutdownModulesAsync(new ApplicationShutdownContext(scope.ServiceProvider)); + } } public virtual void Shutdown() @@ -70,6 +85,17 @@ public abstract class AbpApplicationBase : IAbpApplication ServiceProvider.GetRequiredService>().Value = ServiceProvider; } + protected virtual async Task InitializeModulesAsync() + { + using (var scope = ServiceProvider.CreateScope()) + { + WriteInitLogs(scope.ServiceProvider); + await scope.ServiceProvider + .GetRequiredService() + .InitializeModulesAsync(new ApplicationInitializationContext(scope.ServiceProvider)); + } + } + protected virtual void InitializeModules() { using (var scope = ServiceProvider.CreateScope()) @@ -111,7 +137,84 @@ public abstract class AbpApplicationBase : IAbpApplication } //TODO: We can extract a new class for this - protected virtual void ConfigureServices() + public virtual async Task ConfigureServicesAsync() + { + var context = new ServiceConfigurationContext(Services); + Services.AddSingleton(context); + + foreach (var module in Modules) + { + if (module.Instance is AbpModule abpModule) + { + abpModule.ServiceConfigurationContext = context; + } + } + + //PreConfigureServices + foreach (var module in Modules.Where(m => m.Instance is IPreConfigureServices)) + { + try + { + await ((IPreConfigureServices)module.Instance).PreConfigureServicesAsync(context); + } + catch (Exception ex) + { + throw new AbpInitializationException($"An error occurred during {nameof(IPreConfigureServices.PreConfigureServicesAsync)} phase of the module {module.Type.AssemblyQualifiedName}. See the inner exception for details.", ex); + } + } + + var assemblies = new HashSet(); + + //ConfigureServices + foreach (var module in Modules) + { + if (module.Instance is AbpModule abpModule) + { + if (!abpModule.SkipAutoServiceRegistration) + { + var assembly = module.Type.Assembly; + if (!assemblies.Contains(assembly)) + { + Services.AddAssembly(assembly); + assemblies.Add(assembly); + } + } + } + + try + { + await module.Instance.ConfigureServicesAsync(context); + } + catch (Exception ex) + { + throw new AbpInitializationException($"An error occurred during {nameof(IAbpModule.ConfigureServicesAsync)} phase of the module {module.Type.AssemblyQualifiedName}. See the inner exception for details.", ex); + } + } + + //PostConfigureServices + foreach (var module in Modules.Where(m => m.Instance is IPostConfigureServices)) + { + try + { + await ((IPostConfigureServices)module.Instance).PostConfigureServicesAsync(context); + } + catch (Exception ex) + { + throw new AbpInitializationException($"An error occurred during {nameof(IPostConfigureServices.PostConfigureServicesAsync)} phase of the module {module.Type.AssemblyQualifiedName}. See the inner exception for details.", ex); + } + } + + foreach (var module in Modules) + { + if (module.Instance is AbpModule abpModule) + { + abpModule.ServiceConfigurationContext = null; + } + } + } + + //TODO: We can extract a new class for this + public virtual void ConfigureServices() { var context = new ServiceConfigurationContext(Services); Services.AddSingleton(context); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs index ea2d69aae6..8bf7579843 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs @@ -19,10 +19,13 @@ public class AbpApplicationCreationOptions [NotNull] public AbpConfigurationBuilderOptions Configuration { get; } + public bool ManualConfigureServices { get; set; } + public AbpApplicationCreationOptions([NotNull] IServiceCollection services) { Services = Check.NotNull(services, nameof(services)); PlugInSources = new PlugInSourceList(); Configuration = new AbpConfigurationBuilderOptions(); + ManualConfigureServices = false; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs index 13b886f1c3..d904c24ca2 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; @@ -7,6 +8,60 @@ namespace Volo.Abp; public static class AbpApplicationFactory { + public async static Task CreateAsync( + [CanBeNull] Action optionsAction = null) + where TStartupModule : IAbpModule + { + var app = Create(typeof(TStartupModule), options => + { + optionsAction?.Invoke(options); + options.ManualConfigureServices = true; + }); + await app.ConfigureServicesAsync(); + return app; + } + + public async static Task CreateAsync( + [NotNull] Type startupModuleType, + [CanBeNull] Action optionsAction = null) + { + var app = new AbpApplicationWithInternalServiceProvider(startupModuleType, options => + { + optionsAction?.Invoke(options); + options.ManualConfigureServices = true; + }); + await app.ConfigureServicesAsync(); + return app; + } + + public async static Task CreateAsync( + [NotNull] IServiceCollection services, + [CanBeNull] Action optionsAction = null) + where TStartupModule : IAbpModule + { + var app = Create(typeof(TStartupModule), services, options => + { + optionsAction?.Invoke(options); + options.ManualConfigureServices = true; + }); + await app.ConfigureServicesAsync(); + return app; + } + + public async static Task CreateAsync( + [NotNull] Type startupModuleType, + [NotNull] IServiceCollection services, + [CanBeNull] Action optionsAction = null) + { + var app = new AbpApplicationWithExternalServiceProvider(startupModuleType, services, options => + { + optionsAction?.Invoke(options); + options.ManualConfigureServices = true; + }); + await app.ConfigureServicesAsync(); + return app; + } + public static IAbpApplicationWithInternalServiceProvider Create( [CanBeNull] Action optionsAction = null) where TStartupModule : IAbpModule diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs index 162d68b5d7..fbb9d611cf 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithExternalServiceProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; @@ -35,6 +36,15 @@ internal class AbpApplicationWithExternalServiceProvider : AbpApplicationBase, I SetServiceProvider(serviceProvider); } + public async Task InitializeAsync(IServiceProvider serviceProvider) + { + Check.NotNull(serviceProvider, nameof(serviceProvider)); + + SetServiceProvider(serviceProvider); + + await InitializeModulesAsync(); + } + public void Initialize([NotNull] IServiceProvider serviceProvider) { Check.NotNull(serviceProvider, nameof(serviceProvider)); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs index eb118410cd..245ce6fb06 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationWithInternalServiceProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; @@ -44,6 +45,12 @@ internal class AbpApplicationWithInternalServiceProvider : AbpApplicationBase, I return ServiceProvider; } + public async Task InitializeAsync() + { + CreateServiceProvider(); + await InitializeModulesAsync(); + } + public void Initialize() { CreateServiceProvider(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs index de9201bebc..b51fd7ec37 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; @@ -23,6 +24,11 @@ public interface IAbpApplication : IModuleContainer, IDisposable /// IServiceProvider ServiceProvider { get; } + ///

+ /// Used to gracefully shutdown the application and all modules. + /// + Task ShutdownAsync(); + /// /// Used to gracefully shutdown the application and all modules. /// diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs index 91c95f4518..b4363e1161 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; namespace Volo.Abp; @@ -10,6 +11,18 @@ public interface IAbpApplicationWithExternalServiceProvider : IAbpApplication /// void SetServiceProvider([NotNull] IServiceProvider serviceProvider); + /// + /// Call the Pre/Post/ConfigureServicesAsync method of the modules. + /// + Task ConfigureServicesAsync(); + + /// + /// Sets the service provider and initializes all the modules. + /// If was called before, the same + /// instance should be passed to this method. + /// + Task InitializeAsync([NotNull] IServiceProvider serviceProvider); + /// /// Sets the service provider and initializes all the modules. /// If was called before, the same diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs index 61fdb0652f..8a3b4c7ca1 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; namespace Volo.Abp; @@ -10,6 +11,18 @@ public interface IAbpApplicationWithInternalServiceProvider : IAbpApplication /// IServiceProvider CreateServiceProvider(); + /// + /// Call the Pre/Post/ConfigureServicesAsync method of the modules. + /// + Task ConfigureServicesAsync(); + + /// + /// Creates the service provider and initializes all the modules. + /// If method was called before, + /// it does not re-create it, but uses the previous one. + /// + Task InitializeAsync(); + /// /// Creates the service provider and initializes all the modules. /// If method was called before, diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationInitialization.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationInitialization.cs index 5ed95a545b..6131a8b710 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationInitialization.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationInitialization.cs @@ -1,8 +1,11 @@ -using JetBrains.Annotations; +using System.Threading.Tasks; +using JetBrains.Annotations; namespace Volo.Abp; public interface IOnApplicationInitialization { + Task OnApplicationInitializationAsync([NotNull] ApplicationInitializationContext context); + void OnApplicationInitialization([NotNull] ApplicationInitializationContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationShutdown.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationShutdown.cs index ced040851e..9f67ebb466 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationShutdown.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IOnApplicationShutdown.cs @@ -1,8 +1,11 @@ -using JetBrains.Annotations; +using System.Threading.Tasks; +using JetBrains.Annotations; namespace Volo.Abp; public interface IOnApplicationShutdown { + Task OnApplicationShutdownAsync([NotNull] ApplicationShutdownContext context); + void OnApplicationShutdown([NotNull] ApplicationShutdownContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs index 537ccc54f6..ae2bec3112 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs @@ -1,5 +1,6 @@ using System; using System.Reflection; +using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -30,36 +31,78 @@ public abstract class AbpModule : private ServiceConfigurationContext _serviceConfigurationContext; + public virtual Task PreConfigureServicesAsync(ServiceConfigurationContext context) + { + PreConfigureServices(context); + return Task.CompletedTask; + } + public virtual void PreConfigureServices(ServiceConfigurationContext context) { } + public virtual Task ConfigureServicesAsync(ServiceConfigurationContext context) + { + ConfigureServices(context); + return Task.CompletedTask; + } + public virtual void ConfigureServices(ServiceConfigurationContext context) { } + public virtual Task PostConfigureServicesAsync(ServiceConfigurationContext context) + { + PostConfigureServices(context); + return Task.CompletedTask; + } + public virtual void PostConfigureServices(ServiceConfigurationContext context) { } + public virtual Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) + { + OnPreApplicationInitialization(context); + return Task.CompletedTask; + } + public virtual void OnPreApplicationInitialization(ApplicationInitializationContext context) { } + public virtual Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + OnApplicationInitialization(context); + return Task.CompletedTask; + } + public virtual void OnApplicationInitialization(ApplicationInitializationContext context) { } + public virtual Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context) + { + OnPostApplicationInitialization(context); + return Task.CompletedTask; + } + public virtual void OnPostApplicationInitialization(ApplicationInitializationContext context) { } + public virtual Task OnApplicationShutdownAsync(ApplicationShutdownContext context) + { + OnApplicationShutdown(context); + return Task.CompletedTask; + } + public virtual void OnApplicationShutdown(ApplicationShutdownContext context) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DefaultModuleLifecycleContributor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DefaultModuleLifecycleContributor.cs index f548cfaafb..c520cc8d58 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DefaultModuleLifecycleContributor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/DefaultModuleLifecycleContributor.cs @@ -1,7 +1,17 @@ -namespace Volo.Abp.Modularity; +using System.Threading.Tasks; + +namespace Volo.Abp.Modularity; public class OnApplicationInitializationModuleLifecycleContributor : ModuleLifecycleContributorBase { + public async override Task InitializeAsync(ApplicationInitializationContext context, IAbpModule module) + { + if (module is IOnApplicationInitialization onApplicationInitialization) + { + await onApplicationInitialization.OnApplicationInitializationAsync(context); + } + } + public override void Initialize(ApplicationInitializationContext context, IAbpModule module) { (module as IOnApplicationInitialization)?.OnApplicationInitialization(context); @@ -10,6 +20,14 @@ public class OnApplicationInitializationModuleLifecycleContributor : ModuleLifec public class OnApplicationShutdownModuleLifecycleContributor : ModuleLifecycleContributorBase { + public async override Task ShutdownAsync(ApplicationShutdownContext context, IAbpModule module) + { + if (module is IOnApplicationShutdown onApplicationShutdown) + { + await onApplicationShutdown.OnApplicationShutdownAsync(context); + } + } + public override void Shutdown(ApplicationShutdownContext context, IAbpModule module) { (module as IOnApplicationShutdown)?.OnApplicationShutdown(context); @@ -18,6 +36,14 @@ public class OnApplicationShutdownModuleLifecycleContributor : ModuleLifecycleCo public class OnPreApplicationInitializationModuleLifecycleContributor : ModuleLifecycleContributorBase { + public async override Task InitializeAsync(ApplicationInitializationContext context, IAbpModule module) + { + if (module is IOnPreApplicationInitialization onPreApplicationInitialization) + { + await onPreApplicationInitialization.OnPreApplicationInitializationAsync(context); + } + } + public override void Initialize(ApplicationInitializationContext context, IAbpModule module) { (module as IOnPreApplicationInitialization)?.OnPreApplicationInitialization(context); @@ -26,6 +52,14 @@ public class OnPreApplicationInitializationModuleLifecycleContributor : ModuleLi public class OnPostApplicationInitializationModuleLifecycleContributor : ModuleLifecycleContributorBase { + public async override Task InitializeAsync(ApplicationInitializationContext context, IAbpModule module) + { + if (module is IOnPostApplicationInitialization onPostApplicationInitialization) + { + await onPostApplicationInitialization.OnPostApplicationInitializationAsync(context); + } + } + public override void Initialize(ApplicationInitializationContext context, IAbpModule module) { (module as IOnPostApplicationInitialization)?.OnPostApplicationInitialization(context); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModule.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModule.cs index b992020d4c..3622a50324 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModule.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IAbpModule.cs @@ -1,6 +1,10 @@ -namespace Volo.Abp.Modularity; +using System.Threading.Tasks; + +namespace Volo.Abp.Modularity; public interface IAbpModule { + Task ConfigureServicesAsync(ServiceConfigurationContext context); + void ConfigureServices(ServiceConfigurationContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleLifecycleContributor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleLifecycleContributor.cs index 299bfe9e5a..ca0ad1cfd8 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleLifecycleContributor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleLifecycleContributor.cs @@ -1,11 +1,16 @@ -using JetBrains.Annotations; +using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Modularity; public interface IModuleLifecycleContributor : ITransientDependency { + Task InitializeAsync([NotNull] ApplicationInitializationContext context, [NotNull] IAbpModule module); + void Initialize([NotNull] ApplicationInitializationContext context, [NotNull] IAbpModule module); + Task ShutdownAsync([NotNull] ApplicationShutdownContext context, [NotNull] IAbpModule module); + void Shutdown([NotNull] ApplicationShutdownContext context, [NotNull] IAbpModule module); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleManager.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleManager.cs index d981b745b9..eb4cf52e3c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleManager.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IModuleManager.cs @@ -1,10 +1,15 @@ -using JetBrains.Annotations; +using System.Threading.Tasks; +using JetBrains.Annotations; namespace Volo.Abp.Modularity; public interface IModuleManager { + Task InitializeModulesAsync([NotNull] ApplicationInitializationContext context); + void InitializeModules([NotNull] ApplicationInitializationContext context); + Task ShutdownModulesAsync([NotNull] ApplicationShutdownContext context); + void ShutdownModules([NotNull] ApplicationShutdownContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPostApplicationInitialization.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPostApplicationInitialization.cs index d79a0318ec..26177360f9 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPostApplicationInitialization.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPostApplicationInitialization.cs @@ -1,8 +1,11 @@ -using JetBrains.Annotations; +using System.Threading.Tasks; +using JetBrains.Annotations; namespace Volo.Abp.Modularity; public interface IOnPostApplicationInitialization { + Task OnPostApplicationInitializationAsync([NotNull] ApplicationInitializationContext context); + void OnPostApplicationInitialization([NotNull] ApplicationInitializationContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPreApplicationInitialization.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPreApplicationInitialization.cs index 0426ef50af..7e63301e3e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPreApplicationInitialization.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IOnPreApplicationInitialization.cs @@ -1,8 +1,11 @@ -using JetBrains.Annotations; +using System.Threading.Tasks; +using JetBrains.Annotations; namespace Volo.Abp.Modularity; public interface IOnPreApplicationInitialization { + Task OnPreApplicationInitializationAsync([NotNull] ApplicationInitializationContext context); + void OnPreApplicationInitialization([NotNull] ApplicationInitializationContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPostConfigureServices.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPostConfigureServices.cs index 38d3449b85..a1ea07de27 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPostConfigureServices.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPostConfigureServices.cs @@ -1,8 +1,10 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; namespace Volo.Abp.Modularity; public interface IPostConfigureServices { + Task PostConfigureServicesAsync(ServiceConfigurationContext context); + void PostConfigureServices(ServiceConfigurationContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPreConfigureServices.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPreConfigureServices.cs index 51db8f5fb8..dfb9eef1df 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPreConfigureServices.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/IPreConfigureServices.cs @@ -1,8 +1,10 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; namespace Volo.Abp.Modularity; public interface IPreConfigureServices { + Task PreConfigureServicesAsync(ServiceConfigurationContext context); + void PreConfigureServices(ServiceConfigurationContext context); } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLifecycleContributorBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLifecycleContributorBase.cs index b3ac566eab..3192d1f2ea 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLifecycleContributorBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleLifecycleContributorBase.cs @@ -1,11 +1,23 @@ -namespace Volo.Abp.Modularity; +using System.Threading.Tasks; + +namespace Volo.Abp.Modularity; public abstract class ModuleLifecycleContributorBase : IModuleLifecycleContributor { + public virtual Task InitializeAsync(ApplicationInitializationContext context, IAbpModule module) + { + return Task.CompletedTask; + } + public virtual void Initialize(ApplicationInitializationContext context, IAbpModule module) { } + public virtual Task ShutdownAsync(ApplicationShutdownContext context, IAbpModule module) + { + return Task.CompletedTask; + } + public virtual void Shutdown(ApplicationShutdownContext context, IAbpModule module) { } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleManager.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleManager.cs index 2218b2f6fd..71697a1a83 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleManager.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/ModuleManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -30,6 +31,26 @@ public class ModuleManager : IModuleManager, ISingletonDependency .ToArray(); } + public virtual async Task InitializeModulesAsync(ApplicationInitializationContext context) + { + foreach (var contributor in _lifecycleContributors) + { + foreach (var module in _moduleContainer.Modules) + { + try + { + await contributor.InitializeAsync(context, module.Instance); + } + catch (Exception ex) + { + throw new AbpInitializationException($"An error occurred during the initialize {contributor.GetType().FullName} phase of the module {module.Type.AssemblyQualifiedName}: {ex.Message}. See the inner exception for details.", ex); + } + } + } + + _logger.LogInformation("Initialized all ABP modules."); + } + public void InitializeModules(ApplicationInitializationContext context) { foreach (var contributor in _lifecycleContributors) @@ -50,6 +71,26 @@ public class ModuleManager : IModuleManager, ISingletonDependency _logger.LogInformation("Initialized all ABP modules."); } + public virtual async Task ShutdownModulesAsync(ApplicationShutdownContext context) + { + var modules = _moduleContainer.Modules.Reverse().ToList(); + + foreach (var contributor in _lifecycleContributors) + { + foreach (var module in modules) + { + try + { + await contributor.ShutdownAsync(context, module.Instance); + } + catch (Exception ex) + { + throw new AbpShutdownException($"An error occurred during the shutdown {contributor.GetType().FullName} phase of the module {module.Type.AssemblyQualifiedName}: {ex.Message}. See the inner exception for details.", ex); + } + } + } + } + public void ShutdownModules(ApplicationShutdownContext context) { var modules = _moduleContainer.Modules.Reverse().ToList(); diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs index 63bc7f5f78..f69d94ce61 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; using Volo.Abp.Modularity.PlugIns; @@ -8,6 +9,39 @@ namespace Volo.Abp; public class AbpApplication_Initialize_Tests { + [Fact] + public async Task Should_Initialize_Single_Module_Async() + { + using (var application = await AbpApplicationFactory.CreateAsync()) + { + //Assert + var module = application.Services.GetSingletonInstance(); + + module.PreConfigureServicesAsyncIsCalled.ShouldBeTrue(); + module.PreConfigureServicesIsCalled.ShouldBeTrue(); + + module.ConfigureServicesAsyncIsCalled.ShouldBeTrue(); + module.ConfigureServicesIsCalled.ShouldBeTrue(); + + module.PostConfigureServicesAsyncIsCalled.ShouldBeTrue(); + module.PostConfigureServicesIsCalled.ShouldBeTrue(); + + //Act + await application.InitializeAsync(); + + //Assert + application.ServiceProvider.GetRequiredService().ShouldBeSameAs(module); + module.OnApplicationInitializeAsyncIsCalled.ShouldBeTrue(); + module.OnApplicationInitializeIsCalled.ShouldBeTrue(); + //Act + await application.ShutdownAsync(); + + //Assert + module.OnApplicationShutdownAsyncIsCalled.ShouldBeTrue(); + module.OnApplicationShutdownIsCalled.ShouldBeTrue(); + } + } + [Fact] public void Should_Initialize_Single_Module() { @@ -34,6 +68,50 @@ public class AbpApplication_Initialize_Tests } } + [Fact] + public async Task Should_Initialize_PlugIn_Async() + { + using (var application = await AbpApplicationFactory.CreateAsync(options => + { + options.PlugInSources.AddTypes(typeof(IndependentEmptyPlugInModule)); + })) + { + //Assert + var plugInModule = application.Services.GetSingletonInstance(); + + plugInModule.PreConfigureServicesAsyncIsCalled.ShouldBeTrue(); + plugInModule.PreConfigureServicesIsCalled.ShouldBeTrue(); + + plugInModule.ConfigureServicesAsyncIsCalled.ShouldBeTrue(); + plugInModule.ConfigureServicesIsCalled.ShouldBeTrue(); + + plugInModule.PostConfigureServicesAsyncIsCalled.ShouldBeTrue(); + plugInModule.PostConfigureServicesIsCalled.ShouldBeTrue(); + + //Act + await application.InitializeAsync(); + + //Assert + application.ServiceProvider.GetRequiredService().ShouldBeSameAs(plugInModule); + + plugInModule.OnPreApplicationInitializationAsyncIsCalled.ShouldBeTrue(); + plugInModule.OnPreApplicationInitializationIsCalled.ShouldBeTrue(); + + plugInModule.OnApplicationInitializeAsyncIsCalled.ShouldBeTrue(); + plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue(); + + plugInModule.OnPostApplicationInitializationAsyncIsCalled.ShouldBeTrue(); + plugInModule.OnPostApplicationInitializationIsCalled.ShouldBeTrue(); + + //Act + await application.ShutdownAsync(); + + //Assert + plugInModule.OnApplicationShutdownAsyncIsCalled.ShouldBeTrue(); + plugInModule.OnApplicationShutdownIsCalled.ShouldBeTrue(); + } + } + [Fact] public void Should_Initialize_PlugIn() { @@ -53,7 +131,9 @@ public class AbpApplication_Initialize_Tests //Assert application.ServiceProvider.GetRequiredService().ShouldBeSameAs(plugInModule); + plugInModule.OnPreApplicationInitializationIsCalled.ShouldBeTrue(); plugInModule.OnApplicationInitializeIsCalled.ShouldBeTrue(); + plugInModule.OnPostApplicationInitializationIsCalled.ShouldBeTrue(); //Act application.Shutdown(); diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Configuration/ConfigurationAccessor_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Configuration/ConfigurationAccessor_Tests.cs index 9023fb6ce7..4a0dda26fb 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Configuration/ConfigurationAccessor_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Configuration/ConfigurationAccessor_Tests.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Configuration; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; @@ -8,6 +9,22 @@ namespace Volo.Abp.Configuration; public class ConfigurationAccessor_Tests { + [Fact] + public async Task Should_Use_Empty_ConfigurationRoot_By_Default_Async() + { + using (var application = await AbpApplicationFactory.CreateAsync()) + { + var configuration1 = application.Services.GetConfiguration(); + configuration1.ShouldNotBeNull(); + + await application.InitializeAsync(); + + var configuration2 = ResolveConfiguration(application); + + configuration2.ShouldBe(configuration1); + } + } + [Fact] public void Should_Use_Empty_ConfigurationRoot_By_Default() { @@ -24,6 +41,23 @@ public class ConfigurationAccessor_Tests } } + [Fact] + public async Task Should_Use_The_Registered_ConfigurationRoot_Async() + { + using (var application = await AbpApplicationFactory.CreateAsync()) + { + var myConfiguration = new ConfigurationBuilder().Build(); + application.Services.ReplaceConfiguration(myConfiguration); + application.Services.GetConfiguration().ShouldBe(myConfiguration); + + await application.InitializeAsync(); + + var configuration = ResolveConfiguration(application); + + configuration.ShouldBe(myConfiguration); + } + } + [Fact] public void Should_Use_The_Registered_ConfigurationRoot() { diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoServiceRegistration_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoServiceRegistration_Tests.cs index 6fc5716a22..71ec559824 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoServiceRegistration_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/AutoServiceRegistration_Tests.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; @@ -8,6 +9,20 @@ namespace Volo.Abp.DependencyInjection; public class AutoServiceRegistration_Tests { + [Fact] + public async Task AutoServiceRegistration_Should_Not_Duplicate_Test_Async() + { + using (var application = await AbpApplicationFactory.CreateAsync()) + { + //Act + await application.InitializeAsync(); + + //Assert + var services = application.ServiceProvider.GetServices().ToList(); + services.Count.ShouldBe(1); + } + } + [Fact] public void AutoServiceRegistration_Should_Not_Duplicate_Test() { diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs index d665c863dc..6a3f059ba8 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/HybridServiceScopeFactory_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; @@ -8,6 +9,26 @@ namespace Volo.Abp.DependencyInjection; public class HybridServiceScopeFactory_Tests { + [Fact] + public async Task Should_Use_Default_ServiceScopeFactory_By_Default_Async() + { + using (var application = await AbpApplicationFactory.CreateAsync()) + { + application.Services.AddType(typeof(MyServiceAsync)); + + await application.InitializeAsync(); + + var serviceScopeFactory = application.ServiceProvider.GetRequiredService(); + + using (var scope = serviceScopeFactory.CreateScope()) + { + scope.ServiceProvider.GetRequiredService(); + } + + MyServiceAsync.DisposeCount.ShouldBe(1); + } + } + [Fact] public void Should_Use_Default_ServiceScopeFactory_By_Default() { @@ -28,6 +49,16 @@ public class HybridServiceScopeFactory_Tests } } + private class MyServiceAsync : ITransientDependency, IDisposable + { + public static int DisposeCount { get; private set; } + + public void Dispose() + { + ++DisposeCount; + } + } + private class MyService : ITransientDependency, IDisposable { public static int DisposeCount { get; private set; } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/TestModuleBase.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/TestModuleBase.cs index 327d2982a5..29b7927c64 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/TestModuleBase.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/Modularity/TestModuleBase.cs @@ -1,39 +1,97 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; namespace Volo.Abp.Modularity; public class TestModuleBase : AbpModule { - public bool PreConfigureServicesIsCalled { get; set; } + public bool PreConfigureServicesAsyncIsCalled { get; set; } + public bool ConfigureServicesAsyncIsCalled { get; set; } + public bool PostConfigureServicesAsyncIsCalled { get; set; } + public bool OnPreApplicationInitializationIsCalled { get; set; } + public bool OnPostApplicationInitializationIsCalled { get; set; } + public bool OnApplicationInitializeAsyncIsCalled { get; set; } + public bool OnApplicationShutdownAsyncIsCalled { get; set; } + public bool PreConfigureServicesIsCalled { get; set; } public bool ConfigureServicesIsCalled { get; set; } - public bool PostConfigureServicesIsCalled { get; set; } - + public bool OnPreApplicationInitializationAsyncIsCalled { get; set; } + public bool OnPostApplicationInitializationAsyncIsCalled { get; set; } public bool OnApplicationInitializeIsCalled { get; set; } - public bool OnApplicationShutdownIsCalled { get; set; } + public override Task PreConfigureServicesAsync(ServiceConfigurationContext context) + { + PreConfigureServicesAsyncIsCalled = true; + return base.PreConfigureServicesAsync(context); + } + public override void PreConfigureServices(ServiceConfigurationContext context) { PreConfigureServicesIsCalled = true; } + public override Task ConfigureServicesAsync(ServiceConfigurationContext context) + { + ConfigureServicesAsyncIsCalled = true; + return base.ConfigureServicesAsync(context); + } + public override void ConfigureServices(ServiceConfigurationContext context) { ConfigureServicesIsCalled = true; } + public override Task PostConfigureServicesAsync(ServiceConfigurationContext context) + { + PostConfigureServicesAsyncIsCalled = true; + return base.PostConfigureServicesAsync(context); + } + public override void PostConfigureServices(ServiceConfigurationContext context) { PostConfigureServicesIsCalled = true; } + public override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) + { + OnPreApplicationInitializationAsyncIsCalled = true; + return base.OnPreApplicationInitializationAsync(context); + } + + public override void OnPreApplicationInitialization(ApplicationInitializationContext context) + { + OnPreApplicationInitializationIsCalled = true; + } + + public override Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context) + { + OnPostApplicationInitializationAsyncIsCalled = true; + return base.OnPostApplicationInitializationAsync(context); + } + + public override void OnPostApplicationInitialization(ApplicationInitializationContext context) + { + OnPostApplicationInitializationIsCalled = true; + } + + public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + OnApplicationInitializeAsyncIsCalled = true; + return base.OnApplicationInitializationAsync(context); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { OnApplicationInitializeIsCalled = true; } + public override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) + { + OnApplicationShutdownAsyncIsCalled = true; + return base.OnApplicationShutdownAsync(context); + } + public override void OnApplicationShutdown(ApplicationShutdownContext context) { OnApplicationShutdownIsCalled = true; From a3a674399b699df4f00d0a1ef5eae93547f47a32 Mon Sep 17 00:00:00 2001 From: "ismail.yilmaz" Date: Mon, 20 Dec 2021 01:36:19 +0300 Subject: [PATCH 14/57] Fixed a l10n issue on confirm dialog --- .../sweetalert2/abp-sweetalert2.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js index f89f6ffed7..4fc9bdba34 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js @@ -4,6 +4,10 @@ var abp = abp || {}; return; } + var localize = function (key) { + return abp.localization.getResource('AbpUi')(key); + }; + /* DEFAULTS *************************************************/ abp.libs = abp.libs || {}; @@ -98,9 +102,10 @@ var abp = abp || {}; }; abp.event.on('abp.configurationInitialized', function () { - var l = abp.localization.getResource('AbpUi'); - - abp.libs.sweetAlert.config.confirm.title = l('AreYouSure'); + abp.libs.sweetAlert.config.confirm.title = localize('AreYouSure'); + abp.libs.sweetAlert.config.confirm.confirmButtonText = localize('Yes'); + abp.libs.sweetAlert.config.confirm.denyButtonText = localize('No'); + abp.libs.sweetAlert.config.confirm.cancelButtonText = localize('Cancel'); abp.libs.sweetAlert.config.confirm.showCancelButton = true; abp.libs.sweetAlert.config.confirm.reverseButtons = true; }); From 199e40d31f6a5f1dbc12fe5392d2ecf203741e5c Mon Sep 17 00:00:00 2001 From: "ismail.yilmaz" Date: Mon, 20 Dec 2021 01:38:27 +0300 Subject: [PATCH 15/57] Revert "Fixed a l10n issue on confirm dialog" This reverts commit a3a674399b699df4f00d0a1ef5eae93547f47a32. --- .../sweetalert2/abp-sweetalert2.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js index 4fc9bdba34..f89f6ffed7 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js @@ -4,10 +4,6 @@ var abp = abp || {}; return; } - var localize = function (key) { - return abp.localization.getResource('AbpUi')(key); - }; - /* DEFAULTS *************************************************/ abp.libs = abp.libs || {}; @@ -102,10 +98,9 @@ var abp = abp || {}; }; abp.event.on('abp.configurationInitialized', function () { - abp.libs.sweetAlert.config.confirm.title = localize('AreYouSure'); - abp.libs.sweetAlert.config.confirm.confirmButtonText = localize('Yes'); - abp.libs.sweetAlert.config.confirm.denyButtonText = localize('No'); - abp.libs.sweetAlert.config.confirm.cancelButtonText = localize('Cancel'); + var l = abp.localization.getResource('AbpUi'); + + abp.libs.sweetAlert.config.confirm.title = l('AreYouSure'); abp.libs.sweetAlert.config.confirm.showCancelButton = true; abp.libs.sweetAlert.config.confirm.reverseButtons = true; }); From 2212157f03c0fc1bbc99882052d1c732df277e5f Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 20 Dec 2021 17:59:53 +0800 Subject: [PATCH 16/57] Refactor. --- .../AbpAspNetCoreAsyncIntegratedTestBase.cs | 118 ++++++++++++++++++ .../TestBase/TestNoopHostLifetime.cs | 18 +++ .../AbpBackgroundJobsRabbitMqModule.cs | 37 +++--- .../BackgroundJobs/AbpBackgroundJobsModule.cs | 15 ++- .../HangfireBackgroundWorkerManager.cs | 2 +- .../AbpBackgroundWorkersQuartzModule.cs | 18 ++- .../Quartz/QuartzBackgroundWorkerManager.cs | 4 +- .../AbpBackgroundWorkersModule.cs | 25 +++- .../BackgroundWorkerManager.cs | 6 +- ...licationInitializationContextExtensions.cs | 11 +- .../IBackgroundWorkerManager.cs | 5 +- .../Volo/Abp/EventBus/AbpEventBusModule.cs | 12 +- .../Volo/Abp/Quartz/AbpQuartzModule.cs | 25 +++- .../Mvc/AbpAspNetCoreAsyncTestBase_Tests.cs | 62 +++++++++ .../AspNetCore/AbpAspNetCoreAsyncTestBase.cs | 45 +++++++ .../Volo/Docs/DocsDomainModule.cs | 15 ++- .../AbpIdentityServerDomainModule.cs | 23 +++- .../Program.cs | 9 +- .../Program.cs | 9 +- .../Program.cs | 2 +- .../Program.cs | 9 +- .../Program.cs | 9 +- .../Program.cs | 9 +- .../Program.cs | 9 +- .../Program.cs | 9 +- .../Program.cs | 2 +- .../MyProjectNameBlazorHostModule.cs | 12 +- .../Program.cs | 40 +++--- .../Startup.cs | 18 --- .../Program.cs | 41 +++--- .../Startup.cs | 20 --- .../MyProjectNameIdentityServerModule.cs | 20 ++- .../Program.cs | 41 +++--- .../Startup.cs | 20 --- .../Program.cs | 38 +++--- .../Startup.cs | 18 --- .../MyProjectNameWebUnifiedModule.cs | 12 +- .../Program.cs | 36 +++--- .../Startup.cs | 19 --- 39 files changed, 558 insertions(+), 285 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/TestNoopHostLifetime.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreAsyncTestBase_Tests.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreAsyncTestBase.cs delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Startup.cs delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Startup.cs delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Startup.cs delete mode 100644 templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Startup.cs diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs new file mode 100644 index 0000000000..06a46897fa --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.TestBase; + +public class AbpAspNetCoreAsyncIntegratedTestBase + where TModule : AbpModule +{ + protected IHost Host { get; set; } + + protected TestServer Server { get; set; } + + protected HttpClient Client { get; set; } + + protected IServiceProvider ServiceProvider { get; set; } + + protected virtual T GetService() + { + return ServiceProvider.GetService(); + } + + protected virtual T GetRequiredService() + { + return ServiceProvider.GetRequiredService(); + } + + public virtual async Task InitializeAsync() + { + var builder = WebApplication.CreateBuilder(); + builder.Host.ConfigureServices(services => + { + services.AddSingleton(); + services.AddSingleton(); + }) + .UseAutofac(); + + await builder.Services.AddApplicationAsync(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + + await ConfigureServicesAsync(builder.Services); + + var app = builder.Build(); + + await app.InitializeApplicationAsync(); + + await app.StartAsync(); + + Host = app.Services.GetRequiredService(); + + Server = Host.GetTestServer(); + Client = Host.GetTestClient(); + + ServiceProvider = Server.Services; + + ServiceProvider.GetRequiredService().Server = Server; + } + + public virtual Task DisposeAsync() + { + return Task.CompletedTask; + } + + protected virtual Task ConfigureServicesAsync(IServiceCollection services) + { + return Task.CompletedTask; + } + + #region GetUrl + + /// + /// Gets default URL for given controller type. + /// + /// The type of the controller. + protected virtual string GetUrl() + { + return "/" + typeof(TController).Name.RemovePostFix("Controller", "AppService", "ApplicationService", "Service"); + } + + /// + /// Gets default URL for given controller type's given action. + /// + /// The type of the controller. + protected virtual string GetUrl(string actionName) + { + return GetUrl() + "/" + actionName; + } + + /// + /// Gets default URL for given controller type's given action with query string parameters (as anonymous object). + /// + /// The type of the controller. + protected virtual string GetUrl(string actionName, object queryStringParamsAsAnonymousObject) + { + var url = GetUrl(actionName); + + var dictionary = new RouteValueDictionary(queryStringParamsAsAnonymousObject); + if (dictionary.Any()) + { + url += "?" + dictionary.Select(d => $"{d.Key}={d.Value}").JoinAsString("&"); + } + + return url; + } + + #endregion +} diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/TestNoopHostLifetime.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/TestNoopHostLifetime.cs new file mode 100644 index 0000000000..a0fe2d46c1 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/TestNoopHostLifetime.cs @@ -0,0 +1,18 @@ +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Hosting; + +namespace Volo.Abp.AspNetCore.TestBase; + +public class TestNoopHostLifetime : IHostLifetime +{ + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + public Task WaitForStartAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpBackgroundJobsRabbitMqModule.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpBackgroundJobsRabbitMqModule.cs index 33cbc740e4..c601ca5549 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpBackgroundJobsRabbitMqModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/AbpBackgroundJobsRabbitMqModule.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity; using Volo.Abp.RabbitMQ; using Volo.Abp.Threading; @@ -17,31 +18,37 @@ public class AbpBackgroundJobsRabbitMqModule : AbpModule context.Services.AddSingleton(typeof(IJobQueue<>), typeof(JobQueue<>)); } + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + await StartJobQueueManagerAsync(context); + } + + public async override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) + { + await StopJobQueueManagerAsync(context); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { - StartJobQueueManager(context); + AsyncHelper.RunSync(() => StartJobQueueManagerAsync(context)); } public override void OnApplicationShutdown(ApplicationShutdownContext context) { - StopJobQueueManager(context); + AsyncHelper.RunSync(() => StopJobQueueManagerAsync(context)); } - private static void StartJobQueueManager(ApplicationInitializationContext context) + private async static Task StartJobQueueManagerAsync(ApplicationInitializationContext context) { - AsyncHelper.RunSync( - () => context.ServiceProvider - .GetRequiredService() - .StartAsync() - ); + await context.ServiceProvider + .GetRequiredService() + .StartAsync(); } - private static void StopJobQueueManager(ApplicationShutdownContext context) + private async static Task StopJobQueueManagerAsync(ApplicationShutdownContext context) { - AsyncHelper.RunSync( - () => context.ServiceProvider - .GetRequiredService() - .StopAsync() - ); + await context.ServiceProvider + .GetRequiredService() + .StopAsync(); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs index aaa4a7ba01..47a165ca83 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs @@ -1,9 +1,11 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; using Volo.Abp.DistributedLocking; using Volo.Abp.Guids; using Volo.Abp.Modularity; +using Volo.Abp.Threading; using Volo.Abp.Timing; namespace Volo.Abp.BackgroundJobs; @@ -17,12 +19,21 @@ namespace Volo.Abp.BackgroundJobs; )] public class AbpBackgroundJobsModule : AbpModule { + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (options.IsJobExecutionEnabled) + { + await context.AddBackgroundWorkerAsync(); + } + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { var options = context.ServiceProvider.GetRequiredService>().Value; if (options.IsJobExecutionEnabled) { - context.AddBackgroundWorker(); + AsyncHelper.RunSync(() => context.AddBackgroundWorkerAsync()); } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 162b2fa472..e1525ade96 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -21,7 +21,7 @@ public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingle return Task.CompletedTask; } - public void Add(IBackgroundWorker worker) + public async Task AddAsync(IBackgroundWorker worker) { if (worker is IHangfireBackgroundWorker hangfireBackgroundWorker) { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs index 5884532f1e..07586b461b 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using Volo.Abp.Quartz; +using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers.Quartz; @@ -34,6 +35,21 @@ public class AbpBackgroundWorkersQuartzModule : AbpModule } } + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + var quartzBackgroundWorkerOptions = context.ServiceProvider.GetRequiredService>().Value; + if (quartzBackgroundWorkerOptions.IsAutoRegisterEnabled) + { + var backgroundWorkerManager = context.ServiceProvider.GetRequiredService(); + var works = context.ServiceProvider.GetServices().Where(x => x.AutoRegister); + + foreach (var work in works) + { + await backgroundWorkerManager.AddAsync(work); + } + } + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { var quartzBackgroundWorkerOptions = context.ServiceProvider.GetRequiredService>().Value; @@ -44,7 +60,7 @@ public class AbpBackgroundWorkersQuartzModule : AbpModule foreach (var work in works) { - backgroundWorkerManager.Add(work); + AsyncHelper.RunSync(() => backgroundWorkerManager.AddAsync(work)); } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs index efee2d2139..954f21bcda 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs @@ -33,9 +33,9 @@ public class QuartzBackgroundWorkerManager : IBackgroundWorkerManager, ISingleto } } - public virtual void Add(IBackgroundWorker worker) + public virtual async Task AddAsync(IBackgroundWorker worker) { - AsyncHelper.RunSync(() => ReScheduleJobAsync(worker)); + await ReScheduleJobAsync(worker); } protected virtual async Task ReScheduleJobAsync(IBackgroundWorker worker) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs index 40c4a70fb1..32341f101e 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -10,6 +11,28 @@ namespace Volo.Abp.BackgroundWorkers; )] public class AbpBackgroundWorkersModule : AbpModule { + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (options.IsEnabled) + { + await context.ServiceProvider + .GetRequiredService() + .StartAsync(); + } + } + + public async override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (options.IsEnabled) + { + await context.ServiceProvider + .GetRequiredService() + .StopAsync(); + } + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { var options = context.ServiceProvider.GetRequiredService>().Value; diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs index 62c1f3607b..3276c837c0 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs @@ -26,15 +26,13 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen _backgroundWorkers = new List(); } - public virtual void Add(IBackgroundWorker worker) + public virtual async Task AddAsync(IBackgroundWorker worker) { _backgroundWorkers.Add(worker); if (IsRunning) { - AsyncHelper.RunSync( - () => worker.StartAsync() - ); + await worker.StartAsync(); } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkersApplicationInitializationContextExtensions.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkersApplicationInitializationContextExtensions.cs index 5cff67b7de..9df0f6c5e4 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkersApplicationInitializationContextExtensions.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkersApplicationInitializationContextExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; @@ -6,17 +7,17 @@ namespace Volo.Abp.BackgroundWorkers; public static class BackgroundWorkersApplicationInitializationContextExtensions { - public static ApplicationInitializationContext AddBackgroundWorker([NotNull] this ApplicationInitializationContext context) + public async static Task AddBackgroundWorkerAsync([NotNull] this ApplicationInitializationContext context) where TWorker : IBackgroundWorker { Check.NotNull(context, nameof(context)); - context.AddBackgroundWorker(typeof(TWorker)); + await context.AddBackgroundWorkerAsync(typeof(TWorker)); return context; } - public static ApplicationInitializationContext AddBackgroundWorker([NotNull] this ApplicationInitializationContext context, [NotNull] Type workerType) + public async static Task AddBackgroundWorkerAsync([NotNull] this ApplicationInitializationContext context, [NotNull] Type workerType) { Check.NotNull(context, nameof(context)); Check.NotNull(workerType, nameof(workerType)); @@ -26,9 +27,9 @@ public static class BackgroundWorkersApplicationInitializationContextExtensions throw new AbpException($"Given type ({workerType.AssemblyQualifiedName}) must implement the {typeof(IBackgroundWorker).AssemblyQualifiedName} interface, but it doesn't!"); } - context.ServiceProvider + await context.ServiceProvider .GetRequiredService() - .Add( + .AddAsync( (IBackgroundWorker)context.ServiceProvider.GetRequiredService(workerType) ); diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs index e1bf0e53f2..7f5268afff 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Threading; +using System.Threading.Tasks; +using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers; @@ -13,5 +14,5 @@ public interface IBackgroundWorkerManager : IRunnable /// /// The worker. It should be resolved from IOC. /// - void Add(IBackgroundWorker worker); + Task AddAsync(IBackgroundWorker worker); } diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs index cb0a32f47c..b4a873dcd4 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; +using System.Threading.Tasks; using Volo.Abp.BackgroundWorkers; using Volo.Abp.DistributedLocking; using Volo.Abp.EventBus.Abstractions; @@ -12,6 +13,7 @@ using Volo.Abp.Json; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.Reflection; +using Volo.Abp.Threading; namespace Volo.Abp.EventBus; @@ -30,10 +32,16 @@ public class AbpEventBusModule : AbpModule AddEventHandlers(context.Services); } + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + await context.AddBackgroundWorkerAsync(); + await context.AddBackgroundWorkerAsync(); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { - context.AddBackgroundWorker(); - context.AddBackgroundWorker(); + AsyncHelper.RunSync(() => context.AddBackgroundWorkerAsync()); + AsyncHelper.RunSync(() => context.AddBackgroundWorkerAsync()); } private static void AddEventHandlers(IServiceCollection services) diff --git a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs index ade14f1b83..db790a717d 100644 --- a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs +++ b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs @@ -1,8 +1,8 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Quartz; using Quartz.Impl; -using Quartz.Impl.AdoJobStore.Common; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -18,8 +18,8 @@ public class AbpQuartzModule : AbpModule context.Services.AddQuartz(options.Properties, build => { - // these are the defaults - if (options.Properties[StdSchedulerFactory.PropertySchedulerJobFactoryType] == null) + // these are the defaults + if (options.Properties[StdSchedulerFactory.PropertySchedulerJobFactoryType] == null) { build.UseMicrosoftDependencyInjectionScopedJobFactory(); } @@ -62,6 +62,23 @@ public class AbpQuartzModule : AbpModule }); } + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + + _scheduler = context.ServiceProvider.GetRequiredService(); + + await options.StartSchedulerFactory.Invoke(_scheduler); + } + + public async override Task OnApplicationShutdownAsync(ApplicationShutdownContext context) + { + if (_scheduler.IsStarted) + { + await _scheduler.Shutdown(); + } + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { var options = context.ServiceProvider.GetRequiredService>().Value; diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreAsyncTestBase_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreAsyncTestBase_Tests.cs new file mode 100644 index 0000000000..5d475966a2 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreAsyncTestBase_Tests.cs @@ -0,0 +1,62 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.AspNetCore.TestBase; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc; + +public class AbpAspNetCoreAsyncTestBase_Tests : AbpAspNetCoreAsyncTestBase +{ + [Fact] + public async Task Get_API_Response_Test() + { + var result = await GetResponseAsStringAsync("/api"); + result.ShouldBe(await GetRequiredService().GetResponseAsync()); + } +} + +[DependsOn( + typeof(AbpAspNetCoreMvcModule), + typeof(AbpAspNetCoreTestBaseModule), + typeof(AbpAutofacModule) +)] +public class AbpAspNetCoreAsyncTestModule : AbpModule +{ + public override Task ConfigureServicesAsync(ServiceConfigurationContext context) + { + context.Services.AddTransient(); + return Task.CompletedTask; + } + + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + + var dataBaseService = app.ApplicationServices.GetRequiredService(); + + var apiResponse = await dataBaseService.GetResponseAsync(); + app.Map("/api", _ => + { + app.Run(async httpContext => + { + await httpContext.Response.WriteAsync(apiResponse); + }); + }); + + app.UseRouting(); + app.UseConfiguredEndpoints(); + } +} + +public class DataBaseService +{ + public Task GetResponseAsync() + { + return Task.FromResult("hello api!"); + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreAsyncTestBase.cs b/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreAsyncTestBase.cs new file mode 100644 index 0000000000..0d222deab4 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreAsyncTestBase.cs @@ -0,0 +1,45 @@ +using System.Globalization; +using System.Net; +using System.Net.Http; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Net.Http.Headers; +using Shouldly; +using Volo.Abp.AspNetCore.TestBase; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.Abp.AspNetCore; + +public abstract class AbpAspNetCoreAsyncTestBase : AbpAspNetCoreAsyncIntegratedTestBase, IAsyncLifetime + where TModule : AbpModule +{ + protected virtual async Task GetResponseAsObjectAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + var strResponse = await GetResponseAsStringAsync(url, expectedStatusCode); + return JsonSerializer.Deserialize(strResponse, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); + } + + protected virtual async Task GetResponseAsStringAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + using (var response = await GetResponseAsync(url, expectedStatusCode)) + { + return await response.Content.ReadAsStringAsync(); + } + } + + protected virtual async Task GetResponseAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK, bool xmlHttpRequest = false) + { + using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, url)) + { + requestMessage.Headers.Add("Accept-Language", CultureInfo.CurrentUICulture.Name); + if (xmlHttpRequest) + { + requestMessage.Headers.Add(HeaderNames.XRequestedWith, "XMLHttpRequest"); + } + var response = await Client.SendAsync(requestMessage); + response.StatusCode.ShouldBe(expectedStatusCode); + return response; + } + } +} diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs index ecc52d1f26..d6c7a3a0a6 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/DocsDomainModule.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp; @@ -39,7 +40,7 @@ namespace Volo.Docs options.EtoMappings.Add(typeof(DocsDomainModule)); options.EtoMappings.Add(typeof(DocsDomainModule)); }); - + Configure(options => { options.FileSets @@ -65,6 +66,18 @@ namespace Volo.Docs }); } + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + using (var scope = context.ServiceProvider.CreateScope()) + { + if (scope.ServiceProvider.GetRequiredService>().Value.Enable) + { + var documentFullSearch = scope.ServiceProvider.GetRequiredService(); + await documentFullSearch.CreateIndexIfNeededAsync(); + } + } + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { using (var scope = context.ServiceProvider.CreateScope()) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index d3663277cb..1f8fb93e4b 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -1,4 +1,5 @@ -using IdentityServer4.Services; +using System.Threading.Tasks; +using IdentityServer4.Services; using IdentityServer4.Stores; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -133,17 +134,31 @@ public class AbpIdentityServerDomainModule : AbpModule }); } - public override void OnApplicationInitialization(ApplicationInitializationContext context) + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { var options = context.ServiceProvider.GetRequiredService>().Value; if (options.IsCleanupEnabled) { - context.ServiceProvider + await context.ServiceProvider .GetRequiredService() - .Add( + .AddAsync( context.ServiceProvider .GetRequiredService() ); } } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (options.IsCleanupEnabled) + { + AsyncHelper.RunSync(() => context.ServiceProvider + .GetRequiredService() + .AddAsync( + context.ServiceProvider + .GetRequiredService() + )); + } + } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs index a64b17a3f9..838c64e004 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -9,7 +10,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Tiered; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -33,13 +34,13 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - builder.Services.AddApplication(options => + await builder.Services.AddApplicationAsync(options => { options.Services.ReplaceConfiguration(builder.Configuration); }); var app = builder.Build(); - app.InitializeApplication(); - app.Run(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs index ef9b6dcf35..b9aad1a4cd 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -9,7 +10,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Server; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -33,13 +34,13 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - builder.Services.AddApplication(options => + await builder.Services.AddApplicationAsync(options => { options.Services.ReplaceConfiguration(builder.Configuration); }); var app = builder.Build(); - app.InitializeApplication(); - app.Run(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs index 1ded753836..12c8d2df84 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs @@ -5,7 +5,7 @@ namespace MyCompanyName.MyProjectName.Blazor; public class Program { - public static async Task Main(string[] args) + public async static Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs index e6f48c54c2..59b85f1a90 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -9,7 +10,7 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -33,13 +34,13 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - builder.Services.AddApplication(options => + await builder.Services.AddApplicationAsync(options => { options.Services.ReplaceConfiguration(builder.Configuration); }); var app = builder.Build(); - app.InitializeApplication(); - app.Run(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs index e6f48c54c2..59b85f1a90 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -9,7 +10,7 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -33,13 +34,13 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - builder.Services.AddApplication(options => + await builder.Services.AddApplicationAsync(options => { options.Services.ReplaceConfiguration(builder.Configuration); }); var app = builder.Build(); - app.InitializeApplication(); - app.Run(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs index 499c2e2b41..aca0769330 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -9,7 +10,7 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -33,13 +34,13 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - builder.Services.AddApplication(options => + await builder.Services.AddApplicationAsync(options => { options.Services.ReplaceConfiguration(builder.Configuration); }); var app = builder.Build(); - app.InitializeApplication(); - app.Run(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs index cdb4a395cc..3cd8f691dc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -9,7 +10,7 @@ namespace MyCompanyName.MyProjectName.Web; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -33,13 +34,13 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - builder.Services.AddApplication(options => + await builder.Services.AddApplicationAsync(options => { options.Services.ReplaceConfiguration(builder.Configuration); }); var app = builder.Build(); - app.InitializeApplication(); - app.Run(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs index cdb4a395cc..3cd8f691dc 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -9,7 +10,7 @@ namespace MyCompanyName.MyProjectName.Web; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -33,13 +34,13 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - builder.Services.AddApplication(options => + await builder.Services.AddApplicationAsync(options => { options.Services.ReplaceConfiguration(builder.Configuration); }); var app = builder.Build(); - app.InitializeApplication(); - app.Run(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs index d5b3c36ff5..39e7bdb524 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs @@ -5,7 +5,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Host; public class Program { - public static async Task Main(string[] args) + public async static Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs index 951a9e69bc..fdb57b3435 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Net.Http; +using System.Threading.Tasks; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; using Microsoft.AspNetCore.Builder; @@ -211,7 +212,7 @@ public class MyProjectNameBlazorHostModule : AbpModule #endif } - public override void OnApplicationInitialization(ApplicationInitializationContext context) + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { var env = context.GetEnvironment(); var app = context.GetApplicationBuilder(); @@ -252,12 +253,9 @@ public class MyProjectNameBlazorHostModule : AbpModule using (var scope = context.ServiceProvider.CreateScope()) { - AsyncHelper.RunSync(async () => - { - await scope.ServiceProvider - .GetRequiredService() - .SeedAsync(); - }); + await scope.ServiceProvider + .GetRequiredService() + .SeedAsync(); } } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs index 1301cbfb3e..c1b5c178d5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs @@ -1,6 +1,7 @@ using System; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; @@ -9,27 +10,37 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); + .CreateLogger(); try { Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.Services.AddApplicationAsync(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) @@ -42,15 +53,4 @@ public class Program Log.CloseAndFlush(); } } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - - webBuilder.UseStartup(); - }) - .UseAutofac() - .UseSerilog(); } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Startup.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Startup.cs deleted file mode 100644 index d356f6bede..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Startup.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; - -namespace MyCompanyName.MyProjectName.Blazor.Server.Host; - -public class Startup -{ - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.InitializeApplication(); - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs index 500a2cfc00..328016c3b0 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs @@ -1,7 +1,7 @@ using System; -using System.IO; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; @@ -10,26 +10,37 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); + .CreateLogger(); try { Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.Services.AddApplicationAsync(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) @@ -42,14 +53,4 @@ public class Program Log.CloseAndFlush(); } } - - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) - .UseAutofac() - .UseSerilog(); } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs deleted file mode 100644 index 200da6e542..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MyCompanyName.MyProjectName; - -public class Startup -{ - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs index b6fc071e14..eb854d3bc1 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.DataProtection; @@ -187,7 +188,7 @@ public class MyProjectNameIdentityServerModule : AbpModule #endif } - public override void OnApplicationInitialization(ApplicationInitializationContext context) + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); var env = context.GetEnvironment(); @@ -227,19 +228,16 @@ public class MyProjectNameIdentityServerModule : AbpModule app.UseAbpSerilogEnrichers(); app.UseConfiguredEndpoints(); - SeedData(context); + await SeedData(context); } - private void SeedData(ApplicationInitializationContext context) + private async Task SeedData(ApplicationInitializationContext context) { - AsyncHelper.RunSync(async () => + using (var scope = context.ServiceProvider.CreateScope()) { - using (var scope = context.ServiceProvider.CreateScope()) - { - await scope.ServiceProvider - .GetRequiredService() - .SeedAsync(); - } - }); + await scope.ServiceProvider + .GetRequiredService() + .SeedAsync(); + } } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs index 500a2cfc00..5f5b29332b 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs @@ -1,7 +1,7 @@ using System; -using System.IO; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; @@ -10,26 +10,37 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); + .CreateLogger(); try { Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.Services.AddApplicationAsync(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) @@ -42,14 +53,4 @@ public class Program Log.CloseAndFlush(); } } - - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) - .UseAutofac() - .UseSerilog(); } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Startup.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Startup.cs deleted file mode 100644 index 70990fa4da..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Startup.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MyCompanyName.MyProjectName; - -public class Startup -{ - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs index 500a2cfc00..cdeeed1546 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs @@ -1,7 +1,10 @@ using System; using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; @@ -10,26 +13,37 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); + .CreateLogger(); try { Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.Services.AddApplicationAsync(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) @@ -42,14 +56,4 @@ public class Program Log.CloseAndFlush(); } } - - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) - .UseAutofac() - .UseSerilog(); } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Startup.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Startup.cs deleted file mode 100644 index 265fb2e7d7..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Startup.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MyCompanyName.MyProjectName; - -public class Startup -{ - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } -} diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs index ed4f5d13e9..49b63a407d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs @@ -1,5 +1,6 @@ using System.IO; using System.Reflection; +using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -140,7 +141,7 @@ public class MyProjectNameWebUnifiedModule : AbpModule #endif } - public override void OnApplicationInitialization(ApplicationInitializationContext context) + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); var env = context.GetEnvironment(); @@ -180,12 +181,9 @@ public class MyProjectNameWebUnifiedModule : AbpModule using (var scope = context.ServiceProvider.CreateScope()) { - AsyncHelper.RunSync(async () => - { - await scope.ServiceProvider - .GetRequiredService() - .SeedAsync(); - }); + await scope.ServiceProvider + .GetRequiredService() + .SeedAsync(); } } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs index 6b523328cc..a8443ddaca 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs @@ -1,7 +1,10 @@ using System; using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; @@ -10,22 +13,37 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static int Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() +#if DEBUG .MinimumLevel.Debug() +#else + .MinimumLevel.Information() +#endif .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.Async(c => c.File("Logs/logs.txt")) #if DEBUG - .WriteTo.Async(c => c.Console()) + .WriteTo.Async(c => c.Console()) #endif - .CreateLogger(); + .CreateLogger(); try { Log.Information("Starting web host."); - CreateHostBuilder(args).Build().Run(); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.Services.AddApplicationAsync(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + }); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); return 0; } catch (Exception ex) @@ -38,14 +56,4 @@ public class Program Log.CloseAndFlush(); } } - - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) - .UseAutofac() - .UseSerilog(); } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Startup.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Startup.cs deleted file mode 100644 index 2be66923ce..0000000000 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Startup.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MyCompanyName.MyProjectName; - -public class Startup -{ - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } -} From 9ee07d7019f216e5e8eddf3a9a678897a0c3572d Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 20 Dec 2021 20:18:46 +0800 Subject: [PATCH 17/57] Update AbpWebAssemblyHostBuilderExtensions.cs --- .../AbpWebAssemblyHostBuilderExtensions.cs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs index cb104533cb..7c4ff4a868 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs @@ -17,6 +17,30 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting; public static class AbpWebAssemblyHostBuilderExtensions { + public static async Task AddApplicationAsync( + [NotNull] this WebAssemblyHostBuilder builder, + Action options) + where TStartupModule : IAbpModule + { + Check.NotNull(builder, nameof(builder)); + + // Related this commit(https://github.com/dotnet/aspnetcore/commit/b99d805bc037fcac56afb79abeb7d5a43141c85e) + // Microsoft.AspNetCore.Blazor.BuildTools has been removed in net 5.0. + // This call may be removed when we find a suitable solution. + // System.Runtime.CompilerServices.AsyncStateMachineAttribute + Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(); + + builder.Services.AddSingleton(builder.Configuration); + builder.Services.AddSingleton(builder); + + var application = await builder.Services.AddApplicationAsync(opts => + { + options?.Invoke(new AbpWebAssemblyApplicationCreationOptions(builder, opts)); + }); + + return application; + } + public static IAbpApplicationWithExternalServiceProvider AddApplication( [NotNull] this WebAssemblyHostBuilder builder, Action options) @@ -51,7 +75,7 @@ public static class AbpWebAssemblyHostBuilderExtensions ((ComponentsClientScopeServiceProviderAccessor)serviceProvider .GetRequiredService()).ServiceProvider = serviceProvider; - application.Initialize(serviceProvider); + await application.InitializeAsync(serviceProvider); await InitializeModulesAsync(serviceProvider); await SetCurrentLanguageAsync(serviceProvider); } From 003edef89720db85fd5c5b66cc298d7792fdff58 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 20 Dec 2021 20:21:34 +0800 Subject: [PATCH 18/57] Use `AddApplicationAsync` in Blazor WASM. --- .../src/MyCompanyName.MyProjectName.Blazor/Program.cs | 2 +- .../host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs index 12c8d2df84..027cac3dcf 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Program.cs @@ -9,7 +9,7 @@ public class Program { var builder = WebAssemblyHostBuilder.CreateDefault(args); - var application = builder.AddApplication(options => + var application = await builder.AddApplicationAsync(options => { options.UseAutofac(); }); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs index 39e7bdb524..d0e58677bd 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs @@ -9,7 +9,7 @@ public class Program { var builder = WebAssemblyHostBuilder.CreateDefault(args); - var application = builder.AddApplication(options => + var application = await builder.AddApplicationAsync(options => { options.UseAutofac(); }); From 7481d363b08be045a8b48455c08c68156529fa65 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 21 Dec 2021 10:20:50 +0800 Subject: [PATCH 19/57] Add `AbpAsyncIntegratedTest`. --- .../AbpAspNetCoreAsyncIntegratedTestBase.cs | 24 +++---- .../AbpAspNetCoreIntegratedTestBase.cs | 2 - .../Abp/AbpTestBaseWithServiceProvider.cs | 2 +- .../Abp/Testing/AbpAsyncIntegratedTest.cs | 70 +++++++++++++++++++ .../Volo/Abp/Testing/AbpIntegratedTest.cs | 3 +- .../Interception/Autofac_Interception_Test.cs | 8 ++- .../DynamicProxy/AbpInterceptionTestBase.cs | 6 +- 7 files changed, 90 insertions(+), 25 deletions(-) create mode 100644 framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpAsyncIntegratedTest.cs diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs index 06a46897fa..3f5e9ad4b8 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs @@ -14,9 +14,9 @@ using Volo.Abp.Modularity; namespace Volo.Abp.AspNetCore.TestBase; public class AbpAspNetCoreAsyncIntegratedTestBase - where TModule : AbpModule + where TModule : IAbpModule { - protected IHost Host { get; set; } + protected WebApplication WebApplication { get; set; } protected TestServer Server { get; set; } @@ -50,26 +50,20 @@ public class AbpAspNetCoreAsyncIntegratedTestBase }); await ConfigureServicesAsync(builder.Services); + WebApplication = builder.Build(); + await WebApplication.InitializeApplicationAsync(); + await WebApplication.StartAsync(); - var app = builder.Build(); - - await app.InitializeApplicationAsync(); - - await app.StartAsync(); - - Host = app.Services.GetRequiredService(); - - Server = Host.GetTestServer(); - Client = Host.GetTestClient(); + Server = WebApplication.Services.GetRequiredService().GetTestServer(); + Client = Server.CreateClient(); ServiceProvider = Server.Services; - ServiceProvider.GetRequiredService().Server = Server; } - public virtual Task DisposeAsync() + public virtual async Task DisposeAsync() { - return Task.CompletedTask; + await WebApplication.DisposeAsync(); } protected virtual Task ConfigureServicesAsync(IServiceCollection services) diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs index 1fa62b2417..f3e60979bb 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs @@ -17,8 +17,6 @@ public abstract class AbpAspNetCoreIntegratedTestBase : AbpTestBaseWit protected HttpClient Client { get; } - protected override IServiceProvider ServiceProvider { get; } - private readonly IHost _host; protected AbpAspNetCoreIntegratedTestBase() diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs index 6167d823cb..407660e854 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs @@ -5,7 +5,7 @@ namespace Volo.Abp; public abstract class AbpTestBaseWithServiceProvider { - protected abstract IServiceProvider ServiceProvider { get; } + protected IServiceProvider ServiceProvider { get; set; } protected virtual T GetService() { diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpAsyncIntegratedTest.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpAsyncIntegratedTest.cs new file mode 100644 index 0000000000..4238a8712b --- /dev/null +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpAsyncIntegratedTest.cs @@ -0,0 +1,70 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Testing; + +public class AbpAsyncIntegratedTest : AbpTestBaseWithServiceProvider + where TStartupModule : IAbpModule +{ + protected IAbpApplication Application { get; set; } + + protected IServiceProvider RootServiceProvider { get; set; } + + protected IServiceScope TestServiceScope { get; set; } + + public virtual async Task InitializeAsync() + { + var services = await CreateServiceCollectionAsync(); + + await BeforeAddApplicationAsync(services); + var application = await services.AddApplicationAsync(await SetAbpApplicationCreationOptionsAsync()); + await AfterAddApplicationAsync(services); + + RootServiceProvider = await CreateServiceProviderAsync(services); + TestServiceScope = RootServiceProvider.CreateScope(); + await application.InitializeAsync(TestServiceScope.ServiceProvider); + ServiceProvider = application.ServiceProvider; + Application = application; + + await InitializeServicesAsync(); + } + + public virtual async Task DisposeAsync() + { + await Application.ShutdownAsync(); + TestServiceScope.Dispose(); + Application.Dispose(); + } + + protected virtual Task CreateServiceCollectionAsync() + { + return Task.FromResult(new ServiceCollection()); + } + + protected virtual Task BeforeAddApplicationAsync(IServiceCollection services) + { + return Task.CompletedTask; + } + + protected virtual Task> SetAbpApplicationCreationOptionsAsync() + { + return Task.FromResult>(_ => { }); + } + + protected virtual Task AfterAddApplicationAsync(IServiceCollection services) + { + return Task.CompletedTask; + } + + protected virtual Task CreateServiceProviderAsync(IServiceCollection services) + { + return Task.FromResult(services.BuildServiceProviderFromFactory()); + } + + protected virtual Task InitializeServicesAsync() + { + return Task.CompletedTask; + } +} diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs index bb085f6f74..b6ff2b8dbe 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs @@ -9,8 +9,6 @@ public abstract class AbpIntegratedTest : AbpTestBaseWithService { protected IAbpApplication Application { get; } - protected override IServiceProvider ServiceProvider => Application.ServiceProvider; - protected IServiceProvider RootServiceProvider { get; } protected IServiceScope TestServiceScope { get; } @@ -29,6 +27,7 @@ public abstract class AbpIntegratedTest : AbpTestBaseWithService RootServiceProvider = CreateServiceProvider(services); TestServiceScope = RootServiceProvider.CreateScope(); + ServiceProvider = Application.ServiceProvider; application.Initialize(TestServiceScope.ServiceProvider); } diff --git a/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs b/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs index a7a2dfafbc..290abda61b 100644 --- a/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs +++ b/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs @@ -1,11 +1,13 @@ -using Volo.Abp.DynamicProxy; +using System; +using System.Threading.Tasks; +using Volo.Abp.DynamicProxy; namespace Volo.Abp.Autofac.Interception; public class Autofac_Interception_Test : AbpInterceptionTestBase { - protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + protected override Task> SetAbpApplicationCreationOptionsAsync() { - options.UseAutofac(); + return Task.FromResult>(options => options.UseAutofac()); } } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs index befc9af679..f4b584701f 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs @@ -7,10 +7,10 @@ using Xunit; namespace Volo.Abp.DynamicProxy; -public abstract class AbpInterceptionTestBase : AbpIntegratedTest +public abstract class AbpInterceptionTestBase : AbpAsyncIntegratedTest, IAsyncLifetime where TStartupModule : IAbpModule { - protected override void BeforeAddApplication(IServiceCollection services) + protected override Task BeforeAddApplicationAsync(IServiceCollection services) { services.AddTransient(); services.AddTransient(); @@ -32,6 +32,8 @@ public abstract class AbpInterceptionTestBase : AbpIntegratedTes registration.Interceptors.Add(); } }); + + return Task.CompletedTask; } [Fact] From fa9e32db8ec502d52abc1ef05711131cade435a8 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 21 Dec 2021 10:42:58 +0800 Subject: [PATCH 20/57] Update AbpIntegratedTest.cs --- .../src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs index b6ff2b8dbe..8d8612c5b9 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs @@ -27,8 +27,8 @@ public abstract class AbpIntegratedTest : AbpTestBaseWithService RootServiceProvider = CreateServiceProvider(services); TestServiceScope = RootServiceProvider.CreateScope(); - ServiceProvider = Application.ServiceProvider; application.Initialize(TestServiceScope.ServiceProvider); + ServiceProvider = Application.ServiceProvider; } protected virtual IServiceCollection CreateServiceCollection() From 5cec8681b3b1b83422d6e08b27b91d77c54424b6 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Tue, 21 Dec 2021 10:18:53 +0300 Subject: [PATCH 21/57] fixed image --- .../POST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md index a1c63529a2..20894ae125 100644 --- a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md +++ b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md @@ -80,7 +80,7 @@ Navigate to Manage Azure Active Directory in [azure portal](https://portal.azure Enter a name for your application and **App.SelfUrl** + **AzureAd.CallbackPath** as redirect uri then register. -azure-app-register +![azure-app-register](azure-app-register.JPG) Now navigate to **Authentication** on the left menu and enable **ID tokens**. From 03a09914412c5ee6f065827cda01ea5b645eb6a7 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Tue, 21 Dec 2021 10:27:04 +0300 Subject: [PATCH 22/57] fixed auth-diagram --- .../POST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md index 20894ae125..c82365efee 100644 --- a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md +++ b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md @@ -12,7 +12,7 @@ The most common question is; The answer is, **you don't**. ABP Angular application is integrated with the backend (HttpApi.Host project) where it loads the configurations, **permissions** etc. For none-tiered angular applications, **HttpApi.Host** project also has IdentityServer4 embedded; also serving as **Authorization Server**. Angular application authentication flow is shown below. -auth-diagram +![auth-diagram](auth-diagram.jpeg) > What if I want Azure AD as my authorization server and not IdentityServer? From 96e4aeaf83adbfe7349cb6f0185d6a72c4cb225a Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 21 Dec 2021 14:16:06 +0300 Subject: [PATCH 23/57] When IWebHostEnvironment is not injected, hostGetHostingEnvironment now returns an empty one instead of throwing exception --- ...bpAspNetCoreServiceCollectionExtensions.cs | 12 +++++++++++- .../EmptyHostingEnvironment.cs | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/EmptyHostingEnvironment.cs diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs index 33e685ac4e..d672952b09 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs @@ -1,4 +1,6 @@ -using Microsoft.AspNetCore.Hosting; +using System.Linq; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; namespace Microsoft.Extensions.DependencyInjection { @@ -6,6 +8,14 @@ namespace Microsoft.Extensions.DependencyInjection { public static IWebHostEnvironment GetHostingEnvironment(this IServiceCollection services) { + if (!services.Any(d => d.ServiceType == typeof(IWebHostEnvironment))) + { + return new EmptyHostingEnvironment() + { + EnvironmentName = Environments.Development + }; + } + return services.GetSingletonInstance(); } } diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/EmptyHostingEnvironment.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/EmptyHostingEnvironment.cs new file mode 100644 index 0000000000..371162f0da --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/EmptyHostingEnvironment.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.FileProviders; + +namespace Microsoft.Extensions.DependencyInjection; + +internal class EmptyHostingEnvironment : IWebHostEnvironment +{ + public string EnvironmentName { get; set; } + + public string ApplicationName { get; set; } + + public string WebRootPath { get; set; } + + public IFileProvider WebRootFileProvider { get; set; } + + public string ContentRootPath { get; set; } + + public IFileProvider ContentRootFileProvider { get; set; } +} \ No newline at end of file From f0d81af1e4147162855c9c45d7001136d9bb1371 Mon Sep 17 00:00:00 2001 From: Luke Ni Date: Tue, 21 Dec 2021 19:54:54 +0800 Subject: [PATCH 24/57] translate to zh-Hans --- docs/en/Tutorials/Part-2.md | 20 +- docs/zh-Hans/Tutorials/Part-2.md | 254 +++++++++++++----- .../images/blazor-add-books-component.png | Bin 0 -> 19010 bytes .../images/blazor-bookstore-book-list.png | Bin 0 -> 61438 bytes .../images/blazor-menu-bookstore.png | Bin 0 -> 7754 bytes .../Tutorials/images/generated-proxies-3.png | Bin 0 -> 11889 bytes .../images/vs-run-without-iisexpress.png | Bin 0 -> 13760 bytes 7 files changed, 199 insertions(+), 75 deletions(-) create mode 100644 docs/zh-Hans/Tutorials/images/blazor-add-books-component.png create mode 100644 docs/zh-Hans/Tutorials/images/blazor-bookstore-book-list.png create mode 100644 docs/zh-Hans/Tutorials/images/blazor-menu-bookstore.png create mode 100644 docs/zh-Hans/Tutorials/images/generated-proxies-3.png create mode 100644 docs/zh-Hans/Tutorials/images/vs-run-without-iisexpress.png diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index b84ece9e97..21fa94c446 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -10,7 +10,7 @@ In this tutorial series, you will build an ABP based web application named `Acme.BookStore`. This application is used to manage a list of books and their authors. It is developed using the following technologies: -* **{{DB_Value}}** as the ORM provider. +* **{{DB_Value}}** as the ORM provider. * **{{UI_Value}}** as the UI Framework. This tutorial is organized as the following parts; @@ -80,13 +80,13 @@ You can see the **book list** returned from the server. You can also check the * Let's **create a new book** using the `create` function: ````js -acme.bookStore.books.book.create({ - name: 'Foundation', - type: 7, - publishDate: '1951-05-24', - price: 21.5 - }).then(function (result) { - console.log('successfully created the book with id: ' + result.id); +acme.bookStore.books.book.create({ + name: 'Foundation', + type: 7, + publishDate: '1951-05-24', + price: 21.5 + }).then(function (result) { + console.log('successfully created the book with id: ' + result.id); }); ```` @@ -187,7 +187,7 @@ namespace Acme.BookStore.Web.Pages.Books { public void OnGet() { - + } } } @@ -654,7 +654,7 @@ Open the `Books.razor` and replace the content as the following: > If you see some syntax errors, you can ignore them if your application properly built and run. Visual Studio still has some bugs with Blazor. * Inherited from the `AbpCrudPageBase` which implements all the CRUD details for us. -* `Entities`, `TotalCount`, `PageSize`, `OnDataGridReadAsync` are defined in the base blass. +* `Entities`, `TotalCount`, `PageSize`, `OnDataGridReadAsync` are defined in the base class. * Injected `IStringLocalizer` (as `L` object) and used for localization. While the code above pretty easy to understand, you can check the Blazorise [Card](https://blazorise.com/docs/components/card/) and [DataGrid](https://blazorise.com/docs/extensions/datagrid/) documents to understand them better. diff --git a/docs/zh-Hans/Tutorials/Part-2.md b/docs/zh-Hans/Tutorials/Part-2.md index decddfebff..fcb28afb23 100644 --- a/docs/zh-Hans/Tutorials/Part-2.md +++ b/docs/zh-Hans/Tutorials/Part-2.md @@ -2,26 +2,10 @@ ````json //[doc-params] { - "UI": ["MVC","NG"], + "UI": ["MVC","Blazor","BlazorServer","NG"], "DB": ["EF","Mongo"] } ```` - -{{ -if UI == "MVC" - DB="ef" - DB_Text="Entity Framework Core" - UI_Text="mvc" -else if UI == "NG" - DB="mongodb" - DB_Text="MongoDB" - UI_Text="angular" -else - DB ="?" - UI_Text="?" -end -}} - ## 关于本教程 在本系列教程中, 你将构建一个名为 `Acme.BookStore` 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发的: @@ -44,16 +28,30 @@ end ## 下载源码 -本教程根据你的**UI** 和 **Database**偏好有多个版,我们准备了两种可供下载的源码组合: +本教程根据你的**UI** 和 **Database**偏好有多个版,我们准备了几种可供下载的源码组合: * [MVC (Razor Pages) UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Blazor UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore) * [Angular UI 与 MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) +> 如果你在Windows中遇到 "文件名太长" or "解压错误", 很可能与Windows最大文件路径限制有关. Windows文件路径的最大长度为250字符. 为了解决这个问题,参阅 [在Windows 10中启用长路径](https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later). + +> 如果你遇到与Git相关的长路径错误, 尝试使用下面的命令在Windows中启用长路径. 参阅 https://github.com/msysgit/msysgit/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path +> `git config --system core.longpaths true` + +{{if UI == "MVC" && DB == "EF"}} + +### 视频教程 + +本章也被录制为视频教程 **发布在YouTube**. + +{{end}} + {{if UI == "MVC"}} ## 动态JavaScript代理 -通常在 **JavaScript** 端通过AJAX调用HTTP API端点. 你可以使用 `$.ajax` 或其他工具来调用端点. 但是ABP提供了更好的方法. +在 **JavaScript** 端通过AJAX调用HTTP API端点是常见的做法. 你可以使用 `$.ajax` 或其他工具来调用端点. 但是ABP提供了更好的方法. ABP**动态**为所有API端点创建 **[JavaScript代理](../UI/AspNetCore/Dynamic-JavaScript-Proxies.md)**. 所以你可以像调用**Javascript本地方法**一样使用任何**端点**. @@ -79,21 +77,21 @@ acme.bookStore.books.book.getList({}).done(function (result) { console.log(resul ![bookstore-getlist-result-network](images/bookstore-getlist-result-network.png) -Let's **create a new book** using the `create` function: - 让我们使用 `create` 函数**创建一本书**: ````js -acme.bookStore.books.book.create({ - name: 'Foundation', - type: 7, - publishDate: '1951-05-24', - price: 21.5 - }).then(function (result) { - console.log('successfully created the book with id: ' + result.id); +acme.bookStore.books.book.create({ + name: 'Foundation', + type: 7, + publishDate: '1951-05-24', + price: 21.5 + }).then(function (result) { + console.log('successfully created the book with id: ' + result.id); }); ```` +> 如果你下载了本教程的源代码并按照示例中的步骤操作,你需要传递`authorId`参数给创建方法以**创建一本新书**. + 您应该在控制台中看到类似以下的消息: ````text @@ -102,7 +100,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 检查数据库中的 `Books` 表你会看到新的一行. 你可以自己尝试使用 `get`, `update` 和 `delete` 函数. -我们将利用这些动态代理功能在接下来的章节来与服务器通信. +在接下来的章节,我们将利用这些动态代理函数与服务器通信. {{end}} @@ -112,7 +110,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 本地化文本位于 `Acme.BookStore.Domain.Shared` 项目的 `Localization/BookStore` 文件夹下: -![bookstore-localization-files](./images/bookstore-localization-files-v2.png) +![bookstore-localization-files](images/bookstore-localization-files-v2.png) 打开 `en.json` (*英文翻译*)文件并更改内容,如下所示: @@ -154,7 +152,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 * 为按钮项添加 `Menu:` 前缀. * 使用 `Enum::` 命名约定来本地化枚举成员. 当您这样做时ABP可以在某些适当的情况下自动将枚举本地化. -如果未在本地化文件中定义文本,则文本将**回退**到本地化键(作为ASP.NET Core的标准行为). +如果未在本地化文件中定义文本,则文本将**回退**到本地化键(ASP.NET Core的标准行为). > ABP本地化系统建立在[ASP.NET Core标准本地化](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization)系统之上,并以多种方式进行了扩展. 有关详细信息请参见[本地化文档](../Localization.md). @@ -162,7 +160,7 @@ successfully created the book with id: 439b0ea8-923e-8e1e-5d97-39f2c7ac4246 ## 创建图书页面 -是时候创建可见的和可用的东西了! 代替经典的MVC,我们将使用微软推荐的[Razor Pages UI](https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-pages-start). +是时候创建可见的和可用的东西了! 我们将使用微软推荐的[Razor Pages UI](https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-pages-start),而不是经典的MVC. 在 `Acme.BookStore.Web` 项目的 `Pages` 文件夹下创建一个名为新的 `Books` 的文件夹. 然后在文件夹右键选择 **添加 > Razor Page** 菜单. 输入名称 `Index`: @@ -189,13 +187,13 @@ namespace Acme.BookStore.Web.Pages.Books { public void OnGet() { - + } } } ``` -### 将Book页面添加到主菜单 +### 将图书页面添加到主菜单 打开 `Menus` 文件夹中的 `BookStoreMenuContributor` 类,在 `ConfigureMainMenuAsync` 方法的底部添加如下代码: @@ -223,9 +221,7 @@ context.Menu.AddItem( ### 图书列表 -We will use the [Datatables.net](https://datatables.net/) jQuery library to show the book list. Datatables library completely work via AJAX, it is fast, popular and provides a good user experience. - -我们将使用[Datatables.net](https://datatables.net/)JQuery插件来显示页面上的表格列表. [Datatables](https://datatables.net/)可以完全通过AJAX工作,速度快,并提供良好的用户体验. +我们将使用[Datatables.net](https://datatables.net/)JQuery插件来显示图书列表. [Datatables](https://datatables.net/)可以完全通过AJAX工作,速度快,并提供良好的用户体验. > Datatables插件在启动模板中配置,因此你可以直接在任何页面中使用它,无需在页面中引用样式和脚本文件. @@ -261,7 +257,7 @@ We will use the [Datatables.net](https://datatables.net/) jQuery library to show 在 `Pages/Books/` 文件夹中创建 `index.js`文件 -![bookstore-index-js-file](./images/bookstore-index-js-file-v3.png) +![bookstore-index-js-file](images/bookstore-index-js-file-v3.png) `index.js` 的内容如下: @@ -321,8 +317,8 @@ $(function () { ```` * `abp.localization.getResource` 获取一个函数,该函数用于使用服务器端定义的相同JSON文件对文本进行本地化. 通过这种方式你可以与客户端共享本地化值. -* `abp.libs.datatables.normalizeConfiguration`是另一个辅助方法.不是必须的, 但是它通过为缺少的选项提供常规值来简化数据表配置. -* `abp.libs.datatables.createAjax`是帮助ABP的动态JavaScript API代理跟[Datatable](https://datatables.net/)的格式相适应的辅助方法. +* `abp.libs.datatables.normalizeConfiguration`是一个辅助方法.不是必须的, 但是它通过为缺少的选项提供约定的值来简化[Datatables](https://datatables.net/)配置. +* `abp.libs.datatables.createAjax`是另一个辅助方法,用来适配ABP的动态JavaScript API代理和[Datatable](https://datatables.net/)期望的参数格式. * `acme.bookStore.books.book.getList` 是动态JavaScript代理函数(上面已经介绍过了) * [luxon](https://moment.github.io/luxon/) 库也是该解决方案中预先配置的标准库,你可以轻松地执行日期/时间操作. @@ -334,15 +330,13 @@ $(function () { ![Book list](images/bookstore-book-list-3.png) -这是一个完全正常工作的服务端分页,排序和本地化的图书列表. - -{{end}} +这是一个可以正常工作的,服务端分页,排序和本地化的图书列表. {{if UI == "NG"}} ## 安装NPM包 ->注意: 本教程基于ABP Framework v3.0.3+. 如果你的项目版本较旧,请升级您的解决方案. 如果要升级现有的v2.x项目,请参阅[迁移指南](../UI/Angular/Migration-Guide-v3.md). +>注意: 本教程基于ABP Framework v3.1.0+. 如果你的项目版本较旧,请升级您的解决方案. 如果要升级现有的v2.x项目,请参阅[迁移指南](../UI/Angular/Migration-Guide-v3.md). 在 `angular` 目录下打开命令行窗口,选择 `yarn` 命令安装NPM包: @@ -357,9 +351,7 @@ yarn - [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) 用做UI组件库. - [ngx-datatable](https://swimlane.gitbook.io/ngx-datatable/) 用做 datatable 类库. -### BookModule - -运行以下命令创建一个名为 `BookModule` 的新模块: +运行以下命令在angular应用程序根目录创建一个名为 `BookModule` 的新模块: ```bash yarn ng generate module book --module app --routing --route books @@ -417,7 +409,7 @@ const routes: Routes = [ ]; ```` -现在打开 `src/app/route.provider.ts` 以下替换 `configureRoutes` 函数: +现在打开 `src/app/route.provider.ts` 替换 `configureRoutes` 函数为以下代码: ```js function configureRoutes(routes: RoutesService) { @@ -450,27 +442,31 @@ function configureRoutes(routes: RoutesService) { `RoutesService` 是ABP框架提供的用于配置主菜单和路由的服务. -* `path` 路由的URL. +* `path` 路由的URL. * `name` 菜单项的名称(参阅[本地化文档](../UI/Angular/Localization.md)了解更多). -* `iconClass` 菜单项的图标(你可以使用默认的[Font Awesome](https://fontawesome.com/)图标). -* `order` 菜单项的排序.我们定义了101,它显示在 "Administration" 项的后面. -* `layout` BooksModule路由的布局. 可以定义 `eLayoutType.application`, `eLayoutType.account` 或 `eLayoutType.empty`. +* `iconClass` 菜单项的图标(你可以使用默认的[Font Awesome](https://fontawesome.com/)图标). +* `order` 菜单项的排序. +* `layout` BooksModule路由的布局. (有三个预定义的布局类型: `eLayoutType.application`, `eLayoutType.account` 或 `eLayoutType.empty`). + +更多信息请参阅[RoutesService 文档](../UI/Angular/Modifying-the-Menu.md#via-routesservice). -更多信息请参阅[RoutesService 文档](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu.md#via-routesservice). +### 生成服务代理 -### 生成代理 +[ABP CLI](../CLI.md) 提供 `generate-proxy` 命令为HTTP APIs生成客户端代理.有了这些代理,在客户端使用HTTP APIs变得更加方便. 运行 `generate-proxy` 命令前, 你的 host 必须正在运行. -ABP CLI提供了 `generate-proxy` 命令为你的服务HTTP API生成客户端代理简化客户端使用服务的成本. 运行 `generate-proxy` 命令前你的host必须正在运行. 参阅 [CLI 文档](../CLI.md). +> **警告**: 使用IIS Express时有一个问题; 它不允许从另一个进程连接应用程序. 如果你使用Visual Studio, 在运行按钮的下拉框中选择`Acme.BookStore.HttpApi.Host`,不要选择IIS Express, 如下图: -在 `angular` 文件夹下运行以下命令: +![vs-run-without-iisexpress](images/vs-run-without-iisexpress.png) + +启动host应用程序后,在 `angular` 文件夹下运行以下命令: ```bash abp generate-proxy ``` -生成的文件如下: +这个命令将在`/src/app/proxy/books`文件夹下产生以下文件: -![Generated files](./images/generated-proxies-2.png) +![Generated files](images/generated-proxies-3.png) ### BookComponent @@ -479,8 +475,7 @@ abp generate-proxy ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto } from './models'; -import { BookService } from './services'; +import { BookService, BookDto } from '@proxy/books'; @Component({ selector: 'app-book', @@ -494,7 +489,7 @@ export class BookComponent implements OnInit { constructor(public readonly list: ListService, private bookService: BookService) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -503,8 +498,8 @@ export class BookComponent implements OnInit { } ``` -* 我们注入了生成的 `BookService`. -* 我们实现了 [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service),它是一个公用服务,提供了简单的分页,排序和搜索. +* 我们引入并注入了生成的 `BookService`. +* 我们使用 [ListService](../UI/Angular/List-Service.md),它是一个工具服务,提供了易用的分页,排序和搜索. 打开 `/src/app/book/book.component.html` 用以下内容替换它: @@ -545,9 +540,138 @@ export class BookComponent implements OnInit { 现在你可以在浏览器看到最终结果: -![Book list final result](./images/bookstore-book-list.png) +![图书列表最终结果](images/bookstore-book-list.png) -{{end}} +{{else if UI == "Blazor" || UI == "BlazorServer"}} + +## 创建图书页面 + +是时候创建可见和可用的东西了! 右击`Acme.BookStore.Blazor`项目下的`Pages`文件夹,新建一个名为`Books.razor`的**razor组件**. + +![blazor-add-books-component](images/blazor-add-books-component.png) + +用以下内容替换这个组件的内容: + +````html +@page "/books" + +

Books

+ +@code { + +} +```` + +### 将图书页面添加到主菜单 + +打开`Blazor`项目中的`BookStoreMenuContributor`类,在 `ConfigureMainMenuAsync` 方法的底部添加如下代码: + +````csharp +context.Menu.AddItem( + new ApplicationMenuItem( + "BooksStore", + l["Menu:BookStore"], + icon: "fa fa-book" + ).AddItem( + new ApplicationMenuItem( + "BooksStore.Books", + l["Menu:Books"], + url: "/books" + ) + ) +); +```` + +运行项目,使用用户名 `admin` 和密码 `1q2w3E*` 登录到应用程序. 看到新菜单项已添加到顶部栏: + +![blazor-menu-bookstore](images/blazor-menu-bookstore.png) + +点击BookStore下的Books子菜单项就会跳转到空的图书页面. + +### 图书列表 + +我们将使用[Blazorise library](https://blazorise.com/)作为UI组件.它是一个强大的库,支持主要的HTML/CSS框架,包括Bootstrap. + +ABP提供了一个通用的基类,`AbpCrudPageBase<...>`,用来创建CRUD风格的页面.这个基类兼容用来构建`IBookAppService`的`ICrudAppService`.所以我们从`AbpCrudPageBase`继承,获得标准CRUD的默认实现. + +打开`Books.razor` 并把内容修改成下面这样: + +````xml +@page "/books" +@using Volo.Abp.Application.Dtos +@using Acme.BookStore.Books +@using Acme.BookStore.Localization +@using Microsoft.Extensions.Localization +@inject IStringLocalizer L +@inherits AbpCrudPageBase + + + +

@L["Books"]

+
+ + + + + + + @L[$"Enum:BookType:{(int)context.Type}"] + + + + + @context.PublishDate.ToShortDateString() + + + + + + + @context.CreationTime.ToLongDateString() + + + + + +
+```` + +> 如果你可以编译并运行成功,但看到一些语法错误.你可以忽略这些错误,因为Visual Studio处理Blazor还有一些bug. + +* `AbpCrudPageBase`实现了所有的CRUD细节,我们从它继承. +* `Entities`, `TotalCount`, `PageSize`, `OnDataGridReadAsync`定义在基类中. +* 注入`IStringLocalizer` (作为`L`对象),用于本地化. + +虽然上面的代码非常容易理解,你仍然可以查看Blazorise [Card](https://blazorise.com/docs/components/card/)和[DataGrid](https://blazorise.com/docs/extensions/datagrid/)文档以更好地理解它们. + +#### 关于AbpCrudPageBase + +对于图书页面,我们将持续从`AbpCrudPageBase`获得益处. 你可以只注入`IBookAppService`并自己执行所有的服务端调用(感谢ABP的[动态C# HTTP API客户端代理](../API/Dynamic-CSharp-API-Clients.md)系统). + +## 运行最终应用程序 + +你可以运行应用程序!该部分的最终用户界面如下所示: + +![blazor-bookstore-book-list](images/blazor-bookstore-book-list.png) + +这是一个可以正常工作的,服务端分页,排序和本地化的图书列表. + +{{end # UI }} ## 下一章 diff --git a/docs/zh-Hans/Tutorials/images/blazor-add-books-component.png b/docs/zh-Hans/Tutorials/images/blazor-add-books-component.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0412d31ecf79ada3578add9c7d5e28ee21979c GIT binary patch literal 19010 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

d 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 literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/images/blazor-menu-bookstore.png b/docs/zh-Hans/Tutorials/images/blazor-menu-bookstore.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f334aa1d53d66094fd5ffe7a498d83b45a95f3 GIT binary patch literal 7754 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 P$$<~z@?zy81_A#AY)0!* literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/images/vs-run-without-iisexpress.png b/docs/zh-Hans/Tutorials/images/vs-run-without-iisexpress.png new file mode 100644 index 0000000000000000000000000000000000000000..03c30e2b481c95d102f6aaf1cdbd5348d7d64b3d GIT binary patch literal 13760 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 Date: Tue, 21 Dec 2021 20:13:35 +0800 Subject: [PATCH 25/57] Add `CleanCommand`. Resolve #11011 --- .../Volo/Abp/Cli/AbpCliCoreModule.cs | 5 +- .../Volo/Abp/Cli/Commands/CleanCommand.cs | 62 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index 303acd7e00..af8a9501a1 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -41,8 +41,8 @@ public class AbpCliCoreModule : AbpModule Configure(options => { - //TODO: Define constants like done for GenerateProxyCommand.Name. - options.Commands["help"] = typeof(HelpCommand); + //TODO: Define constants like done for GenerateProxyCommand.Name. + options.Commands["help"] = typeof(HelpCommand); options.Commands["prompt"] = typeof(PromptCommand); options.Commands["new"] = typeof(NewCommand); options.Commands["get-source"] = typeof(GetSourceCommand); @@ -64,6 +64,7 @@ public class AbpCliCoreModule : AbpModule options.Commands["bundle"] = typeof(BundleCommand); options.Commands["create-migration-and-run-migrator"] = typeof(CreateMigrationAndRunMigratorCommand); options.Commands["install-libs"] = typeof(InstallLibsCommand); + options.Commands["clean"] = typeof(CleanCommand); }); Configure(options => diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs new file mode 100644 index 0000000000..72cdf586e2 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs @@ -0,0 +1,62 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Args; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Commands; + +public class CleanCommand : IConsoleCommand, ITransientDependency +{ + public ILogger Logger { get; set; } + + public CleanCommand() + { + Logger = NullLogger.Instance; + } + + public Task ExecuteAsync(CommandLineArgs commandLineArgs) + { + var binEntries = Directory.EnumerateDirectories(Directory.GetCurrentDirectory(), "bin", SearchOption.AllDirectories); + var objEntries = Directory.EnumerateDirectories(Directory.GetCurrentDirectory(), "obj", SearchOption.AllDirectories); + + foreach (var path in binEntries.Concat(objEntries)) + { + if (path.IndexOf("node_modules", StringComparison.OrdinalIgnoreCase) > 0) + { + Logger.LogInformation($"Skipping: {path}"); + } + else + { + Logger.LogInformation($"Deleting: {path}"); + Directory.Delete(path, true); + } + } + + Logger.LogInformation($"BIN and OBJ folders have been successfully deleted!"); + + return Task.CompletedTask; + } + + public string GetUsageInfo() + { + var sb = new StringBuilder(); + + sb.AppendLine(""); + sb.AppendLine("Usage:"); + sb.AppendLine(" abp clean"); + sb.AppendLine(""); + sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI"); + + return sb.ToString(); + } + + public string GetShortDescription() + { + return "Delete all BIN and OBJ folders in current folder."; + } +} From 3461e3fc1e3ca237abd432d94b6e6dab5e7cd179 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 21 Dec 2021 20:44:11 +0800 Subject: [PATCH 26/57] Add comment when outputFolder is null --- .../Abp/Cli/Commands/Services/ConnectionStringProvider.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs index e4c5394a60..f6a749f05d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/ConnectionStringProvider.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.DependencyInjection; @@ -21,7 +22,8 @@ namespace Volo.Abp.Cli.Commands.Services case DatabaseManagementSystem.OracleDevart: return "Data Source=MyProjectName;Integrated Security=yes;"; case DatabaseManagementSystem.SQLite: - return $"Data Source={Path.Combine(outputFolder, "MyProjectName.db")};".Replace("\\", "\\\\"); + var comment = outputFolder.IsNullOrWhiteSpace() ? "//You need to change to an absolute filename" : string.Empty; + return $"Data Source={Path.Combine(outputFolder, "MyProjectName.db")};".Replace("\\", "\\\\") + comment; default: return null; } From dcc4448368c411a9491e0e7e0292c274b3177457 Mon Sep 17 00:00:00 2001 From: "ismail.yilmaz" Date: Tue, 21 Dec 2021 15:47:04 +0300 Subject: [PATCH 27/57] used constant for command name --- .../src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs | 2 +- .../src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index af8a9501a1..7f8f820602 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -64,7 +64,7 @@ public class AbpCliCoreModule : AbpModule options.Commands["bundle"] = typeof(BundleCommand); options.Commands["create-migration-and-run-migrator"] = typeof(CreateMigrationAndRunMigratorCommand); options.Commands["install-libs"] = typeof(InstallLibsCommand); - options.Commands["clean"] = typeof(CleanCommand); + options.Commands[CleanCommand.Name] = typeof(CleanCommand); }); Configure(options => diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs index 72cdf586e2..9cc89c6017 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CleanCommand.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.Cli.Commands; public class CleanCommand : IConsoleCommand, ITransientDependency { + public const string Name = "clean"; + public ILogger Logger { get; set; } public CleanCommand() From d8da40a023107454cb0114cc4b6562b914cb2741 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 22 Dec 2021 08:28:14 +0800 Subject: [PATCH 28/57] Update Part-2.md --- docs/zh-Hans/Tutorials/Part-2.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/zh-Hans/Tutorials/Part-2.md b/docs/zh-Hans/Tutorials/Part-2.md index fcb28afb23..fe0dd84c45 100644 --- a/docs/zh-Hans/Tutorials/Part-2.md +++ b/docs/zh-Hans/Tutorials/Part-2.md @@ -28,7 +28,7 @@ ## 下载源码 -本教程根据你的**UI** 和 **Database**偏好有多个版,我们准备了几种可供下载的源码组合: +本教程根据你的**UI** 和 **数据库**偏好有多个版本,我们准备了几种可供下载的源码组合: * [MVC (Razor Pages) UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) * [Blazor UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore) @@ -317,7 +317,7 @@ $(function () { ```` * `abp.localization.getResource` 获取一个函数,该函数用于使用服务器端定义的相同JSON文件对文本进行本地化. 通过这种方式你可以与客户端共享本地化值. -* `abp.libs.datatables.normalizeConfiguration`是一个辅助方法.不是必须的, 但是它通过为缺少的选项提供约定的值来简化[Datatables](https://datatables.net/)配置. +* `abp.libs.datatables.normalizeConfiguration`是一个辅助方法.不是必须的, 但是它通过为缺省的选项提供约定的值来简化[Datatables](https://datatables.net/)配置. * `abp.libs.datatables.createAjax`是另一个辅助方法,用来适配ABP的动态JavaScript API代理和[Datatable](https://datatables.net/)期望的参数格式. * `acme.bookStore.books.book.getList` 是动态JavaScript代理函数(上面已经介绍过了) * [luxon](https://moment.github.io/luxon/) 库也是该解决方案中预先配置的标准库,你可以轻松地执行日期/时间操作. @@ -461,7 +461,7 @@ function configureRoutes(routes: RoutesService) { 启动host应用程序后,在 `angular` 文件夹下运行以下命令: ```bash -abp generate-proxy +abp generate-proxy -t ng ``` 这个命令将在`/src/app/proxy/books`文件夹下产生以下文件: From 30ad48c5c73e5ea6f7543938b2c186c21e402b4b Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 22 Dec 2021 08:28:42 +0800 Subject: [PATCH 29/57] Update Part-2.md --- docs/en/Tutorials/Part-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index 21fa94c446..4b29231164 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -461,7 +461,7 @@ For more information, see the [RoutesService document](../UI/Angular/Modifying-t Once the host application is running, execute the following command in the `angular` folder: ```bash -abp generate-proxy +abp generate-proxy -t ng ``` This command will create the following files under the `/src/app/proxy/books` folder: From 59aa84abdb9c9cc8a6d59ed91b06e5ef27497cba Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 22 Dec 2021 10:53:56 +0800 Subject: [PATCH 30/57] Update document --- docs/en/Tutorials/Part-10.md | 2 +- docs/en/Tutorials/Part-2.md | 2 +- docs/en/Tutorials/Part-9.md | 2 +- docs/en/UI/Angular/Service-Proxies.md | 2 +- docs/zh-Hans/Tutorials/Part-2.md | 2 +- docs/zh-Hans/Tutorials/Todo/Index.md | 2 +- docs/zh-Hans/UI/Angular/Service-Proxies.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/en/Tutorials/Part-10.md b/docs/en/Tutorials/Part-10.md index 5d5ea9618b..563de95d68 100644 --- a/docs/en/Tutorials/Part-10.md +++ b/docs/en/Tutorials/Part-10.md @@ -948,7 +948,7 @@ Since the HTTP APIs have been changed, you need to update Angular client side [s Run the following command in the `angular` folder (you may need to stop the angular application): ```bash -abp generate-proxy +abp generate-proxy -t ng ``` This command will update the service proxy files under the `/src/app/proxy/` folder. diff --git a/docs/en/Tutorials/Part-2.md b/docs/en/Tutorials/Part-2.md index b84ece9e97..7c8efde9d0 100644 --- a/docs/en/Tutorials/Part-2.md +++ b/docs/en/Tutorials/Part-2.md @@ -461,7 +461,7 @@ For more information, see the [RoutesService document](../UI/Angular/Modifying-t Once the host application is running, execute the following command in the `angular` folder: ```bash -abp generate-proxy +abp generate-proxy -t ng ``` This command will create the following files under the `/src/app/proxy/books` folder: diff --git a/docs/en/Tutorials/Part-9.md b/docs/en/Tutorials/Part-9.md index d6fa004596..0e271a5e4e 100644 --- a/docs/en/Tutorials/Part-9.md +++ b/docs/en/Tutorials/Part-9.md @@ -605,7 +605,7 @@ function configureRoutes(routes: RoutesService) { Run the following command in the `angular` folder: ```bash -abp generate-proxy +abp generate-proxy -t ng ``` This command generates the service proxy for the author service and the related model (DTO) classes: diff --git a/docs/en/UI/Angular/Service-Proxies.md b/docs/en/UI/Angular/Service-Proxies.md index 18e5a3a0cc..dc8433f7de 100644 --- a/docs/en/UI/Angular/Service-Proxies.md +++ b/docs/en/UI/Angular/Service-Proxies.md @@ -15,7 +15,7 @@ ABP introduces an endpoint that exposes server-side method contracts. When the ` Run the following command in the **root folder** of the angular application: ```bash -abp generate-proxy +abp generate-proxy -t ng ``` The command without any parameters creates proxies only for your own application's services and places them in your default Angular application. There are several parameters you may use to modify this behavior. See the [CLI documentation](../../CLI) for details. diff --git a/docs/zh-Hans/Tutorials/Part-2.md b/docs/zh-Hans/Tutorials/Part-2.md index decddfebff..231ca226fa 100644 --- a/docs/zh-Hans/Tutorials/Part-2.md +++ b/docs/zh-Hans/Tutorials/Part-2.md @@ -465,7 +465,7 @@ ABP CLI提供了 `generate-proxy` 命令为你的服务HTTP API生成客户端 在 `angular` 文件夹下运行以下命令: ```bash -abp generate-proxy +abp generate-proxy -t ng ``` 生成的文件如下: diff --git a/docs/zh-Hans/Tutorials/Todo/Index.md b/docs/zh-Hans/Tutorials/Todo/Index.md index d940957c18..2200bf23e6 100644 --- a/docs/zh-Hans/Tutorials/Todo/Index.md +++ b/docs/zh-Hans/Tutorials/Todo/Index.md @@ -682,7 +682,7 @@ ABP提供了一个便捷的功能来自动创建客户端服务, 以方便地使 当启动 `TodoApp.HttpApi.Host` 项目后, 在`angular`文件夹中打开一个命令行终端并输入以下命令: ````bash -abp generate-proxy +abp generate-proxy -t ng ```` 如果一切顺利, 它应该生成如下输出: diff --git a/docs/zh-Hans/UI/Angular/Service-Proxies.md b/docs/zh-Hans/UI/Angular/Service-Proxies.md index 2824bc44a7..cc07a24175 100644 --- a/docs/zh-Hans/UI/Angular/Service-Proxies.md +++ b/docs/zh-Hans/UI/Angular/Service-Proxies.md @@ -15,7 +15,7 @@ ABP CLI 的`generate-proxies` 命令在 `src/app` 文件夹中创建按模块名 在angular应用程序的**根文件夹**中运行以下命令: ```bash -abp generate-proxy +abp generate-proxy -t ng ``` 它只为你自己的应用程序的服务创建代理. 不会为你正在使用的应用程序模块的服务创建代理(默认情况下). 有几个选项,参见[CLI文档](../../CLI). From d3cc2dde4bd335be0655eeb0d34778221f7cbca8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 22 Dec 2021 15:28:39 +0800 Subject: [PATCH 31/57] Update Devart.Data.Oracle for .NET6 --- .../Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj | 4 ++-- nupkg/common.ps1 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj index a3021984d2..918ac8ddf3 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj @@ -19,8 +19,8 @@ - - + + diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index e173a913c2..fbcbae15dd 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -136,7 +136,7 @@ $projects = ( "framework/src/Volo.Abp.EntityFrameworkCore", "framework/src/Volo.Abp.EntityFrameworkCore.MySQL", "framework/src/Volo.Abp.EntityFrameworkCore.Oracle", - # "framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart", + "framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart", "framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql", "framework/src/Volo.Abp.EntityFrameworkCore.Sqlite", "framework/src/Volo.Abp.EntityFrameworkCore.SqlServer", From c02a2844ed28fb0d97bf6168143166b000daf272 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 22 Dec 2021 12:21:52 +0300 Subject: [PATCH 32/57] Refactor GetHostingEnvironment --- .../AbpAspNetCoreServiceCollectionExtensions.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs index d672952b09..41f0a16167 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/AbpAspNetCoreServiceCollectionExtensions.cs @@ -8,7 +8,9 @@ namespace Microsoft.Extensions.DependencyInjection { public static IWebHostEnvironment GetHostingEnvironment(this IServiceCollection services) { - if (!services.Any(d => d.ServiceType == typeof(IWebHostEnvironment))) + var hostingEnvironment = services.GetSingletonInstanceOrNull(); + + if (hostingEnvironment == null) { return new EmptyHostingEnvironment() { @@ -16,7 +18,7 @@ namespace Microsoft.Extensions.DependencyInjection }; } - return services.GetSingletonInstance(); + return hostingEnvironment; } } } From 8df90cefb860b5ff0d46543d01439ba81adf089c Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 23 Dec 2021 12:10:49 +0800 Subject: [PATCH 33/57] Update DistEventsDemo --- .../DistDemoApp.Shared/DistDemoApp.Shared.csproj | 2 +- .../DistDemoApp.Shared/DistDemoAppSharedModule.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj b/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj index 4f5cb8ad84..f43d82dd19 100644 --- a/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj +++ b/test/DistEvents/DistDemoApp.Shared/DistDemoApp.Shared.csproj @@ -17,7 +17,7 @@ - + diff --git a/test/DistEvents/DistDemoApp.Shared/DistDemoAppSharedModule.cs b/test/DistEvents/DistDemoApp.Shared/DistDemoAppSharedModule.cs index 138b64f567..936264e828 100644 --- a/test/DistEvents/DistDemoApp.Shared/DistDemoAppSharedModule.cs +++ b/test/DistEvents/DistDemoApp.Shared/DistDemoAppSharedModule.cs @@ -5,7 +5,7 @@ using StackExchange.Redis; using Volo.Abp.Autofac; using Volo.Abp.Domain; using Volo.Abp.Domain.Entities.Events.Distributed; -using Volo.Abp.EventBus.Boxes; +using Volo.Abp.EventBus; using Volo.Abp.Modularity; namespace DistDemoApp @@ -13,8 +13,8 @@ namespace DistDemoApp [DependsOn( typeof(AbpAutofacModule), typeof(AbpDddDomainModule), - typeof(AbpEventBusBoxesModule) - )] + typeof(AbpEventBusModule) + )] public class DistDemoAppSharedModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) @@ -28,7 +28,7 @@ namespace DistDemoApp options.EtoMappings.Add(); options.AutoEventSelectors.Add(); }); - + context.Services.AddSingleton(sp => { var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); @@ -36,4 +36,4 @@ namespace DistDemoApp }); } } -} \ No newline at end of file +} From 1f3c7bf06befc93cdb47617109548dfd70d829e9 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 23 Dec 2021 13:43:50 +0800 Subject: [PATCH 34/57] Add `UniqueName` claim to the iidentity. --- .../Volo/Abp/IdentityServer/AbpClaimsService.cs | 2 ++ .../IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs index a977afd2e9..4e9dc40299 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpClaimsService.cs @@ -5,6 +5,7 @@ using IdentityModel; using IdentityServer4.Services; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.JsonWebTokens; using Volo.Abp.Security.Claims; namespace Volo.Abp.IdentityServer @@ -20,6 +21,7 @@ namespace Volo.Abp.IdentityServer AbpClaimTypes.ImpersonatorUserId, AbpClaimTypes.Name, AbpClaimTypes.SurName, + JwtRegisteredClaimNames.UniqueName, JwtClaimTypes.PreferredUserName, JwtClaimTypes.GivenName, JwtClaimTypes.FamilyName, diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs index 219cb943d8..28c57c975c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AspNetIdentity/AbpUserClaimsFactory.cs @@ -5,6 +5,7 @@ using System.Security.Principal; using System.Threading.Tasks; using IdentityModel; using Microsoft.AspNetCore.Identity; +using Microsoft.IdentityModel.JsonWebTokens; using Volo.Abp.DependencyInjection; using IdentityUser = Volo.Abp.Identity.IdentityUser; @@ -41,6 +42,10 @@ namespace Volo.Abp.IdentityServer.AspNetIdentity { identity.RemoveClaim(usernameClaim); identity.AddIfNotContains(new Claim(JwtClaimTypes.PreferredUserName, username)); + + //https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/1627 + //https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/05e02b5e0383be40e45c667c12f6667d38e33fcc/src/System.IdentityModel.Tokens.Jwt/ClaimTypeMapping.cs#L52 + identity.AddIfNotContains(new Claim(JwtRegisteredClaimNames.UniqueName, username)); } if (!identity.HasClaim(x => x.Type == JwtClaimTypes.Name)) From d609aa19984d1a8b26fc8f7f13b0afba4334477d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 23 Dec 2021 11:37:50 +0300 Subject: [PATCH 35/57] Added abp book to docs --- docs/en/Index.md | 16 +++++++++++++--- docs/en/images/abp-book.png | Bin 0 -> 77778 bytes 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 docs/en/images/abp-book.png diff --git a/docs/en/Index.md b/docs/en/Index.md index 84e1155b9c..3f5c3dbf44 100644 --- a/docs/en/Index.md +++ b/docs/en/Index.md @@ -1,6 +1,6 @@ # ABP Documentation -ABP Framework is a complete **infrastructure** based on the **ASP.NET Core** to create **modern web applications** and **APIs** by following the software development **best practices** and the **latest technologies**. +ABP Framework offers an **opinionated architecture** to build enterprise software solutions with **best practices** on top of the **.NET** and the **ASP.NET Core** platforms. It provides the fundamental infrastructure, production-ready startup templates, modules, themes, tooling, guides and documentation to implement that architecture properly and **automate the details** and repetitive works as much as possible. ## Getting Started @@ -56,13 +56,23 @@ See the [Application Modules](Modules/Index.md) document for all pre-built modul The [Startup templates](Startup-Templates/Index.md) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**. -## Free E-Book: Implementing Domain Driven Design +## Books + +### Mastering ABP Framework + +![abp-book](images/abp-book.png) + +*Mastering ABP Framework* is an ultimate guide to get started and expertise with the ABP Framework. It is authored by Halil İbrahim Kalkan, the creator and the lead developer of the ABP Framework. + +**[You can order it from Amazon now](https://www.amazon.com/Mastering-ABP-Framework-maintainable-implementing-dp-1801079242/dp/1801079242)!** + +### Free E-Book: Implementing Domain Driven Design ![Implementing Domain Driven Design](images/implementing-domain-driven-design-book.png) A **practical guide** for implementing Domain Driven Design (DDD). While the implementation details are **based on the ABP Framework** infrastructure, the basic concepts, principles and models can be applied to any solution, even if it is not a .NET solution. -[Click here to get your free copy](https://abp.io/books/implementing-domain-driven-design?ref=doc). +**[Click here to get your free copy](https://abp.io/books/implementing-domain-driven-design?ref=doc).** ## ABP Community diff --git a/docs/en/images/abp-book.png b/docs/en/images/abp-book.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd6c34c90a642f298aa1001f5520329a05e8194 GIT binary patch literal 77778 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 Date: Thu, 23 Dec 2021 19:21:04 +0800 Subject: [PATCH 36/57] translate to zh-Hans --- docs/zh-Hans/Tutorials/Part-3.md | 600 +++++++++++++++--- .../images/blazor-add-book-button.png | Bin 0 -> 8810 bytes .../images/blazor-delete-book-action.png | Bin 0 -> 73024 bytes .../images/blazor-edit-book-action-2.png | Bin 0 -> 97829 bytes .../images/blazor-edit-book-modal.png | Bin 0 -> 27492 bytes .../images/blazor-new-book-modal.png | Bin 0 -> 40416 bytes 6 files changed, 506 insertions(+), 94 deletions(-) create mode 100644 docs/zh-Hans/Tutorials/images/blazor-add-book-button.png create mode 100644 docs/zh-Hans/Tutorials/images/blazor-delete-book-action.png create mode 100644 docs/zh-Hans/Tutorials/images/blazor-edit-book-action-2.png create mode 100644 docs/zh-Hans/Tutorials/images/blazor-edit-book-modal.png create mode 100644 docs/zh-Hans/Tutorials/images/blazor-new-book-modal.png diff --git a/docs/zh-Hans/Tutorials/Part-3.md b/docs/zh-Hans/Tutorials/Part-3.md index 90dd1326c3..6a9740730d 100644 --- a/docs/zh-Hans/Tutorials/Part-3.md +++ b/docs/zh-Hans/Tutorials/Part-3.md @@ -2,27 +2,10 @@ ````json //[doc-params] { - "UI": ["MVC","NG"], + "UI": ["MVC","Blazor","BlazorServer","NG"], "DB": ["EF","Mongo"] } ```` -{{ -if UI == "MVC" - UI_Text="mvc" -else if UI == "NG" - UI_Text="angular" -else - UI_Text="?" -end -if DB == "EF" - DB_Text="Entity Framework Core" -else if DB == "Mongo" - DB_Text="MongoDB" -else - DB_Text="?" -end -}} - ## 关于本教程 在本系列教程中, 你将构建一个名为 `Acme.BookStore` 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发的: @@ -45,16 +28,30 @@ end ## 下载源码 -本教程根据你的**UI** 和 **Database**偏好有多个版,我们准备了两种可供下载的源码组合: +本教程根据你的**UI** 和 **数据库**偏好有多个版本,我们准备了几种可供下载的源码组合: * [MVC (Razor Pages) UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Blazor UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore) * [Angular UI 与 MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) +> 如果你在Windows中遇到 "文件名太长" or "解压错误", 很可能与Windows最大文件路径限制有关. Windows文件路径的最大长度为250字符. 为了解决这个问题,参阅 [在Windows 10中启用长路径](https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later). + +> 如果你遇到与Git相关的长路径错误, 尝试使用下面的命令在Windows中启用长路径. 参阅 https://github.com/msysgit/msysgit/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path +> `git config --system core.longpaths true` + +{{if UI == "MVC" && DB == "EF"}} + +### 视频教程 + +本章也被录制为视频教程 **发布在YouTube**. + +{{end}} + {{if UI == "MVC"}} ## 创建新书籍 -通过本节, 你将会了解如何创建一个 modal form 来实现新增书籍的功能. 最终成果如下图所示: +通过本节, 你将会了解如何创建一个 modal form 实现新增书籍的功能. model dialog将如下图所示: ![bookstore-create-dialog](./images/bookstore-create-dialog-2.png) @@ -66,7 +63,7 @@ end #### CreateModal.cshtml.cs -打开 `CreateModal.cshtml.cs` 代码文件,用如下代码替换 `CreateModalModel` 类的实现: +打开 `CreateModal.cshtml.cs` 代码文件(`CreateModalModel` 类),替换成以下代码: ````C# using System.Threading.Tasks; @@ -101,10 +98,10 @@ namespace Acme.BookStore.Web.Pages.Books } ```` -* 该类派生于 `BookStorePageModel` 而非默认的 `PageModel`. `BookStorePageModel` 继承了 `PageModel` 并且添加了一些可以被你的page model类使用的通用属性和方法. +* 该类派生于 `BookStorePageModel` 而非默认的 `PageModel`. `BookStorePageModel` 间接继承了 `PageModel` 并且添加了一些可以被你的page model类使用的通用属性和方法. * `Book` 属性上的 `[BindProperty]` 特性将post请求提交上来的数据绑定到该属性上. * 该类通过构造函数注入了 `IBookAppService` 应用服务,并且在 `OnPostAsync` 处理程序中调用了服务的 `CreateAsync` 方法. -* 它在 `OnGet` 方法中创建一个新的 `CreateUpdateBookDto` 对象。 ASP.NET Core不需要像这样创建一个新实例就可以正常工作. 但是它不会为你创建实例,并且如果你的类在类构造函数中具有一些默认值分配或代码执行,它们将无法工作. 对于这种情况,我们为某些 `CreateUpdateBookDto` 属性设置了默认值. +* 它在 `OnGet` 方法中创建一个新的 `CreateUpdateBookDto` 对象。 ASP.NET Core不需要像这样创建一个新实例就可以正常工作. 但是它不会为你创建实例,并且如果你的类在类构造函数中赋值一些默认值或执行一些代码,它们将无法工作. 对于这种情况,我们为某些 `CreateUpdateBookDto` 属性设置了默认值. #### CreateModal.cshtml @@ -134,10 +131,9 @@ namespace Acme.BookStore.Web.Pages.Books * 这个 modal 使用 `abp-dynamic-form` [tag Helper](../UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md) 根据 `CreateBookViewModel` 类自动构建了表单. * `abp-model` 指定了 `Book` 属性为模型对象. -* `data-ajaxForm` 设置了表单通过AJAX提交,而不是经典的页面回发. * `abp-form-content` tag helper 作为表单控件渲染位置的占位符 (这是可选的,只有你在 `abp-dynamic-form` 中像本示例这样添加了其他内容才需要). -> 提示: 就像在本示例中一样,`Layout` 应该为 `null`,因为当通过AJAX加载模态时,我们不希望包括所有布局. +> 提示: 就像在本示例中一样,`Layout` 应该为 `null`,因为当通过AJAX加载模态窗口时,我们不希望包括所有布局. ### 添加 "New book" 按钮 @@ -195,9 +191,9 @@ namespace Acme.BookStore.Web.Pages.Books 如下图所示,只是在表格 **右上方** 添加了 **New book** 按钮: -![bookstore-new-book-button](./images/bookstore-new-book-button-2.png) +![bookstore-new-book-button](images/bookstore-new-book-button-2.png) -打开 `Pages/book/index.js` 在 `datatable` 配置代码后面添加如下代码: +打开 `Pages/Book/Index.js` 在 `datatable` 配置代码后面添加如下代码: ````js var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); @@ -212,9 +208,9 @@ $('#NewBookButton').click(function (e) { }); ```` -* `abp.ModalManager` 是一个在客户端打开和管理modal的辅助类.它基于Twitter Bootstrap的标准modal组件通过简化的API抽象隐藏了许多细节. +* `abp.ModalManager` 是一个在客户端管理modal的辅助类.它内部使用了Twitter Bootstrap的标准modal组件,但通过简化的API抽象了许多细节. * `createModal.onResult(...)` 用于在创建书籍后刷新数据表格. -* `createModal.open();` 用于打开模态创建新书籍. +* `createModal.open();` 用于打开modal创建新书籍. `Index.js` 的内容最终如下所示: @@ -335,8 +331,8 @@ namespace Acme.BookStore.Web.Pages.Books } ```` -* `[HiddenInput]` 和 `[BindProperty]` 是标准的 ASP.NET Core MVC 特性.这里启用 `SupportsGet` 从Http请求的查询字符串中获取Id的值. -* 在 `OnGetAsync` 方法中,将 `BookAppService.GetAsync` 方法返回的 `BookDto` 映射成 `CreateUpdateBookDto` 并赋值给Book属性. +* `[HiddenInput]` 和 `[BindProperty]` 是标准的 ASP.NET Core MVC 特性.这里启用 `SupportsGet` 从Http请求的查询字符串参数中获取Id的值. +* 在 `OnGetAsync` 方法中, 我们从 `BookAppService` 获得 `BookDto` ,并将它映射成DTO对象 `CreateUpdateBookDto`. * `OnPostAsync` 方法直接使用 `BookAppService.UpdateAsync` 来更新实体. ### BookDto 到 CreateUpdateBookDto 对象映射 @@ -391,10 +387,10 @@ namespace Acme.BookStore.Web 这个页面内容和 `CreateModal.cshtml` 非常相似,除了以下几点: -* 它包含`id`属性的`abp-input`, 用于存储编辑书的 `id` (它是隐藏的Input) +* 它包含`id`属性的`abp-input`, 用于存储被编辑书籍的 `id` (它是隐藏的Input) * 此页面指定的post地址是`Books/EditModal`. -### 为表格添加 "操作(Actions)" 下拉菜单 +### 为表格添加 "操作(Actions)" 下拉菜单 我们将为表格每行添加下拉按钮 ("Actions"): @@ -516,9 +512,9 @@ $(function () { } ```` -* `confirmMessage` 用来在实际执行 `action` 之前向用户进行确认. -* 通过javascript代理方法 `acme.bookStore.books.book.delete(...)` 执行一个AJAX请求来删除一个book实体. -* `abp.notify.info` 用来在执行删除操作后显示一个toastr通知信息. +* `confirmMessage` 执行 `action` 前向用户进行确认. +* `acme.bookStore.books.book.delete(...)` 执行一个AJAX请求删除一个book. +* `abp.notify.info` 执行删除操作后显示一个通知信息. 由于我们使用了两个新的本地化文本(`BookDeletionConfirmationMessage`和`SuccesslyDeleted`),因此你需要将它们添加到本地化文件(`Acme.BookStore.Domain.Shared`项目的`Localization/BookStore`文件夹下的`en.json`): @@ -640,7 +636,7 @@ $(function () { ## 创建新书籍 -下面的章节中,你将学习到如何创建一个新的模态对话框来新增书籍. +下面的章节中,你将学习到如何创建一个新的模态窗口新增书籍. ### BookComponent @@ -649,8 +645,7 @@ $(function () { ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto } from './models'; -import { BookService } from './services'; +import { BookService, BookDto } from '@proxy/books'; @Component({ selector: 'app-book', @@ -666,7 +661,7 @@ export class BookComponent implements OnInit { constructor(public readonly list: ListService, private bookService: BookService) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -680,7 +675,8 @@ export class BookComponent implements OnInit { } ``` -* 我们定义了一个名为 `isModalOpen` 的变量和 `createBook` 方法. +* 我们定义了一个名为 `isModalOpen` 的属性和 `createBook` 方法. + 打开 `/src/app/book/book.component.html` 做以下更改: @@ -690,9 +686,9 @@ export class BookComponent implements OnInit {

{%{{{ '::Menu:Books' | abpLocalization }}}%}
-
+
- +
- +
@@ -726,11 +722,11 @@ export class BookComponent implements OnInit { ``` * 添加了 `New book` 按钮到卡片头部. -* 添加了 `abp-modal` 渲染模态框,允许用户创建新书. `abp-modal` 是显示模态框的预构建组件. 你也可以使用其它方法显示模态框,但 `abp-modal` 提供了一些附加的好处. +* 添加了 `abp-modal` 渲染模态框,允许用户创建新书. `abp-modal` 是显示模态框的预构建组件. 你也可以使用其它方法显示模态框,但 `abp-modal` 提供了一些额外的好处. 你可以打开浏览器,点击**New book**按钮看到模态框. -![Empty modal for new book](./images/bookstore-empty-new-book-modal.png) +![Empty modal for new book](images/bookstore-empty-new-book-modal.png) ### 添加响应式表单 @@ -741,8 +737,7 @@ export class BookComponent implements OnInit { ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto, BookType } from './models'; // add BookType -import { BookService } from './services'; +import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; // add bookTypeOptions import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // add this @Component({ @@ -756,12 +751,8 @@ export class BookComponent implements OnInit { form: FormGroup; // add this line - bookType = BookType; // add this line - // add bookTypes as a list of BookType enum members - bookTypes = Object.keys(this.bookType).filter( - (key) => typeof this.bookType[key] === 'number' - ); + bookTypes = bookTypeOptions; isModalOpen = false; @@ -772,7 +763,7 @@ export class BookComponent implements OnInit { ) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -800,7 +791,7 @@ export class BookComponent implements OnInit { return; } - this.bookService.createByInput(this.form.value).subscribe(() => { + this.bookService.create(this.form.value).subscribe(() => { this.isModalOpen = false; this.form.reset(); this.list.get(); @@ -809,12 +800,11 @@ export class BookComponent implements OnInit { } ``` -* 导入了 `FormGroup, FormBuilder and Validators`. +* 从` @angular/forms `导入了 `FormGroup, FormBuilder and Validators`. * 添加了 `form: FormGroup` 变量. -* 添加了 `bookType` 属性,你可以从模板中获取 `BookType` 枚举成员. * 添加了 `bookTypes` 属性作为 `BookType` 枚举成员列表. 将在表单选项中使用. -* 我们注入了 `fb: FormBuilder` 服务到构造函数. [FormBuilder](https://angular.io/api/forms/FormBuilder) 服务为生成控件提供了方便的方法. 它减少了构建复杂表单所需的样板文件的数量. -* 我们添加了 `buildForm` 方法到文件末尾, 在 `createBook` 方法调用 `buildForm()` 方法. 该方法创建一个响应式表单去创建新书. +* 我们注入了 `FormBuilder` 到构造函数. [FormBuilder](https://angular.io/api/forms/FormBuilder) 提供了简便的方法生成表单控件. 它减少了构建复杂表单所需的样板文件的数量. +* 我们添加了 `buildForm` 方法到文件末尾, 在 `createBook` 方法调用 `buildForm()` 方法. * 添加了`save` 方法. 打开 `/src/app/book/book.component.html`,使用以下内容替换 ` `: @@ -836,7 +826,7 @@ export class BookComponent implements OnInit { * @@ -897,13 +887,12 @@ export class BookModule { } * 我们导入了 `NgbDatepickerModule` 来使用日期选择器. -打开 `/src/app/book/book.component.ts` 使用以内内容替换: +打开 `/src/app/book/book.component.ts` 使用以下内容替换: ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto, BookType } from './models'; -import { BookService } from './services'; +import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // added this line @@ -923,11 +912,7 @@ export class BookComponent implements OnInit { form: FormGroup; - bookType = BookType; - - bookTypes = Object.keys(this.bookType).filter( - (key) => typeof this.bookType[key] === 'number' - ); + bookTypes = bookTypeOptions; isModalOpen = false; @@ -938,7 +923,7 @@ export class BookComponent implements OnInit { ) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -964,7 +949,7 @@ export class BookComponent implements OnInit { return; } - this.bookService.createByInput(this.form.value).subscribe(() => { + this.bookService.create(this.form.value).subscribe(() => { this.isModalOpen = false; this.form.reset(); this.list.get(); @@ -974,11 +959,11 @@ export class BookComponent implements OnInit { ``` * 导入了 `NgbDateNativeAdapter` 和 `NgbDateAdapter`. -* 我们添加了一个新的 `NgbDateAdapter` 提供程序,它将Datepicker值转换为 `Date` 类型. 有关更多详细信息,请参见[datepicker adapters](https://ng-bootstrap.github.io/#/components/datepicker/overview). +* 我们添加了一个新的 `NgbDateAdapter` 提供程序,它将Datepicker值转换为 `Date` 类型. 更多详细信息,请参见[datepicker adapters](https://ng-bootstrap.github.io/#/components/datepicker/overview). 现在你可以打开浏览器看到以下变化: -![Save button to the modal](./images/bookstore-new-book-form-v2.png) +![Save button to the modal](images/bookstore-new-book-form-v2.png) ## 更新书籍 @@ -987,8 +972,7 @@ export class BookComponent implements OnInit { ```js import { ListService, PagedResultDto } from '@abp/ng.core'; import { Component, OnInit } from '@angular/core'; -import { BookDto, BookType, CreateUpdateBookDto } from './models'; -import { BookService } from './services'; +import { BookService, BookDto, bookTypeOptions } from '@proxy/books'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; @@ -1001,15 +985,11 @@ import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap export class BookComponent implements OnInit { book = { items: [], totalCount: 0 } as PagedResultDto; - selectedBook = new BookDto(); // declare selectedBook + selectedBook = {} as BookDto; // declare selectedBook form: FormGroup; - bookType = BookType; - - bookTypes = Object.keys(this.bookType).filter( - (key) => typeof this.bookType[key] === 'number' - ); + bookTypes = bookTypeOptions; isModalOpen = false; @@ -1020,7 +1000,7 @@ export class BookComponent implements OnInit { ) {} ngOnInit() { - const bookStreamCreator = (query) => this.bookService.getListByInput(query); + const bookStreamCreator = (query) => this.bookService.getList(query); this.list.hookToQuery(bookStreamCreator).subscribe((response) => { this.book = response; @@ -1028,14 +1008,14 @@ export class BookComponent implements OnInit { } createBook() { - this.selectedBook = new BookDto(); // reset the selected book + this.selectedBook = {} as BookDto; // reset the selected book this.buildForm(); this.isModalOpen = true; } // Add editBook method editBook(id: string) { - this.bookService.getById(id).subscribe((book) => { + this.bookService.get(id).subscribe((book) => { this.selectedBook = book; this.buildForm(); this.isModalOpen = true; @@ -1061,8 +1041,8 @@ export class BookComponent implements OnInit { } const request = this.selectedBook.id - ? this.bookService.updateByIdAndInput(this.form.value, this.selectedBook.id) - : this.bookService.createByInput(this.form.value); + ? this.bookService.update(this.selectedBook.id, this.form.value) + : this.bookService.create(this.form.value); request.subscribe(() => { this.isModalOpen = false; @@ -1074,10 +1054,10 @@ export class BookComponent implements OnInit { ``` * 我们声明了类型为 `BookDto` 的 `selectedBook` 变量. -* 我们添加了 `editBook` 方法, 根据给定图书 `Id` 设置 `selectedBook` 对象. +* 我们添加了 `editBook` 方法, 根据给定书籍 `Id` 设置 `selectedBook` 对象. * 我们替换了 `buildForm` 方法使用 `selectedBook` 数据创建表单. * 我们替换了 `createBook` 方法,设置 `selectedBook` 为空对象. -* 我们替换了 `save` 方法. +* 我们修改了 `save` 方法,同时处理新建和更新操作. ### 添加 "Actions" 下拉框到表格 @@ -1111,7 +1091,7 @@ export class BookComponent implements OnInit { 在表格的第一列添加了一个 "Actions" 下拉菜单,如下图所示: -![Action buttons](./images/bookstore-actions-buttons.png) +![Action buttons](images/bookstore-actions-buttons.png) 同时如下所示更改 `ng-template #abpHeader` 部分: @@ -1147,13 +1127,13 @@ constructor( delete(id: string) { this.confirmation.warn('::AreYouSureToDelete', '::AreYouSure').subscribe((status) => { if (status === Confirmation.Status.confirm) { - this.bookService.deleteById(id).subscribe(() => this.list.get()); + this.bookService.delete(id).subscribe(() => this.list.get()); } }); } ``` -* 我们注入了 `ConfirmationService`. +* 我们引入了 `ConfirmationService`. * 我们注入了 `ConfirmationService` 到构造函数. * 添加了 `delete` 方法. @@ -1161,6 +1141,7 @@ delete(id: string) { ### 添加删除按钮: + 打开 `/src/app/book/book.component.html` 修改 `ngbDropdownMenu` 添加删除按钮: ```html @@ -1174,14 +1155,445 @@ delete(id: string) { 最终操作下拉框UI看起来如下: -![bookstore-final-actions-dropdown](./images/bookstore-final-actions-dropdown.png) +![bookstore-final-actions-dropdown](images/bookstore-final-actions-dropdown.png) + +点击 `delete` 操作调用 `delete` 方法,然后显示一个确认弹层如下图所示. + +![bookstore-confirmation-popup](images/bookstore-confirmation-popup.png) + +{{end}} + +{{if UI == "Blazor" || UI == "BlazorServer"}} + +## 创建新书籍 + +通过本节, 你将会了解如何创建一个模态窗口实现新增书籍的功能. 因为我们已经从 `AbpCrudPageBase` 继承, 所以只需要开发视图部分. + +### 添加 "New Button" 按钮 + +打开 `Books.razor` 替换 `` 部分为以下代码: + +````xml + + + +

@L["Books"]

+
+ + + +
+
+```` + +如下图所示,卡片头 **右侧** 添加了 **New book** 按钮: + +![blazor-add-book-button](images/blazor-add-book-button.png) + +现在, 我们可以添加点击按钮后打开的模态窗口了. + +### 书籍创建模态窗口 + +打开 `Books.razor`, 添加以下代码到页面底部: + +````xml + + + +
+ + @L["NewBook"] + + + + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + +
+
+
+```` + +这段代码需要一个服务; 在文件顶部, `@inherits...` 行前, 注入 `AbpBlazorMessageLocalizerHelper`: + +````csharp +@inject AbpBlazorMessageLocalizerHelper LH +```` + +* 表单实现了验证功能, `AbpBlazorMessageLocalizerHelper` 用于本地化验证消息. +* `CreateModal` 对象, `CloseCreateModalAsync` 和 `CreateEntityAsync` 方法定义在基类中. 参阅 [Blazorise文档](https://blazorise.com/docs/) 以深入理解 `Modal` 和其它组件. + +这就是全部了. 运行应用程序, 尝试添加一本新书. + +![blazor-new-book-modal](images/blazor-new-book-modal.png) + +## 更新书籍 + +编辑书籍与新建书籍很类似. -点击 `delete` 动作调用 `delete` 方法,然后无法显示一个确认弹层如下图所示. +### 操作下拉菜单 -![bookstore-confirmation-popup](./images/bookstore-confirmation-popup.png) +打开 `Books.razor` , 在 `DataGridColumns` 中添加以下 `DataGridEntityActionsColumn` 作为第一项: + +````xml + + + + + + + +```` + +* `OpenEditModalAsync` 定义在基类中, 它接收实体(书籍)参数, 编辑这个实体. + +`DataGridEntityActionsColumn` 组件用于显示 `DataGrid` 每一行中的"操作" 下拉菜单. 如果其中只有唯一的操作, `DataGridEntityActionsColumn` 显示 **唯一按钮**, 而不是下拉菜单. + +![blazor-edit-book-action](images/blazor-edit-book-action-2.png) + +### 编辑模态窗口 + +我们现在可以定义一个模态窗口编辑书籍. 加入下面的代码到 `Books.razor` 页面的底部: + +````xml + + + +
+ + @EditingEntity.Name + + + + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + +
+
+
+```` + +### AutoMapper 配置 + +基类 `AbpCrudPageBase` 使用 [对象到对象映射](../Object-To-Object-Mapping.md) 系统将 `BookDto` 对象转化为`CreateUpdateBookDto` 对象. 因此, 我们需要定义映射. + +打开 `Acme.BookStore.Blazor` 项目中的 `BookStoreBlazorAutoMapperProfile `, 替换成以下内容: + +````csharp +using Acme.BookStore.Books; +using AutoMapper; + +namespace Acme.BookStore.Blazor +{ + public class BookStoreBlazorAutoMapperProfile : Profile + { + public BookStoreBlazorAutoMapperProfile() + { + CreateMap(); + } + } +} +```` + +* `CreateMap();` 行用于定义映射. + +### 测试编辑模态窗口 + +你可以运行程序并尝试编辑一本书. + +![blazor-edit-book-modal](images/blazor-edit-book-modal.png) + +> 提示: 尝试保留 *Name* 字段为空并提交表单, 将显示验证错误消息. + +## 删除书籍 + +打开 `Books.razor` 页面, 在 `EntityActions` 中的"编辑" 操作下面加入以下的 `EntityAction`: + +````xml + +```` + +* `DeleteEntityAsync` 定义在基类中. 通过向服务器发起请求删除实体. +* `ConfirmationMessage` 执行操作前显示确认消息的回调函数. +* `GetDeleteConfirmationMessage` 定义在基类中. 你可以覆写这个方法 (或传递其它值给 `ConfirmationMessage` 参数) 以定制本地化消息. + +因为"操作" 按钮现在有了两个操作, 变成了下拉菜单: + +![blazor-edit-book-action](images/blazor-delete-book-action.png) + +运行程序并尝试删除一本书. + +## 完整的 CRUD UI 代码 + +下面是完整的创建图书管理CRUD页面的代码, 这些代码在上面是分成两部分开发的: + +````xml +@page "/books" +@using Volo.Abp.Application.Dtos +@using Acme.BookStore.Books +@using Acme.BookStore.Localization +@using Microsoft.Extensions.Localization +@using Volo.Abp.AspNetCore.Components.Web +@inject IStringLocalizer L +@inject AbpBlazorMessageLocalizerHelper LH +@inherits AbpCrudPageBase + + + + + +

@L["Books"]

+
+ + + +
+
+ + + + + + + + + + + + + + + @L[$"Enum:BookType:{(int) context.Type}"] + + + + + @context.PublishDate.ToShortDateString() + + + + + + + @context.CreationTime.ToLongDateString() + + + + + +
+ + + + +
+ + @L["NewBook"] + + + + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + +
+
+
+ + + + +
+ + @EditingEntity.Name + + + + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + +
+
+
+```` {{end}} ## 下一章 -查看本教程的[下一章](Part-4.md). +查看本教程的[下一章](Part-4.md). \ No newline at end of file diff --git a/docs/zh-Hans/Tutorials/images/blazor-add-book-button.png b/docs/zh-Hans/Tutorials/images/blazor-add-book-button.png new file mode 100644 index 0000000000000000000000000000000000000000..58a607d3b1ec5fcd42ea93afc837c0b2baf05b69 GIT binary patch literal 8810 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 literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/images/blazor-delete-book-action.png b/docs/zh-Hans/Tutorials/images/blazor-delete-book-action.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b0b83f301807124e0748f6b35d82c63f404d57 GIT binary patch literal 73024 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 xhB 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⋙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 z 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%0AmSa`Bf8JOIw8UdFuP+9K+yu&ABo&XX z$5H+d6WfD`#MavacNUpTmWgSg5IT|+dmYDNe@uQV90f;VM}wL0so{~jy|`-W ziOgQqQQjp~F6lhoL?fC9b{{1eN>9?9u4~5#+xc)0SC1?@&h?l#*pBzG8feXh4ma^R z>W%$~<6P6!7#Hv5uk@}ItNPk5o@-@lOFQ8CFu^GuXIQwn;=EHz>+$fE7Sav=hOl4v zj{^%VUe&g2wVcNd+pQvmKAj4 z?G@yle|U!Pw76AXSUAz1RD9p<`$Aot^0M&_q;*Fi-dk~M$F2n1%|0Ko@gjM%GMZo!P1zN|7GRPFjdkF zeWV5+LoLZnN5^MK7W(#7G??oS*=P{7 zET77fMz;{?@_o$VIiD_6m#vyAYii=WkLfYLUv`_iw9GE!h~z-&uee_8BL}6sAEmtW zmwKniUiEdeAiB)^F><}P%8%eNHmF^bNFowL`B7Fe&u?=g_pK|KU)a+C1l zBO>G9$&$mEo7)RpX>;6$;??ywmY|QJUQ6DZe(RT<%XsJytj@P;#d6mfkInJaF}m)T zFRa36)Zdw$Rw_M01y2;FvxtzAb~Z27b-!$jk_ps!d??PgXx>YxY%i_e#>JZvP~}yX z7~A>rwPah}E_t-&YLVEsVcOnfEUoTEO^iGq)}yLeCZ4cu&{3^pewv%ohf|;z9j*ry zEvUlb}U$$fmdMAi0lc(nQGiZ|`nVB~#M=JlcdSW_FMC1cIzc6RKY ze0jmh&FqqO-<77Hx)R|O)M}J_$L4l)3H~L5-Qk2}!{ZXQPW5-{*JruQJOK#h0&p|J z!zFDijT7cZFAH)yB-n2Az+MNkmTK^mysqAD`+oZ(Z02A4|1?lm3O4zjml6n>KmmCurt^@!=6Q60A``vW|Hn{3|VG>l_d4Fh-h))hjxZl3QB`@@5sh`b(pGXEN_N9TLcchZd+M`O1;gXCj)dD z)w}Y&k>4-3T-NaQP(Ijya%{@*dinCFq}f@HS6Ha`>Cc3)`)eX$@rFcdK~biNzH&3Y z>NW!shNIi_oQ5#l^o=~6Htwegf;?2i6xYAxkkD_bwjZ~>AGFj6f4VhZoH4F*sT!w4 zAvXMUSvS|-k6#yT6We-^J)W^OFBk5pYr8t8mYKg28w-pluIh{esjowN~->B|}cW53Zasmf|$I?-!cbEvuY$ot30Quiyi?GBD? z7x-4&{k87DKcuFd4|#1h(~-O1hom0d?-Ig!_1dShWT2DGvqt9zeA?AXT}LQ>Nnvx< zu+z6C4$ju|hB3*-x2o!=?Isz@2ba^xH@gr7ZJ6NqCeCowLPh{p9B1j^%j!->T>zM? zEmvpsQbf>$PKTrxLT|Zozh^RCYhC))UHDz&!%-c0t2uF2(>iB9T#va`maypAC&D7! zq6dN>>bjmxtz{K4mVqB(jAg~;EzF^YOGnNaIor)0$k)l=0HbHi3Kq^G+cH$%dduK+ zpl)YI#9^UvC^vRwmY?xL?-44V*geO!rvV4FiD=!^QT)1nnyzJOy@%J?fKTd@$9)K$Veb;8UV4-rMtIhRdFmJsi4+)x;or`L ze(F4d9gcJ8#~CVqAnn9VGDm4UEpNSYONG}tf7ZX@e)cSC>I9lR_0uD&Uejs zykm?P%f?(y5aNtO=$_%1ofcPJ!m7smACODl9+NG0jscDI&T{vQK8h7;&QUWj66X0; zitfru7*5Je^?r03eXLbTC`82ImmL$!-6zOIq<>`DKBr&*h%k$c6YC*M4!S%%@?O~N zx~Fk>xSuk3_631})`qcDk)u(x;$BGeYY!>G?A}4>vhp5^vy{&0nlda9ebk`gcm0 zfDIiZ&NgzrhORwc{Ql;rGWwm%B6xgxCi}MXbQKiWAhw!tzFh$_%)*fO*WO}E#`=Bt5 zRXT#IinIv^wTJR?hU<Vdq7TW{_yl*cOn(lXI*Nvpe}KNj9le^^hGoN7(M zwwhs~1EA4QYlg$88%V~CIauQJ4zYEC3q>`v^N(TsoJX;BE1^eR+ZmyIHwiNsXzk*& zm(N#v49~NB^oozm<@I94tA1N&?w_8oj2z9l_*Bwnk6DekkIA#uy{oh^lFBG7|?FKE+5r*6iUC%Z<;dWojsV%y_u_nqS& zW4WoQ+4$y#d}k<|!@VM?z#lIKFK3cSa^+Fe<7X=ykMI_j7VHhjXeHZev4ef?K8VbF z_nQP>AiCD&{KwGa>&<6dHzK`{Qx9*{UVb4+F8M4iubnH*zJ))SwF!xel_7~Gm75-B z3e{fK8*(ft(vM9NSSXd85rxUhaaT9CvkPGgEXFg-WPG*)r%k(}t zOe&=ff?vw%@9z6QGIrLJ*knshePyecZ8Kt3S`(`aZQ^xX* zl>}dT31WRX)dfyAi-j71F0=uC-2L7J0YXcq&u2e1yT%=QMGi*ES9_eHFRP^!&##MK zpqaMX6CK=3@Q}d68+vTG+<0Ez5 zVq#`trr3rh|RIPk%!mdmu=Y<;D}(#sumgxJNB1M+}( zm4;E3s=~FWzgpiBTMyx|r|Ph;o*uMbe;U7pEDFlaOr3u$V7;YjT(_}dI}3%0G3#5Z z$t&j@Fe`(T-Ntx-tw86Nb$S+r_qQ|q_>h^13Joc^k>|_ir0IP7!}j}&tKRWH1lH(J z8y;%whzizRYLuL;a&`cW7<@YiiEvfJe#YHo$KHDVbG3I|;9~~g;W?N3Y>_(Avo$lm zBjXhSl7=IFVrES8<=-9z;vX6C1Z(sVFf<35*kJ17VJGXe>_Rw7qu{=S^V;=n{aKca z)10HPbK*TG44tw1?z%Othtt)%63o~{y4!kvLQ1EZUPtHmYvyln)}hYl2Ki=O<@ZI# z8Wh(DPx15wn9ZR>>#EuVqr(c`*#=zGBR1bG#0Grt;Pa@Kep_GzQoz=Q_26`p@iQUC zBZE(>`|O7|ot}l4S3@%TO6qoZ*9)Nav^h zW;1ExiJ)aUHcPPOIsqLuel%*@v)M{nPmGe;Q=5f!KV0ni=glj$?|$84bI`5InOJyK zbeGH?Do|j6L8DouP+K z{DN8I#vCE$k*m!FkG=Ty@->yp;ncHU1@;*X@sMq|^XFJ;$fwgk9x1YSau;iH;%)N17MPmyN6ZlHgITJQUYC!W$IN_7JP8 zZbblaGR{#3&GvaT7hkuOhvj^AWa4qRi`Hp`vk!76t#woMA`NxQ?b_pUdcTxGc~t4s zW%4D6&Z-Q%U>1RUG}<+~GVQjSJmn|$;b+dEbDs@3?^0qpQ#tkF>~)yzx?}U{T;BQ9 z=<0p&OMAj9?xs6i*@s6Sc*G-wL&qP2r23}ANwE!~PC3U!n$FTYvBGbd94}W78nIGP z#{?+d@RmLf2N-V8Hl6Jjs6r)YG7xpK21E8pe0CmmF~F@I0FGxpeszjmo`tB+S(O-h zGof-x^1!;@ik|I2Hc_qJd^d3mGLbgumq`*a}SEjMBC)LWh8)dG78CZ@};);V6b zzbIkysmV#RN`A6Y>$z7o_GYLmaLy2dP7LL}pd)&d|LyU|KTji>DTHK_lHA&@?Qh-P z{Q3P3qH0uAR)HF^j%>h%j(L)n#B6Gxj#{C4soaip7dt}zJ(AEh93W6L0DMkcp3-H? zWxe{9{~;hbe|ZV}9I56Fpk?n>Z5?a(nmVbd7Yo9b#Y|c2_c7`bH4o@UJP>C+TnKlh zRRxs1ehzwy(nuGfiX9uE=e8_FOMW<{W!Du(`Ah`4&yH%>k2a}1=eC=`A@b7~iEX@bhHiA7XLuX8NG+&J)2@Ilhpccx z7I5R2;2+87?4vw)RLD;=x-jkkpQ z=FX?>8{8_D9cp7k{fo@tA0Gr?q(g;bzvn|1vZ9r2vhc^v zr8_F5^DyjXO+cKGCxIWVRQytdVp^Hbo(4><3i43LErRFYX_>mMFKf5oRFHtwn92HQ}o!>1d!iD z8UELsEqD9uxj!Hj-_1#&^W69*UgVeLEgsD^;H=b*?>5t~rb4TyTOhNJFZxA~$&d2&9MSR!=_*V;h0!0+Ur=UsR#&2QnL7sloy zV=fQ-d9qg`%)Ia4*~}XYDha>z`kHaOFL$_JKDJokplCaMbZ!{R2g0{*Ce?_2asH>x zbh?dK#&p{Lq}?|S%l?AVp>mz#umZKS1Y@ctKS`#YWb&_4ngw zcPM63@a|Qs$%1M zo7IP4tB+Z?WfKM;2S3))fGCflml+FbtiS$#$&^g#@o;gkule;9&D2!uonWad-tarY zntcSf+Fspcs;_@Gpzt-rA{6Mis0+pBKFd;dBXjSS`4;cFk%!G04)h#mJCRBj-WXBM z8Q_vLTD|<2_1h|-XW!INQ_+LHGWH<41n2XW&4G&7l22ta2FGALnV$-Vpg@GE$FC&w zDaqA&(C{XK;=29)D%vOvM-&&R^xwZJ%xyZ^-4l@LmWGWDS?W8`A>KdlAl++OvNO8B zC$EM-tF6kS`arZ4YYcPhDXNtN8S!_smNPFl^Q4%(UcM8IJE5|IP4+NTa!yb2nQQGP z`pRc{Vs@C$L)&UvnGMubgco~VlF%Vc&Y1z7w>L{R!LAC6Mn^Po+p&mH!BvMQe0%S` z;LgZP$C2E@IW&#KOzI*~7NEPY>xi7pcGyGl2K8wwT`YiOx^g26ZpWnfzn*=ioe-Jf z{4#S@PU6oC*lqi#i$~(y5?gV(H%}`1Z%ciR7o0Y?Omb?kb)s+|SxeX|aYVDt0#&NT zk+*_JjXrJtYixW*vD`g+bi55%B)C_TWb%qBqfJA(eg+G0s=w>T^U8>u%q2|wrRf(u zX@sZfn6A%aZF+v6${V>rQu;0M2P7rwnat+3zE`QRAa}@iy7arjHSg*+ip2Lg?yxxT z5mK*Gsfu0MmLjTVFnsu%2Nmk|paMD78=mn4YmGS;pOU(b-P*-*L8+l3re;qc8&GMe zWx$$1$H=|wr|z%bQ}+(w{1!7Db;{^wQc2Ec4rVP+kDJo&`G^>!@v8gEB723=6Hhb2 zhe)WNknjHV!YE(Y?dx4e*)xzNw|i9q3(r)|ABs)s&|Oy++cTJ=vQaaPhN;$UTj55KMqNyLM4b|2F6w;c7B|mSMo4MY}}_2bhXlel-}bD`wCZ; zj+p3PA_w(!MVq4A@Ei2=6~%oxwsWX7{vycur6ih{P?L-LbLAxxD!qCFd{__k(Xq3a z^#$~r&6TNGvF_QAi;6qMo}-*RG6dX_pS7rUJVxIV9ZYUmnL=`LVq3E^ zwb?P&RsUWmyH9AfkonTI;~%APv7M~ii%8y&tSBgd$TQmS59>*UDpGw8W%NiCU3pTOq6gi-C>y<1a~DjHnnQ*By~N<_g4hHEt+f~Ri+ z{1B5yxlm*ibuDdziVjN-+spZw4~<3xj4c&-8M$^q&5Zip7Owgwe;uNV6dbRt{%#&CHKPsTJ$CZ_M*zW z^%vgcc%JyZe@Xq8F=V!lZGIZE0NX*tN^{e>DHd>?Eq*?C)hipkMtLxvrHZmpnU&Ukn2;LM*Ol|8S11hPIXCA+CAFkZB$`GplY_lbV?IBQ@ zVjjI2{KjPZ2*a)HqJLy>*!2|U<73I3ZL-eOa7Y1~lpO3?!z+kj($`{j4sSle`-&g* zyhVa@;3fFTutCp101jCx0;;-qESr-w*6vXYju4Ldw9cl&+b!P5xBj*~g43EPb1 zCT;49wTOVuoeSBfJ|YKF5#pybep1lvwS+M%<%AG+B#%-U{IgeJX4T?N()i&=MOp2P zhdAdU6u4{n8SSNP)|CRTd|5z^WR}Z)QTkW4lk*JW`NHNDI1Qw3g=R3=drZM7V08uj z-d!T1Y_navc}L+b)9$Cq`moFMqogH&i$egV=&Q@7pF(%FR5fMyDnZp>90iXUsjnEF z#xjOA-K;pgFIT?`aU;xCz>Cv4J$}Uz)Bg%mgZ9u4LHgho*0gasSvxHM{5A=Mu336l zuy}N=3z=IClGe*GBH9k$MuCuBREqoBby*=En+a`63v0S9F~ ze0U`1@=DOc%YF8~e4kGbcmmUr==28_+cacb^Q#1~HW=XTa#RYy8fT1~4@`tno({|E z9;sUW4`WLef?RaM-Ok%$jl%by>eh@Lur9{pBhDXIFu_|?y(bO>hPi)O^oiiUGTYU$ znPVoE3r-J&)<^imx>l!KNH!l3v3R9w0;t~FZ2HI6qaTRLaL>yuZ)vtLTHEN)qth`y zo_vWfD+4p?J zO(DDZevtpHbdG8(ojCx2+~XECu{sFd`3(U_j?4?P24k@}QKpGfY(A3ECDvWTN2fge zJGqX~MW=S4N@@n8M8){~j>aiMXRno1tR0``sZn0SPNk%yoLhOGN}PyBkW=zleJ|lA zvB8h}KmyN28?TBdFlDSNTc%V*&_yMK=}VtG!T;<6#HW*IqsKeHbvcNMghk&#bssXF z%FCO>)7HSNl}_y99imeJq~YRa_>ibV+1()Vd2@~_hOuyM@}Sa;nOX0+?eVm_$`y{f zSji;xi*+{tN8SQXT4ni8INZo>CMUjh4;9hZ@1$0Ye%))H6XBodHN-fqMWv0L{IG zJv1%14|GYvI9GP$@QS_qZ<;0Yg@bMPDgTkqd^vCir~^b{L@y~R9y zdkqmMkvx%}M(Mum@1%3nJN5kHfu3}Rp6Fu}GX|DammB+HEw>Zjoo17uY7mE;x*f(|cnbyx4feP0#l2n39OFJ7>TT{R8OV#@qPY zgXDoq3a$!w;UubGSH1}MuCd=aC8}OGxP!jCngkW!pv!X^<%ps27HfrMxeetO`e#R7 zedZZjE4LX;Cq?{kewKL3ppc0lE^DTjK?r`nu-jH(K=;4KRJw=^!^bK&b-$W2cw~Gc zY6_{?pnodqb`KH14fVJ}u9W~kxqi!VY-@C)1Mo9XU#)beX1uwBz&2qb(FlIkJ5Rwtz;b``p|M$0OEp zpc_1tsIAtP9Tv*pUHK!;8`2cT;c~tkxv;ii3U6)AEo}X<&mOAAX(nle_e-hWu{Xkn zOg|`XEw(DO=iS)b=A_Q!L5Eww;8J=jGv}z%3DFh!skSjARqtm!ylX(t4zYf|)s;L& zaTuoM8H{y|L>E^38Ow38gUNnLki*6git|VOzGk$PpB_x-R1)gBahesMXv5Pc+Ra)d z&J8KT(V2p)HtB+yw9|YtSi}-!^oDwEw|o_@*YB$-myye2Y+%GN9OQyheA!WYmX{n0 z(&nhc1oMlY&dI8b@yUc97*?M?yl>=^-CJS^s zt=yzPV?l*p?Wu2?&Nmge5>g43LiUfh-v1UU5y3~?^|2<-Kjo=5wqs;uWFeuDOi0Tm zGJuy6Nlge)Y6YJSJx~QF2#&Ofq0GxjVH2u99!6j!#Z`Cm%eB_}7p#=U2c6S(NJg)c046+oc(?ywma~eqo%879C3!CP4L8aYCGW#Ze1fV);TZ&iXkQ_HmIy zx4o4esB)Lr>!QVl&}KKsi(?E#2D%&eqUzH~n%ay_R*WgDva13&&|r1vIckDgKZxFP zw`(KR@Un2=bPSeX? zS9Isp#dM}Y04@=U-A>Q;Z@L^C86XKH|FxjP;xzzmCRU-|2yMShI~p=Dx-t zfqK8&SU?40S<9E1=O$O7Bh^jAqn>LWvIQePI_;YMGKv4BQ*pVI-jU%vNe~?*x~~O~ zW|?4~UnUBM#b4I4W|7>_wPq&yUVC^SG(2@Xpna|@JuUahiL>8F$GD4$nPM7#2mCYz zm@xeJTCRKaP}cSPSd*x)87Co_lmijMFcRkqUc<7l8FQm2k8M-}(BVvAM)Te24{q&+ z*I7)>)_bTGXtD)_NjC$5)WPo4OHon+xpk;^5aB;&%dzMi*@_?MKj_SAM+FL7r6rBt zT$aLKhI6%zJpB;?C(wJqlv=hbhu)Wv>JKbR%iONmNa_060?Rf}6kdm;=>QdO*&@~I zZ$LRJE-`hh+bBn}u)wU0YtkQv}4Q%Wa-LKJGIR?!p9eQKL@9*kMYyQ!6lH-n9vS+?+iNYv^a966= zYebR`7q~1}NZHv+X=zQhe#8i4UXMBFTT3mgXO6dsv1rSR{~pq`xv+FQv{@AV&iO?u^{xJ0Dr1%m*@Oyy2c@_ z%>)p}+H;EYIIY)TuILorrxx`!$;m`WTkx_PyE|CR5Cw0@s023NeiN5iX;!{t>M+!u z<0mPif2hP)Gp`y}!b;xvNtMz%Onr~0&vZnnKh*6G2B5_8v4p!xytPoH1HCFRi6?BU z-}ctp;CrH|Qn*hCPL}LC`SO%h2m?gPTRUn(s8@KHUP5^|uv21|f`-)A3~7<4Ehim- zFas15EkRs#lj&?Mz*OEj=GtQBQDKbat@oKx&=Da$gD~~o-0S+*Zg>4NzT8+b^3@@t z8m(%njY4O8U9_IOa~|_v>FT%B##eJI@IMMdQu4TEI(tiJc)aF}6_Bc9z%C09(@B*0tQBo)lnyX1JQ?L}nYdDxZO1L%5k8zZRM zd3Pv%xH8^xVw52Eoz@tt-{wy6e5Z@12G27Ata1$bq%Gl~sRG-b;EgAxa<hHdH!mqr>}M+H`3Bte&5pH_Mx1=cA+Y;ZRCjP z;o)j~eDW&9;3bt}F%c`sn6{J1+#Rw7Ka&8|R=Bn5<%5ZpJtOHw!)y^ZDnynHQ zCihO%rxy`ps+2^*^S#{?y&4YXw@~H=^JJ`g&$20>KOLL!BjIsUOTZ@39TaOWPIp&e zqLZsvcy&cvywj2eKnAgS7OhCVOZKd9SN6>?N z<-(+Z+r4fAE;(bHVXCuvx10EDMr7_;E?6B(Yg?W8?q$$&Ld=I}h0E%l#$^FeN(P~> z=)57~fRBvEoD~FY#Q4#pcNS03n0IwGlOX4kYNe-U%Us4enSx|*24pg_1yeOwhs#|U z?E>8BVtTUjMtry$mmHxS8%7wBMAuf_)RVMPjly2*?1EhuJUDsG#w-`Jsf?~;-2-UZ z9VQ!4jSa{f76Xj@^ABG$Hbf9{08Xk!3TT#8K6_sHKjO|DZRqYcWY*9eg0G=3Tlp0b zl8gpTgmRm_|9)@7CY-<+X{|JS?id#H;;;JnH-z{tN^y8WHp(G3u^SQ_^7? z>+ScFV&T(4=3_wW&86Ew4gZ}zEddGjNQT&V z8`;l?r6%n6vJ@DD3JVicNAH7L}*e_d#y-W1MQeWQ1L()kL!8lIR(??6hNm zO!NM$AA+;4CU8hcc8+5DBNs&*?P#2eg(4L1M>nC%tu)j^4EA7%RgrZmA*l;fEiW@U z1b8;~3FGjOd1zC(u;%l@mfjlSI20yodLVB5M>YE0TJgx91UIPlwjI*-2*|wFF68X} z9&P+)*H-y)$Fi}NN*1vzTTkjw=tc}0rX2icCNIxSte2BlY^~yZXs(e1TukZ6PKMp? za(G?lrduA`u(IHyo*OHAp*GIwdDcSsiSNqG(=T(6z5I|7dYJsC89{uf^AW)~Kq&7n znyVWNissnAV*m6hZ_*Ni?_1}g)I!~o?@k|pO|Xpp2liL>4LbN+1!a>!Kw z1!irP!WYUvvH_ATtN7p{n!Lknx$8F0uSfnlGsP1=|QP_B30bt_dYM zx@Rmj91ry@LLQi^2?(f&h@AxJ#Ir2NG5ie7K+Z)Y`c6vblKEf?TB&SRZ0dFm{E8~H z07J%L)C zy&k^|AIppyrYBEw;7#4LMxd3uYwcP|*AR|`Loi3IS+r``4;VD=WkVe@DL^&sDeBXVLeU|U-AX%Uaw~k3IHx;5jLtj5!r;ugXjUVU+I7xBb3G&-~crE0E+MR;O|7u_Amt8{39> zP?etd!ZF02-+w2@xj6ih?X6r>{X#Rl=xA0X{{BQS zxGcQ2km@e*36=AG6FkE2pllXqzZ^Js*FO}#T~+>Ua3GXZJtg~%UCXXPC_rbY)jj>D z_gqj>MT6SzT?zH22>}?XI*jw#7WeY;#KkkGU}~#RS0?bcDjTz6WU;t}e!u0n(3?G0 zx@LPEzc^7cwA#WaFu7dbXa;7j-S7(MYtdiTZp!HG4)?{x_<-$88)<*+AGF!s&UgCfhygv9DtUUXjk>`QV2bY5K&8;(M_V`V!J} zCx0DoDMM=lpxX@1B<(^4eYusBnA%DaH8(@4>6^I@lv{iggFt-tY*#-j;Q?`-1n48X z9pQuodaEoUx)&9go+4ngGR=au=$Hx<&DrqO$cidY-wh=M0G=e2UQUydx?mn_!6f8C5bu#(W>XHL> zPdTaU)wdnii9?bV-c@wJgHy5&lKU)2O zCC^hcKkC=F@V73@*;#jO*Y}Nn7;?!C&od3%LM`;@&HYZfjt~O< zW(_Z`P+O3E+0M^G(iMpy${`cyG$3Ls`h}QuA#484T0omU8zSfx8sDun@tt_KAj#@S zQJvyS$eTOE-Eo4NMd@spUF{+MRH8VO_!t-8GFO&ix`&5|{CbDDTjI#jChL_mz?mzUSN zx*{CULeOpfIo+PlQbj2yv&ThU!#l?UXfL$lCnTm`Dp(@fTM(ME7PgC?)9JS$~7i z=%N)@YdN&Styeud^n>~jAM6R?LxG2ayuo6!5bZn$T zyFlF+0*-!poIX&YQ(5Lgr&gKld%uRvA4%p7e%6HYE-MxEd=QL%3nmOs*P$GX4Q(Ip z7p7@`zK^{7&-;R$&C^u75(*o6=Ce{oa)*XUgZbY>YJG!4lzl21{PTYdY^7iP)5t2W zdJ~47r6>9h7cH>uR=mou5QT!7E&N-4FsEbdh5RX5isr)%p5aJfd;j6xR(Api*}>u4 zlv@?v04@_4o8c0ZTsoWd=53ov*2?nmELE=0*AhU^zklI^;R3JjVHwQw=t!$w4ZVuU9=;@nPjgnrSD*{vboaL zXW@uwFf~+=_<-~LbnX-(5QZsqVXYH)sx?UcO&27);WwQ6N@qoR{!xR1eATVCj{y;a zd!vyL!Y_V&e&C*AJt@V8&X!7*n$`DJIfB!U+Q&qfN{abS>vDsl*9qU>;Jiaav%F%D z_?p4*Ur}9&Ng}jMxSk>MIn=Rs)u5AaQy3GcN*OGjEF*S#<`QC=AfrJ@L**P@Ehe!h z1vO;$-uN~w<1Qi%7o`h%2s&tt6MIv<Ot)B!{6}ozoL#?&%B? zKY?=iEkB*?vRF1U2?XFigY>?1U{mc(r-+!Q*GKW^hG$r;wcJB2^&*^`Q|Co;k^}o~ zrVa{qx1IGJ{^wXRH_sz^$UZD<5o@jvePCk&lToxD-T0cZrfE5nZsm1AYujG7QN2*8 zTQd(~uWSCk(XgU@dN(`%qku@A=A7lZfAS0k94UTCH})r4qJ0Cj8;ud}-L*aXu60BR z-g>3r7NsX$XIbj!rW(@^T)~@L?h-KMwrVA#ZJK56G(-l5O3c&-6tV-+2jW1x(tPe5 zs-VF6Bh4ONOA+nz{+d`fz2k`(>9mSl??*4OB56lIs@g^#0|64J;zEwJEmA_*BB~ie zqfQ7|?dT3tY>jrm1dJxPo)j1^(dsZy5hj3(|E#xXis*$x3d{BiygL`vaLe4BHQkgQu?>&FW^W1xBp=nHnygd;3f)-d1o#kn?l8+ zU7y0rCl@$%vZ5`G`ie4Ttg-%@HA{Mx>Vz$(xl@1|LLYNix5a!A4(P1n;89u?+`z@A z21*?^c^pw z(MqCh9qf3?`B!JAp$n>BTuetozpwy*;h!e9vi;q@h+bzX2AL?d73b5wbx!$Y$-=)zJ`ZyBBpBc|O}wOggJb_h&%cR_M9RLiH>RV}Xo>MUiqXaz1= zFKgsn$h%d!kf9$u$kv}lO>+T}2X5NN>srQ52QUlOVl<$d`Gu_;N2~qqun5cd-Wj{nv8$WPuICG20?X|!gn(nmCXlfg* zSSI92!=p8z=wB=M1TfzkO%kPJ+&E>a#q!bi4Xu4w+TbqvLB|+3<6q%@t!H$+7)Z^& zGmF&WYKnKZ`XnKW3Y@ZdM)oCL(@S(zL%j~gJ2^26TQ!U{)KRjS|3|fElvl_+Th>9# z!08_dDkk>IxMQF{BUD5(eUUsuYz$ky*;f{mie0~|WgkO!-&y=g5pwK#87<3a-E916 zhvCQvx|Qr=J?l2^u5IAyWWGvM)W>%#bMFP|-VzP64?-pw6AK7MhYK?^>BTpyCmlLy z8xbVjZ@zz&f*aHEuA;5Eax6HQbq`!?g1eZs zM4W2TKY{8heYXR;bG=3L)R-hCQ=~LwBtJF)ZZDNI>6p@coSM(JY<7UYNov zO)y{(ng~wu>Q&@M@i^T#iHkMZ=eVM-c8p_wLwIU6wT!1>^*1lenuR(qO>AO+0yc9i z;rspJO&z-k*FbEI3)5qt&?^DCbJDB}&U>rV=W(LhqYIVE=B)%4K;X zw0w0lmch@*f%_LiSzUp1 zXPU>n^Zu&P^0U=g!(GRk3(w8!os+3e$67=8>F4D>3xk1YLUu@AhlJT@Uee$)m3Xn` zEOLYKVnZ{ge4$N`5toxKea9t(=*%Uk$YGpQ`M}q^_0o^Ky~Ei7Io&E4@lMpCY5gQO zJZfH~y!tR0$$c^hGQ&XQ4%mDEdSNoo3q|uIWhc?GwhySk|8`9E$OXzI(NJtfD)iF# zg2H^Gj8Zi3aap0j4cHU^z3Er)a4bzVQBnuiqXi*vv<=*Y^dZR$Qxk0gK@HWnG;+rI zba20q(0FBi0xI6N>JUD(4b3WnQoVi6I?Vx#-!GB#UKaLX9}pOsR%s_er+BruvOn zEJ9V+M{XF_*;xBk;b0+$Bg zdjgH$D~?alhZD1OF0NY;T(e^nT~%G%i=H(h*k0IpJ(XqLQ}>1U;*j*qXjPgr?UK4h zTfEX#=Dm4>>!;Pb;R4?D3lHafQ^GRCt+25~!)AEesbwLbO_cVPS3>GWmd_>WEQNPX zSTV!&Qr_cIjLHpTubuax3u5lWZyUt`NmguTqt@Dc(S!Vjc-fC;)y$5{HAg@Cw%1<2 zJK-kHq>lK}{@~Y$VLo=6Zk`t6HuHdE*&u;-(*2$!MBL)*MQM!KqNkO;!!QP;$K?%_ z&telN&i(eMt4zaXo7;ZpeVjf{ybrN5RyebEXnDP{EQ}T1_|*sbvqUFL-lsAG@(Jse zrSY~svUy%Kbf_9l!{NLXYFGY1jM}3>_dS9V1>(LWs-ZN?+~bL6;X!i0AYu`i{xxHj zrNgf-v%?r>$rg~g#%7-oxh_N;-Is}8VH8-HrnMc3t&?S!H916_ki@c%+^HK_x~rav zZc#NbGPu_SPpX+0C78D>PkI}2oIW^7P3PcYdzALTHQ`InpzAUxd(p2yI`d`X|du?dXO3 zC9E#JWlZlJKvD^Vp(Lo#JAlJoST(C9>F>(dD5VO*mP)3@0p>}s{%_rJY`S2WTZt#m zio$o2Ayv0R85(FcV(t99q&wD9aXQxn<^G1e&s1r;LxDSkRT#l$z}4R};IvBE17fj% z)dRrRX^~x?hipDY29v5dzeLA6He8rhfZ}dbnsdgg4*FNt%Y794Djj%-X_J8Bh#rPF zYGA@9C-T%6$M4G3)D5d1JYyR*f1VM2vELxFDMiF#0G9)b)&qP}TkC)=D;VNJEDkBj+qe_IEzgDEBQF3xDsU`+7C*wjd z43yYIjSt9UToe}XmwM)P8zji~r4jW=PI*jm#aYjrYExZjGkkgB=?FIswtqAo>NMIm z9E$v9qOV}BdM;&ut%|SE?gbbb1EBIeYv<-B1)_0>O#`nuRv3#Mz$OT~1N-mBMJrJ} z^AM?n!K}e1-Nx#OnmX0`HZDANSb-N6UQ=(sJFSx2XEnc>i%@JGEo5c0IYroGx3{1; zaQ1i$2{?PTz!;#&x7vHMlHkMVxe87AH|Wb?zp{Krr-!R+N?|;sLGqj?bBv2}r^$tq zItE12-h#4X-H@V<^lF6!Sy6e}%P#arYA;v*&A3yb)YLT=FWVEH z&1B#2id3r_*72XN<5254z%vtW#JR&%KQ*@G1SsW#L-iPaiLst(J>pBGchug?N3bl z2s}NI!C*ht-)byY>aO(nX);UIT5znC@jy^M?m=n zbN%CrZQ+lZ=n3p=sAAcN5O|VGAUjy6gh`} zoRTog*i1e@SCBVn@KEb&n4rAi#nf1hc=zjq-J+EQt@X&tY{56W_pX#a-e)_Pj3Z{N zu7C{Y$$@^3IUUebkozJ||^NN0T_^vxsvLk{%|B}WafWKe@H z#V0d>*437uJX3`qI9hw0AOEawabNO`%tb&=>8mpJ7mlPMr!^$wri%N%I zb9c?hX6*yk9U3qgCE=$~%_!$#wZi5SBsFbSm8P`jrSA}Jajv=@e{F%!4XlVHU_ALY zJ{Ky^`E&q(sAe7|@qLmeTw)wiiT5e%S{3t9OljF}-Ar$q@gI-6h#H^naeV3YibR(& zK7|$1bzD9(n&Dk`q!VJ@ADbP1AGFuj@#bH@BrByGu%*I1D615o&wAUVdO+A$A|U?p zU(cqE&!5r8gI9!BW`y2_o;=LGdeC`WkHV-YzG)9VzKH}9H4ic|z_;*==^a|Aml))f zu1H_1@np!wK}+mDv$dVTMkRtL+5tbye~af%HXz29=KDR=6Bb=^0Asr1ZU6Fo1d{y4 zB+$UVI&~|3aC^ld+G3%;(0S%X@oEFS-|?x>`_q`#cL~9Vi3`fG9?tpmEPM%=Q}sxF z?P6%F?lI;*X!B{T%=4=uoV@rGE8zxI!WAlgy1b9XD6!!5a}*%%`|^p@_oR_q?aGo5 zSaGZDAj_mq;^SlAg!{O|De$G0^0?P&6Q6tWN63{^RlejO_2y@7fD_xM5e)xuHP$Zd z*{r>`*iG#5K9v>AzU~`6#72EVi7P-+v~eSoWldK40Hh^K&xHpPXll!L80*?1*Y|r%gkDf-~RFhI7^^M(aO>3y|}rb znM1HZwm+NC0XyTyK zuQ&eH)Kqs!Vol-;3n*CPRKjH9K;lBZglQ;|$}yl}ie&`G($7^@2zWQeT;L^+e^=*K>aE?*6O$&Sr`UW4?D903ADgE{MiYs9x~ zzFc|FxumE3)27yzqVn_ZdB9=Y0>_dV*3&BI6W5~RH=h;ueMk4M{S~+9JACVWjtN7w zd|wPZDU{fwyMa$9E|m25S2`4mQU)5edvFdW2Ah?Q+H?On2i%9 z0NY~&C&H6Vf~L1{Vd}Sh9nGR{7!5fJ%R05l zeiG?$e1;9~JfjHa&)FeKE`joIV2J~kI(J(O8k^W^e|Fw;g zzmfDOlOBsRi#hx575zN#W6U@>>a#l4Rj$c@`&4%7=dER9di2HDoEj5VM^ciQTqoOi zClpK0BSo9k@7o68=G≻Zx$-Zr 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 T>Ac7x;Lk%v^?M}>mQVi=2m+jR literal 0 HcmV?d00001 diff --git a/docs/zh-Hans/Tutorials/images/blazor-edit-book-modal.png b/docs/zh-Hans/Tutorials/images/blazor-edit-book-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..e63e796d34b756a5e6b513daca7c34f85e9e3259 GIT binary patch literal 27492 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
2yWqE0(%a<1mT6iNCnCf9Ie!XNFSZ7da2m9rx$t z?cWD2lm@Z0-R1nXm{`J=_8xG&Ag7~93>)U^Tvzt|Yi*<)P>O}=;jr@tj9oqY&xGt& zrnd!je`2$GkrIy44TlEA071-VOS#C)+sUoqVoTMRid!6?w-5dfDk&IxO1Y{AuIFn} ze$)h2&$@(maT5W)m43T$20vC-*gDixt4u*vVnX0niL?ZYTYZ`J(f*+EK4MAu-rn)$ zv&ji07Jl&}us#K+C&<6sB(E1H@~S!=8Z@@*4V# zo?w(vhbqOEVo7GJjql+e&#si>|3Y($Z?H%t1%Ar}wjiazR}d7VCc@%tsgFsq7ytio cA3or`py>SoKJw$o0>c1xWgVp|MVqMq0npMOx&QzG literal 0 HcmV?d00001 From a6414dc37ba8e95382592823ddf01be69934d2ca Mon Sep 17 00:00:00 2001 From: ChangYinShung Date: Fri, 24 Dec 2021 08:44:34 +0800 Subject: [PATCH 37/57] fix : Update AbpUi 's zh-Hant some text translate into zh-Hant --- .../Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json index 5f73fa7ccd..449dd67480 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json @@ -46,8 +46,8 @@ "GoHomePage": "返回首頁", "GoBack": "返回", "Search": "查詢", - "ItemWillBeDeletedMessageWithFormat": "{0} will be deleted!", - "ItemWillBeDeletedMessage": "This item will be deleted!", - "ManageYourAccount": "Manage your account" + "ItemWillBeDeletedMessageWithFormat": "{0} 將被刪除!", + "ItemWillBeDeletedMessage": "此項目將被刪除!", + "ManageYourAccount": "管理個人帳號" } } From 4f4d603bdc687118cd83144d19694b59bc2c7477 Mon Sep 17 00:00:00 2001 From: ChangYinShung Date: Fri, 24 Dec 2021 09:06:28 +0800 Subject: [PATCH 38/57] update zh-Hant for cms-kit --- .../Localization/Resources/zh-Hant.json | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json index 1d87b80110..49584e5af0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/zh-Hant.json @@ -1,7 +1,7 @@ { "culture": "zh-Hant", "texts": { - "AddSubMenuItem": "添加子菜單項", + "AddSubMenuItem": "添加子選單項目", "AreYouSure": "你確定嗎?", "BlogDeletionConfirmationMessage": "部落格 '{0}' 將被刪除. 你確定嗎?", "BlogFeatureNotAvailable": "目前此功能不可使用. 請用 `GlobalFeatureManager` 來啟用它.", @@ -47,15 +47,15 @@ "ExportCSV": "匯出 CSV", "Features": "功能", "GenericDeletionConfirmationMessage": "你確定刪除 '{0}' 嗎?", - "IsActive": "積極的", + "IsActive": "是否啟用", "LastModification": "最後一次修改", "LastModificationTime": "最後修改時間", "LoginToAddComment": "登錄後添加評論", "LoginToRate": "登錄後進行評分", "LoginToReact": "登錄以作出反應", "LoginToReply": "登錄後進行回覆", - "MainMenu": "主菜單", - "MakeMainMenu": "製作主菜單", + "MainMenu": "主選單", + "MakeMainMenu": "製作主選單", "Menu:CMS": "CMS", "Menus": "菜單", "MenuDeletionConfirmationMessage": "菜單“{0}”將被刪除。你確定嗎?", @@ -64,10 +64,10 @@ "MenuItems": "菜單項", "Message": "消息", "MessageDeletionConfirmationMessage": "這條評論將被完全刪除", - "NewBlog": "新博客", - "NewBlogPost": "新博文", - "NewMenu": "新菜單", - "NewMenuItem": "新的根菜單項", + "NewBlog": "新部落格", + "NewBlogPost": "新部落格貼文", + "NewMenu": "新選單", + "NewMenuItem": "新的根選單", "NewPage": "新的一頁", "NewTag": "新標籤", "NoMenuItems": "還沒有菜單項!", @@ -104,9 +104,9 @@ "Permission:MenuManagement.Delete": "刪除", "Permission:MenuManagement.Update": "更新", "Permission:Menus": "Menu Management", - "Permission:Menus.Create": "Create", - "Permission:Menus.Delete": "Delete", - "Permission:Menus.Update": "Update", + "Permission:Menus.Create": "創建", + "Permission:Menus.Delete": "刪除", + "Permission:Menus.Update": "更新", "Permission:PageManagement": "頁面管理", "Permission:PageManagement:Create": "創建", "Permission:PageManagement:Delete": "刪除", @@ -150,7 +150,7 @@ "Update": "更新", "UpdatePreferenceSuccessMessage": "您的 preferences 已經保存", "UpdateYourEmailPreferences": "更新你的郵件preferences", - "UnMakeMainMenu": "取消主菜單", + "UnMakeMainMenu": "取消主選單", "UploadFailedMessage": "上傳失敗", "UserId": "用戶Id", "Username": "用戶名稱", @@ -158,6 +158,7 @@ "YourEmailAddress": "你的郵件地址", "YourFullName": "你的全名", "YourMessage": "你的消息", - "YourReply": "你的回覆" + "YourReply": "你的回覆", + "MarkdownSupported": "支援 Markdown ." } -} \ No newline at end of file +} From 2c5d0ffdca8fd19f77c9976f360203f0455183bc Mon Sep 17 00:00:00 2001 From: Luke Ni Date: Fri, 24 Dec 2021 09:52:25 +0800 Subject: [PATCH 39/57] translate to zh-Hans --- docs/zh-Hans/Tutorials/Part-4.md | 60 +++++++++++++++++--------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/docs/zh-Hans/Tutorials/Part-4.md b/docs/zh-Hans/Tutorials/Part-4.md index 151c7aab90..e570880a22 100644 --- a/docs/zh-Hans/Tutorials/Part-4.md +++ b/docs/zh-Hans/Tutorials/Part-4.md @@ -2,27 +2,10 @@ ````json //[doc-params] { - "UI": ["MVC","NG"], + "UI": ["MVC","Blazor","BlazorServer","NG"], "DB": ["EF","Mongo"] } ```` -{{ -if UI == "MVC" - UI_Text="mvc" -else if UI == "NG" - UI_Text="angular" -else - UI_Text="?" -end -if DB == "EF" - DB_Text="Entity Framework Core" -else if DB == "Mongo" - DB_Text="MongoDB" -else - DB_Text="?" -end -}} - ## 关于本教程 在本系列教程中, 你将构建一个名为 `Acme.BookStore` 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发的: @@ -45,16 +28,32 @@ end ## 下载源码 -本教程根据你的**UI** 和 **Database**偏好有多个版,我们准备了两种可供下载的源码组合: +本教程根据你的**UI** 和 **数据库**偏好有多个版本,我们准备了几种可供下载的源码组合: * [MVC (Razor Pages) UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore) +* [Blazor UI 与 EF Core](https://github.com/abpframework/abp-samples/tree/master/BookStore-Blazor-EfCore) * [Angular UI 与 MongoDB](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) +> 如果你在Windows中遇到 "文件名太长" or "解压错误", 很可能与Windows最大文件路径限制有关. Windows文件路径的最大长度为250字符. 为了解决这个问题,参阅 [在Windows 10中启用长路径](https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later). + +> 如果你遇到与Git相关的长路径错误, 尝试使用下面的命令在Windows中启用长路径. 参阅 https://github.com/msysgit/msysgit/wiki/Git-cannot-create-a-file-or-directory-with-a-long-path +> `git config --system core.longpaths true` + +{{if UI == "MVC" && DB == "EF"}} + +### 视频教程 + +本章也被录制为视频教程 **发布在YouTube**. + +{{end}} + ## 解决方案中的测试项目 这一部分涵盖了 **服务器端** 测试. 解决方案中有多个测试项目: -![bookstore-test-projects-v2](./images/bookstore-test-projects-{{UI_Text}}.png) +![bookstore-test-projects-v2](./images/bookstore-test-projects-mvc.png) + +> 根据你选择的UI和数据库, 测试项目略微有所不同. 例如, 如果选择MongoDB, 那么 `Acme.BookStore.EntityFrameworkCore.Tests` 会变为 `Acme.BookStore.MongoDB.Tests`. 每个项目用于测试相关的应用程序项目.测试项目使用以下库进行测试: @@ -64,11 +63,11 @@ end {{if DB=="EF"}} -> 测试项目配置为使用 **SQLite内存** 作为数据库. 创建一个单独的数据库实例并使用数据种子系统进行初始化种子数据,为每个测试准备一个新的数据库. +> 测试项目配置为使用 **SQLite内存** 作为数据库. 创建一个单独的数据库实例并使用[数据种子系统](../Data-Seeding.md)初始化种子数据,为每个测试准备一个新的数据库. {{else if DB=="Mongo"}} -> **[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)**库用于模拟MongoDB数据库. 创建一个单独的数据库实例并使用数据种子系统进行初始化种子数据,为每个测试准备一个新的数据库. +> **[Mongo2Go](https://github.com/Mongo2Go/Mongo2Go)**库用于模拟MongoDB数据库. 创建一个单独的数据库实例并使用[数据种子系统](../Data-Seeding.md)初始化种子数据,为每个测试准备一个新的数据库. {{end}} @@ -78,12 +77,15 @@ end ## 测试 BookAppService -在 `Acme.BookStore.Application.Tests` 项目中创建一个名叫 `BookAppService_Tests` 的测试类: +在 `Acme.BookStore.Application.Tests` 项目的 `Books` 命名空间(文件夹)中创建一个名叫 `BookAppService_Tests` 的测试类: ````csharp +using System; +using System.Linq; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Application.Dtos; +using Volo.Abp.Validation; using Xunit; namespace Acme.BookStore.Books @@ -129,7 +131,7 @@ public async Task Should_Create_A_Valid_Book() { Name = "New test book 42", Price = 10, - PublishDate = System.DateTime.Now, + PublishDate = DateTime.Now, Type = BookType.ScienceFiction } ); @@ -201,7 +203,7 @@ namespace Acme.BookStore.Books result.TotalCount.ShouldBeGreaterThan(0); result.Items.ShouldContain(b => b.Name == "1984"); } - + [Fact] public async Task Should_Create_A_Valid_Book() { @@ -211,7 +213,7 @@ namespace Acme.BookStore.Books { Name = "New test book 42", Price = 10, - PublishDate = System.DateTime.Now, + PublishDate = DateTime.Now, Type = BookType.ScienceFiction } ); @@ -220,7 +222,7 @@ namespace Acme.BookStore.Books result.Id.ShouldNotBe(Guid.Empty); result.Name.ShouldBe("New test book 42"); } - + [Fact] public async Task Should_Not_Create_A_Book_Without_Name() { @@ -244,7 +246,7 @@ namespace Acme.BookStore.Books } ```` -打开**测试资源管理器**(测试 -> Windows -> 测试资源管理器)并**执行**所有测试: +打开**测试资源管理器**(测试 -> Windows -> 测试资源管理器)并**执行所有**测试: ![bookstore-appservice-tests](./images/bookstore-appservice-tests.png) @@ -252,4 +254,4 @@ namespace Acme.BookStore.Books ## 下一章 -查看本教程的[下一章](Part-5.md). \ No newline at end of file +查看本教程的[下一章](Part-5.md). From dbb02fa744d214854305d958e13823ea618f40bf Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 24 Dec 2021 11:29:33 +0800 Subject: [PATCH 40/57] Update the Console and WPF template. --- .../HelloWorldService.cs | 16 ++++- .../MyProjectNameHostedService.cs | 58 ++++++++++------- .../MyProjectNameModule.cs | 18 ++++-- .../MyCompanyName.MyProjectName/Program.cs | 26 +++----- .../appsettings.json | 2 +- .../MyCompanyName.MyProjectName/App.xaml.cs | 63 ++++++++----------- .../HelloWorldService.cs | 13 +++- 7 files changed, 110 insertions(+), 86 deletions(-) diff --git a/templates/console/src/MyCompanyName.MyProjectName/HelloWorldService.cs b/templates/console/src/MyCompanyName.MyProjectName/HelloWorldService.cs index 7ddd618c3e..7c095b85ed 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/HelloWorldService.cs +++ b/templates/console/src/MyCompanyName.MyProjectName/HelloWorldService.cs @@ -1,12 +1,22 @@ -using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.DependencyInjection; namespace MyCompanyName.MyProjectName; public class HelloWorldService : ITransientDependency { - public void SayHello() + public ILogger Logger { get; set; } + + public HelloWorldService() + { + Logger = NullLogger.Instance; + } + + public Task SayHelloAsync() { - Console.WriteLine("\tHello World!"); + Logger.LogInformation("Hello World!"); + return Task.CompletedTask; } } diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs b/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs index 822844e10e..318e5a5508 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs +++ b/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs @@ -1,40 +1,56 @@ -using System; -using System.Threading; +using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Extensions.Hosting; +using Serilog.Extensions.Logging; using Volo.Abp; namespace MyCompanyName.MyProjectName; public class MyProjectNameHostedService : IHostedService { - private readonly IAbpApplicationWithExternalServiceProvider _application; - private readonly IServiceProvider _serviceProvider; - private readonly HelloWorldService _helloWorldService; - - public MyProjectNameHostedService( - IAbpApplicationWithExternalServiceProvider application, - IServiceProvider serviceProvider, - HelloWorldService helloWorldService) + private IAbpApplicationWithInternalServiceProvider _abpApplication; + + private readonly IConfiguration _configuration; + private readonly IHostEnvironment _hostEnvironment; + + public MyProjectNameHostedService(IConfiguration configuration, IHostEnvironment hostEnvironment) { - _application = application; - _serviceProvider = serviceProvider; - _helloWorldService = helloWorldService; + _configuration = configuration; + _hostEnvironment = hostEnvironment; } - public Task StartAsync(CancellationToken cancellationToken) + public async Task StartAsync(CancellationToken cancellationToken) { - _application.Initialize(_serviceProvider); + _abpApplication = await AbpApplicationFactory.CreateAsync(options => + { + options.Services.ReplaceConfiguration(_configuration); + options.Services.AddSingleton(_hostEnvironment); + + options.UseAutofac(); - _helloWorldService.SayHello(); + // UseSerilog() + options.Services.AddLogging(); + options.Services.Replace(ServiceDescriptor.Singleton()); + var implementationInstance = new DiagnosticContext(null); + options.Services.AddSingleton(implementationInstance); + options.Services.AddSingleton((IDiagnosticContext) implementationInstance); + }); - return Task.CompletedTask; + await _abpApplication.InitializeAsync(); + + var helloWorldService = _abpApplication.ServiceProvider.GetRequiredService(); + + await helloWorldService.SayHelloAsync(); } - public Task StopAsync(CancellationToken cancellationToken) + public async Task StopAsync(CancellationToken cancellationToken) { - _application.Shutdown(); - - return Task.CompletedTask; + await _abpApplication.ShutdownAsync(); } } diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameModule.cs b/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameModule.cs index 15ff448d74..c7045a62ea 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameModule.cs +++ b/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameModule.cs @@ -1,5 +1,9 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Volo.Abp; using Volo.Abp.Autofac; using Volo.Abp.Modularity; @@ -10,11 +14,15 @@ namespace MyCompanyName.MyProjectName; )] public class MyProjectNameModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) + public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { - var configuration = context.Services.GetConfiguration(); - var hostEnvironment = context.Services.GetSingletonInstance(); + var logger = context.ServiceProvider.GetRequiredService>(); + var configuration = context.ServiceProvider.GetRequiredService(); + logger.LogInformation($"MySettingName => {configuration["MySettingName"]}"); - context.Services.AddHostedService(); + var hostEnvironment = context.ServiceProvider.GetRequiredService(); + logger.LogInformation($"EnvironmentName => {hostEnvironment.EnvironmentName}"); + + return Task.CompletedTask; } } diff --git a/templates/console/src/MyCompanyName.MyProjectName/Program.cs b/templates/console/src/MyCompanyName.MyProjectName/Program.cs index 1ec4de497c..c6317e635d 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/Program.cs +++ b/templates/console/src/MyCompanyName.MyProjectName/Program.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; @@ -10,7 +9,7 @@ namespace MyCompanyName.MyProjectName; public class Program { - public static async Task Main(string[] args) + public async static Task Main(string[] args) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -27,7 +26,14 @@ public class Program try { Log.Information("Starting console host."); - await CreateHostBuilder(args).RunConsoleAsync(); + + await Host.CreateDefaultBuilder(args) + .ConfigureServices(services => + { + services.AddHostedService(); + }) + .RunConsoleAsync(); + return 0; } catch (Exception ex) @@ -39,19 +45,5 @@ public class Program { Log.CloseAndFlush(); } - } - - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .UseAutofac() - .UseSerilog() - .ConfigureAppConfiguration((context, config) => - { - //setup your additional configuration sources - }) - .ConfigureServices((hostContext, services) => - { - services.AddApplication(); - }); } diff --git a/templates/console/src/MyCompanyName.MyProjectName/appsettings.json b/templates/console/src/MyCompanyName.MyProjectName/appsettings.json index 0db3279e44..1bc4c59014 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/appsettings.json +++ b/templates/console/src/MyCompanyName.MyProjectName/appsettings.json @@ -1,3 +1,3 @@ { - + "MySettingName": "MySettingValue" } diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs b/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs index ab80f115c1..46ddd64910 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs +++ b/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs @@ -1,9 +1,12 @@ using System; using System.Windows; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging; using Serilog; using Serilog.Events; +using Serilog.Extensions.Hosting; +using Serilog.Extensions.Logging; using Volo.Abp; namespace MyCompanyName.MyProjectName; @@ -13,35 +16,40 @@ namespace MyCompanyName.MyProjectName; ///
public partial class App : Application { - private readonly IHost _host; - private readonly IAbpApplicationWithExternalServiceProvider _application; + private IAbpApplicationWithInternalServiceProvider _abpApplication; - public App() + protected async override void OnStartup(StartupEventArgs e) { Log.Logger = new LoggerConfiguration() #if DEBUG - .MinimumLevel.Debug() + .MinimumLevel.Debug() #else - .MinimumLevel.Information() + .MinimumLevel.Information() #endif - .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .Enrich.FromLogContext() .WriteTo.Async(c => c.File("Logs/logs.txt")) .CreateLogger(); - _host = CreateHostBuilder(); - _application = _host.Services.GetService(); - } - - protected override async void OnStartup(StartupEventArgs e) - { try { Log.Information("Starting WPF host."); - await _host.StartAsync(); - Initialize(_host.Services); - _host.Services.GetService()?.Show(); + _abpApplication = await AbpApplicationFactory.CreateAsync(options => + { + options.UseAutofac(); + + // UseSerilog() + options.Services.AddLogging(); + options.Services.Replace(ServiceDescriptor.Singleton()); + var implementationInstance = new DiagnosticContext(null); + options.Services.AddSingleton(implementationInstance); + options.Services.AddSingleton((IDiagnosticContext) implementationInstance); + }); + + await _abpApplication.InitializeAsync(); + + _abpApplication.Services.GetRequiredService()?.Show(); } catch (Exception ex) @@ -50,28 +58,9 @@ public partial class App : Application } } - protected override async void OnExit(ExitEventArgs e) + protected async override void OnExit(ExitEventArgs e) { - _application.Shutdown(); - await _host.StopAsync(); - _host.Dispose(); + await _abpApplication.ShutdownAsync(); Log.CloseAndFlush(); } - - private void Initialize(IServiceProvider serviceProvider) - { - _application.Initialize(serviceProvider); - } - - private IHost CreateHostBuilder() - { - return Host - .CreateDefaultBuilder(null) - .UseAutofac() - .UseSerilog() - .ConfigureServices((hostContext, services) => - { - services.AddApplication(); - }).Build(); - } } diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/HelloWorldService.cs b/templates/wpf/src/MyCompanyName.MyProjectName/HelloWorldService.cs index 35127360b8..2c88a265e0 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/HelloWorldService.cs +++ b/templates/wpf/src/MyCompanyName.MyProjectName/HelloWorldService.cs @@ -1,11 +1,20 @@ -using Volo.Abp.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.DependencyInjection; namespace MyCompanyName.MyProjectName; public class HelloWorldService : ITransientDependency { + public ILogger Logger { get; set; } + + public HelloWorldService() + { + Logger = NullLogger.Instance; + } public string SayHello() { - return "\tHello world!"; + Logger.LogInformation("Call SayHello"); + return "Hello world!"; } } From 0c5482c23fe63f6614a82c3a20aacf8be2127651 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 24 Dec 2021 13:06:17 +0800 Subject: [PATCH 41/57] Use `AddSerilog`. --- .../MyCompanyName.MyProjectName.csproj | 1 + .../MyProjectNameHostedService.cs | 12 +----------- .../wpf/src/MyCompanyName.MyProjectName/App.xaml.cs | 12 +----------- .../MyCompanyName.MyProjectName.csproj | 1 + 4 files changed, 4 insertions(+), 22 deletions(-) diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 2ea0513d71..a2041bf970 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -14,6 +14,7 @@ + diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs b/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs index 318e5a5508..756d56571e 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs +++ b/templates/console/src/MyCompanyName.MyProjectName/MyProjectNameHostedService.cs @@ -2,12 +2,8 @@ using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; using Serilog; -using Serilog.Extensions.Hosting; -using Serilog.Extensions.Logging; using Volo.Abp; namespace MyCompanyName.MyProjectName; @@ -33,13 +29,7 @@ public class MyProjectNameHostedService : IHostedService options.Services.AddSingleton(_hostEnvironment); options.UseAutofac(); - - // UseSerilog() - options.Services.AddLogging(); - options.Services.Replace(ServiceDescriptor.Singleton()); - var implementationInstance = new DiagnosticContext(null); - options.Services.AddSingleton(implementationInstance); - options.Services.AddSingleton((IDiagnosticContext) implementationInstance); + options.Services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true)); }); await _abpApplication.InitializeAsync(); diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs b/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs index 46ddd64910..21124d6400 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs +++ b/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs @@ -1,12 +1,8 @@ using System; using System.Windows; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Logging; using Serilog; using Serilog.Events; -using Serilog.Extensions.Hosting; -using Serilog.Extensions.Logging; using Volo.Abp; namespace MyCompanyName.MyProjectName; @@ -38,13 +34,7 @@ public partial class App : Application _abpApplication = await AbpApplicationFactory.CreateAsync(options => { options.UseAutofac(); - - // UseSerilog() - options.Services.AddLogging(); - options.Services.Replace(ServiceDescriptor.Singleton()); - var implementationInstance = new DiagnosticContext(null); - options.Services.AddSingleton(implementationInstance); - options.Services.AddSingleton((IDiagnosticContext) implementationInstance); + options.Services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true)); }); await _abpApplication.InitializeAsync(); diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index afb8fcfb4c..6b5352c3e7 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -15,6 +15,7 @@ + From c78228f3360f2344a9f57990c17246e2474a37d8 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 24 Dec 2021 13:20:51 +0800 Subject: [PATCH 42/57] Add `clean` command to CLI.md https://github.com/abpframework/abp/pull/11016#issuecomment-1000654076 --- docs/en/CLI.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index b8f69b1ee4..62e5f21d57 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -29,6 +29,7 @@ Here, the list of all available commands before explaining their details: * **`help`**: Shows help on the usage of the ABP CLI. * **`new`**: Generates a new solution based on the ABP [startup templates](Startup-Templates/Index.md). * **`update`**: Automatically updates all ABP related NuGet and NPM packages in a solution. +* **`clean`**: Delete all `BIN` and `OBJ` folders in current folder. * **`add-package`**: Adds an ABP package to a project. * **`add-module`**: Adds a [multi-package application module](https://docs.abp.io/en/abp/latest/Modules/Index) to a solution. * **`list-modules`**: Lists names of open-source application modules. @@ -145,6 +146,17 @@ abp update [options] * `--check-all`: Check the new version of each package separately. Default is `false`. * `--version` or `-v`: Specifies the version to use for update. If not specified, latest version is used. +### clean + +Delete all `BIN` and `OBJ` folders in current folder. + +Usage: + +````bash +abp clean +```` + + ### add-package Adds an ABP package to a project by, From bf2b69c0942a92376d95d4e1e77227b704f0e5d7 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 24 Dec 2021 13:34:17 +0800 Subject: [PATCH 43/57] Update CLI.md --- docs/zh-Hans/CLI.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index b310f96b2c..b2f3825c64 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -29,6 +29,7 @@ dotnet tool update -g Volo.Abp.Cli * **`help`**: 展示ABP CLI的用法帮助信息. * **`new`**:生成基于ABP的[启动模板](Startup-Templates/Index.md). * **`update`**:自动更新的ABP解决方案ABP相关的NuGet和NPM包. +* **`clean`**: 删除当前目录下所有的 `BIN` 和 `OBJ` 子目录. * **`add-package`**: 添加ABP包到项目. * **`add-module`**: 添加[应用模块](https://docs.abp.io/en/abp/latest/Modules/Index)到解决方案. * **`generate-proxy`**: 生成客户端代理以使用HTTP API端点. @@ -129,6 +130,16 @@ abp update [options] * `--check-all`: 分别检查每个包的新版本. 默认是 `false`. * `--version` or `-v`: 指定用于升级的版本. 如果没有指定,则使用最新版本. +### clean + +删除当前目录下所有的 `BIN` 和 `OBJ` 子目录. + +用法: + +````bash +abp clean +```` + ### add-package 通过以下方式将ABP包添加到项目中 From 95d16452d5d4486680b37a50a8d59e40e40b4659 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 24 Dec 2021 13:35:39 +0800 Subject: [PATCH 44/57] Update CLI.md --- docs/en/CLI.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index 62e5f21d57..7db562a66e 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -29,7 +29,7 @@ Here, the list of all available commands before explaining their details: * **`help`**: Shows help on the usage of the ABP CLI. * **`new`**: Generates a new solution based on the ABP [startup templates](Startup-Templates/Index.md). * **`update`**: Automatically updates all ABP related NuGet and NPM packages in a solution. -* **`clean`**: Delete all `BIN` and `OBJ` folders in current folder. +* **`clean`**: Deletes all `BIN` and `OBJ` folders in the current folder. * **`add-package`**: Adds an ABP package to a project. * **`add-module`**: Adds a [multi-package application module](https://docs.abp.io/en/abp/latest/Modules/Index) to a solution. * **`list-modules`**: Lists names of open-source application modules. @@ -148,7 +148,7 @@ abp update [options] ### clean -Delete all `BIN` and `OBJ` folders in current folder. +Deletes all `BIN` and `OBJ` folders in the current folder. Usage: From 59284b463ad9483e606618bd53acfaafc7829bc0 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 24 Dec 2021 15:04:26 +0800 Subject: [PATCH 45/57] Use `AsyncHelper` for `ShutdownAsync`. --- .../AspNetCore/Builder/AbpApplicationBuilderExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs index b15167fa1d..8ef3ec8d99 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs @@ -12,6 +12,7 @@ using Volo.Abp.AspNetCore.Security.Claims; using Volo.Abp.AspNetCore.Tracing; using Volo.Abp.AspNetCore.Uow; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Microsoft.AspNetCore.Builder; @@ -29,7 +30,7 @@ public static class AbpApplicationBuilderExtensions applicationLifetime.ApplicationStopping.Register(() => { - application.ShutdownAsync(); + AsyncHelper.RunSync(() => application.ShutdownAsync()); }); applicationLifetime.ApplicationStopped.Register(() => From 732e91d4d610935d8b75a441303782936c5e28a7 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 24 Dec 2021 11:01:30 +0300 Subject: [PATCH 46/57] Created ICsprojFileManager.AddImportAsync method --- .../Abp/Studio/Modifying/CsprojFileManager.cs | 18 ++++++++++++++++++ .../Abp/Studio/Modifying/ICsprojFileManager.cs | 3 +++ 2 files changed, 21 insertions(+) diff --git a/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/CsprojFileManager.cs b/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/CsprojFileManager.cs index fb7ace820e..c37321decf 100644 --- a/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/CsprojFileManager.cs +++ b/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/CsprojFileManager.cs @@ -74,6 +74,24 @@ public class CsprojFileManager : XmlFileManagerBase, ICsprojFileManager, ITransi await SaveXmlDocumentAsync(filePath, document); } + public async Task AddImportAsync(string filePath, string importFilePath) + { + var document = await GetXmlDocumentAsync(filePath); + + var relativeImportFilePath = PathHelper.GetRelativePath(filePath, importFilePath); + + var importNode = document.CreateElement("Import"); + + var projectAttr = document.CreateAttribute("Project"); + projectAttr.Value = relativeImportFilePath; + importNode.Attributes.Append(projectAttr); + + document["Project"].AppendChild(importNode); + document["Project"].AppendChild(document.CreateWhitespace(Environment.NewLine + " ")); + + await SaveXmlDocumentAsync(filePath, document); + } + public async Task ConvertPackageReferenceToProjectReferenceAsync(string filePath, string projectToReference) { var document = await GetXmlDocumentAsync(filePath); diff --git a/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/ICsprojFileManager.cs b/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/ICsprojFileManager.cs index 1fe903e78c..287debad65 100644 --- a/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/ICsprojFileManager.cs +++ b/studio/src/Volo.Abp.Studio.Domain.CommonServices/Volo/Abp/Studio/Modifying/ICsprojFileManager.cs @@ -10,8 +10,11 @@ public interface ICsprojFileManager Task AddPackageReferenceAsync(string filePath, string packageName, string version); + Task AddImportAsync(string filePath, string importFilePath); + Task ConvertPackageReferenceToProjectReferenceAsync(string filePath, string projectToReference); + Task GetTargetFrameworkAsync(string filePath); Task> GetDependencyListAsync(string filePath); From 408db7beb7c8419f6eac3e1a47573de81ab8a3b4 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 24 Dec 2021 11:01:44 +0300 Subject: [PATCH 47/57] Created CommonPropsStep --- .../ModuleInstallingPipelineBuilderBase.cs | 1 + .../ModuleInstalling/Steps/CommonPropsStep.cs | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/Steps/CommonPropsStep.cs diff --git a/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/ModuleInstallingPipelineBuilderBase.cs b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/ModuleInstallingPipelineBuilderBase.cs index e03a67f428..5b3f953e1a 100644 --- a/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/ModuleInstallingPipelineBuilderBase.cs +++ b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/ModuleInstallingPipelineBuilderBase.cs @@ -12,6 +12,7 @@ public abstract class ModuleInstallingPipelineBuilderBase if (context.WithSourceCode) { pipeline.Add(new SourceCodeDownloadStep()); + pipeline.Add(new CommonPropsStep()); if (context.AddToSolutionFile) { diff --git a/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/Steps/CommonPropsStep.cs b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/Steps/CommonPropsStep.cs new file mode 100644 index 0000000000..519cc31c06 --- /dev/null +++ b/studio/src/Volo.Abp.Studio.ModuleInstaller/Volo/Abp/Studio/ModuleInstalling/Steps/CommonPropsStep.cs @@ -0,0 +1,29 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Studio.Packages.Modifying; + +namespace Volo.Abp.Studio.ModuleInstalling.Steps; + +public class CommonPropsStep : ModuleInstallingPipelineStep +{ + public async override Task ExecuteAsync(ModuleInstallingContext context) + { + var moduleFolder = Path.GetDirectoryName(context.TargetModule); + var commonPropsFilePath = Path.Combine(moduleFolder, "common.props"); + + if (!File.Exists(commonPropsFilePath)) + { + return; + } + + var _csprojFileManager = context.ServiceProvider.GetRequiredService(); + + var csProjFiles = Directory.GetFiles(context.GetTargetSourceCodeFolder(), "*.csproj", SearchOption.AllDirectories); + + foreach (var csProjFile in csProjFiles) + { + await _csprojFileManager.AddImportAsync(csProjFile, commonPropsFilePath); + } + } +} From 6337948b44311f7cf99d90084dce1e1cd6893d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E5=86=A0=E9=AD=81?= <51013007+duguankui@users.noreply.github.com> Date: Fri, 24 Dec 2021 16:51:14 +0800 Subject: [PATCH 48/57] Update Distributed-Event-Bus.md --- docs/zh-Hans/Distributed-Event-Bus.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Distributed-Event-Bus.md b/docs/zh-Hans/Distributed-Event-Bus.md index 720560b4be..f16aa0610f 100644 --- a/docs/zh-Hans/Distributed-Event-Bus.md +++ b/docs/zh-Hans/Distributed-Event-Bus.md @@ -45,7 +45,7 @@ namespace AbpDemo public virtual async Task ChangeStockCountAsync(Guid productId, int newCount) { await _distributedEventBus.PublishAsync( - new StockCountChangedEvent + new StockCountChangedEto { ProductId = productId, NewCount = newCount @@ -299,4 +299,4 @@ namespace AbpDemo } ```` -此示例使用AutoMapper的 `AutoMap` 属性配置的映射. 你可以创建一个配置文件类代替. 请参阅AutoMapper文档了解更多选项. \ No newline at end of file +此示例使用AutoMapper的 `AutoMap` 属性配置的映射. 你可以创建一个配置文件类代替. 请参阅AutoMapper文档了解更多选项. From 1da951e819428e609abc02adc6aff88614d235c5 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 24 Dec 2021 17:49:07 +0800 Subject: [PATCH 49/57] Fix HangfireBackgroundWorkerManager --- .../Hangfire/HangfireBackgroundWorkerManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index bf613f6835..272cc3cdcd 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -42,7 +42,7 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire if (worker is AsyncPeriodicBackgroundWorkerBase or PeriodicBackgroundWorkerBase) { - var timer = (AbpTimer) worker.GetType() + var timer = (AbpAsyncTimer) worker.GetType() .GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); period = timer?.Period; } From dd753a856f41c01cae33b0844c9fda1015711ce5 Mon Sep 17 00:00:00 2001 From: Afresh Date: Fri, 24 Dec 2021 23:55:07 +0800 Subject: [PATCH 50/57] IdentityServer Module translations --- docs/zh-Hans/Modules/IdentityServer.md | 174 ++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 1 deletion(-) diff --git a/docs/zh-Hans/Modules/IdentityServer.md b/docs/zh-Hans/Modules/IdentityServer.md index cb82a640d5..d701ee9a24 100644 --- a/docs/zh-Hans/Modules/IdentityServer.md +++ b/docs/zh-Hans/Modules/IdentityServer.md @@ -1 +1,173 @@ -TODO... \ No newline at end of file +# 身份服务器模块 + +身份服务器模块提供了一个 [IdentityServer](https://github.com/IdentityServer/IdentityServer4) (IDS) 的完全集成,该框架提供高级身份验证功能,如单点登录和API访问控制。此模块将客户端、资源以及其他 IDS 相关的对象保存到数据库中。 + +## 如何安装 + +当你使用 ABP 框架 [创建一个新的解决方案](https://abp.io/get-started) 时,此模块将被预安装(作为 NuGet/NPM 包)。你可以继续用其作为包并轻松地获取更新,也可以将其源代码包含在解决方案中(请参阅 `get-source` [CLI](../CLI.md))以开发自定义模块。 + +### 源代码 + +可以 [在此处](https://github.com/abpframework/abp/tree/dev/modules/identityserver) 访问源代码。源代码使用 [MIT](https://choosealicense.com/licenses/mit/) 许可,所以你可以免费使用和自定义它。 + +## 用户界面 + +此模块使用了领域逻辑和数据库集成,但没有提供任何 UI。如果你需要动态添加客户端和资源, 管理 UI 是非常有用的。在这种情况下,你可以自己构建管理 UI,或者考虑购买为此模块提供了管理 UI 的 [ABP 商业版](https://commercial.abp.io/)。 + +## 与其他模块的关系 + +此模块基于 [身份模块](Identity.md) 并且与 [账户模块](Account.md) 有一个 [集成包](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer)。 + +## 选项 + +### AbpIdentityServerBuilderOptions + +`AbpIdentityServerBuilderOptions` 可以在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置。例如: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(builder => + { + //Set options here... + }); +} +```` + +`AbpIdentityServerBuilderOptions` 属性: + +* `UpdateJwtSecurityTokenHandlerDefaultInboundClaimTypeMap` (默认值:true):更新 `JwtSecurityTokenHandler.DefaultInboundClaimTypeMap` 使其与身份服务器声明兼容。 +* `UpdateAbpClaimTypes` (默认值:true):更新 `AbpClaimTypes` 使其与身份服务器声明兼容。 +* `IntegrateToAspNetIdentity` (默认值:true):集成到 ASP.NET Identity. +* `AddDeveloperSigningCredential` (默认值:true):设置 false 以禁止调用 IIdentityServerBuilder 中的 AddDeveloperSigningCredential()。 + +`IIdentityServerBuilder` 可以在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置。例如: + +````csharp +public override void PreConfigureServices(ServiceConfigurationContext context) +{ + PreConfigure(builder => + { + builder.AddSigningCredential(...); + }); +} +```` + +## 内部结构 + +### 领域层 + +#### 聚合 + +##### API 资源 + +需要 API 资源来允许客户端请求访问令牌。 + +* `ApiResource` (聚合根):表示系统中的 API 资源。 + * `ApiSecret` (集合):API 资源的密钥。 + * `ApiScope` (集合):API 资源的作用域。 + * `ApiResourceClaim` (集合):API 资源的声明。 + +##### 客户端 + +客户端表示可以从你的身份服务器请求令牌的应用程序。 + +* `Client` (聚合根):表示一个身份服务器的客户端应用程序。 + * `ClientScope` (集合):客户端的作用域。 + * `ClientSecret` (集合):客户端的密钥。 + * `ClientGrantType` (集合):客户端的授权类型。 + * `ClientCorsOrigin` (集合):客户端的 CORS 源。 + * `ClientRedirectUri` (集合):客户端的重定向 URIs。 + * `ClientPostLogoutRedirectUri` (集合):客户端的登出重定向 URIs。 + * `ClientIdPRestriction` (集合):客户端的提供程序约束。 + * `ClientClaim` (集合):客户端的声明。 + * `ClientProperty` (集合):客户端的自定义属性。 + +##### 持续化授权 + +持续化授权存储了授权码、刷新令牌和用户准许。 + +* `PersistedGrant` (聚合根):表示为身份服务器持续化授权。 + +##### 身份资源 + +身份资源是用户的用户 ID 、名称或邮件地址等数据。 + +* `IdentityResource` (聚合根):表示与身份服务器的身份资源。 + * `IdentityClaim` (集合):身份资源的声明。 + +#### 仓储 + +为此模块定义了一下自定义仓储: + +* `IApiResourceRepository` +* `IClientRepository` +* `IPersistentGrantRepository` +* `IIdentityResourceRepository` + +#### 领域服务 + +此模块不包含任何领域服务,但重写了下面的服务; + +* `AbpProfileService` (当 `AbpIdentityServerBuilderOptions.IntegrateToAspNetIdentity` 为 true 时使用) +* `AbpClaimsService` +* `AbpCorsPolicyService` + +### 设置 + +此模块未定义任何设置。 + +### 应用层 + +#### 应用服务 + +* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 资源管理 UI 的用例。 +* `IdentityServerClaimTypeAppService` (实现 `IIdentityServerClaimTypeAppService`):用于获取声明列表。 +* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 管理资源 UI 的用例。 +* `IdentityResourceAppService` (实现 `IIdentityResourceAppService`):实现了身份资源管理 UI 的用例。 + +### 数据库提供程序 + +#### 公共 + +##### 表/集合 前缀 & 架构 + +所有表/集合都使用 `IdentityServer` 作为默认前缀。如果你需要改变表的前缀或设置一个架构名称(如果你的数据库提供程序支持),请设置 `AbpIdentityServerDbProperties` 类的静态属性。 + +##### 连接字符串 + +此模块使用 `AbpIdentityServer` 作为连接字符串的名称。如果你没有用这个名称定义连接字符串,它将回退到 `Default` 连接字符串。 + +有关详细信息,请参阅 [连接字符串](https://docs.abp.io/en/abp/latest/Connection-Strings) 文档。 + +#### 实体框架核心 + +##### 表 + +* **IdentityServerApiResources** + * IdentityServerApiSecrets + * IdentityServerApiScopes + * IdentityServerApiScopeClaims + * IdentityServerApiClaims +* **IdentityServerClients** + * IdentityServerClientScopes + * IdentityServerClientSecrets + * IdentityServerClientGrantTypes + * IdentityServerClientCorsOrigins + * IdentityServerClientRedirectUris + * IdentityServerClientPostLogoutRedirectUris + * IdentityServerClientIdPRestrictions + * IdentityServerClientClaims + * IdentityServerClientProperties +* **IdentityServerPersistedGrants** +* **IdentityServerIdentityResources** + * IdentityServerIdentityClaims + +#### MongoDB + +##### 集合 + +* **IdentityServerApiResources** +* **IdentityServerClients** +* **IdentityServerPersistedGrants** +* **IdentityServerIdentityResources** \ No newline at end of file From d9a5b86505c194080331e74bdc34d392cfd5be93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 25 Dec 2021 12:30:09 +0300 Subject: [PATCH 51/57] Check multiple configure services calls and rename ManualConfigureServices to SkipConfigureServices. --- .../Volo/Abp/AbpApplicationBase.cs | 20 ++++++++++++++++++- .../Volo/Abp/AbpApplicationCreationOptions.cs | 3 +-- .../Volo/Abp/AbpApplicationFactory.cs | 8 ++++---- .../Volo.Abp.Core/Volo/Abp/IAbpApplication.cs | 7 +++++++ ...pApplicationWithExternalServiceProvider.cs | 7 +------ ...pApplicationWithInternalServiceProvider.cs | 5 ----- 6 files changed, 32 insertions(+), 18 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index c6e86b4af8..2a73b72932 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -24,6 +24,8 @@ public abstract class AbpApplicationBase : IAbpApplication public IReadOnlyList Modules { get; } + private bool _configuredServices; + internal AbpApplicationBase( [NotNull] Type startupModuleType, [NotNull] IServiceCollection services, @@ -48,7 +50,7 @@ public abstract class AbpApplicationBase : IAbpApplication Modules = LoadModules(services, options); - if (!options.ManualConfigureServices) + if (!options.SkipConfigureServices) { ConfigureServices(); } @@ -139,6 +141,8 @@ public abstract class AbpApplicationBase : IAbpApplication //TODO: We can extract a new class for this public virtual async Task ConfigureServicesAsync() { + CheckMultipleConfigureServices(); + var context = new ServiceConfigurationContext(Services); Services.AddSingleton(context); @@ -211,11 +215,23 @@ public abstract class AbpApplicationBase : IAbpApplication abpModule.ServiceConfigurationContext = null; } } + + _configuredServices = true; + } + + private void CheckMultipleConfigureServices() + { + if (_configuredServices) + { + throw new AbpInitializationException("Services have already been configured! If you call ConfigureServicesAsync method, you must have set AbpApplicationCreationOptions.SkipConfigureServices tu true before."); + } } //TODO: We can extract a new class for this public virtual void ConfigureServices() { + CheckMultipleConfigureServices(); + var context = new ServiceConfigurationContext(Services); Services.AddSingleton(context); @@ -288,5 +304,7 @@ public abstract class AbpApplicationBase : IAbpApplication abpModule.ServiceConfigurationContext = null; } } + + _configuredServices = true; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs index 8bf7579843..d18e43275b 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationCreationOptions.cs @@ -19,13 +19,12 @@ public class AbpApplicationCreationOptions [NotNull] public AbpConfigurationBuilderOptions Configuration { get; } - public bool ManualConfigureServices { get; set; } + public bool SkipConfigureServices { get; set; } public AbpApplicationCreationOptions([NotNull] IServiceCollection services) { Services = Check.NotNull(services, nameof(services)); PlugInSources = new PlugInSourceList(); Configuration = new AbpConfigurationBuilderOptions(); - ManualConfigureServices = false; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs index d904c24ca2..50e5e862ca 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs @@ -15,7 +15,7 @@ public static class AbpApplicationFactory var app = Create(typeof(TStartupModule), options => { optionsAction?.Invoke(options); - options.ManualConfigureServices = true; + options.SkipConfigureServices = true; }); await app.ConfigureServicesAsync(); return app; @@ -28,7 +28,7 @@ public static class AbpApplicationFactory var app = new AbpApplicationWithInternalServiceProvider(startupModuleType, options => { optionsAction?.Invoke(options); - options.ManualConfigureServices = true; + options.SkipConfigureServices = true; }); await app.ConfigureServicesAsync(); return app; @@ -42,7 +42,7 @@ public static class AbpApplicationFactory var app = Create(typeof(TStartupModule), services, options => { optionsAction?.Invoke(options); - options.ManualConfigureServices = true; + options.SkipConfigureServices = true; }); await app.ConfigureServicesAsync(); return app; @@ -56,7 +56,7 @@ public static class AbpApplicationFactory var app = new AbpApplicationWithExternalServiceProvider(startupModuleType, services, options => { optionsAction?.Invoke(options); - options.ManualConfigureServices = true; + options.SkipConfigureServices = true; }); await app.ConfigureServicesAsync(); return app; diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs index b51fd7ec37..2fb66b735f 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplication.cs @@ -23,6 +23,13 @@ public interface IAbpApplication : IModuleContainer, IDisposable /// This can not be used before initialize the application. /// IServiceProvider ServiceProvider { get; } + + /// + /// Calls the Pre/Post/ConfigureServicesAsync methods of the modules. + /// If you use this method, you must have set the + /// option to true before. + /// + Task ConfigureServicesAsync(); /// /// Used to gracefully shutdown the application and all modules. diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs index b4363e1161..a17bb146e3 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithExternalServiceProvider.cs @@ -10,12 +10,7 @@ public interface IAbpApplicationWithExternalServiceProvider : IAbpApplication /// Sets the service provider, but not initializes the modules. /// void SetServiceProvider([NotNull] IServiceProvider serviceProvider); - - /// - /// Call the Pre/Post/ConfigureServicesAsync method of the modules. - /// - Task ConfigureServicesAsync(); - + /// /// Sets the service provider and initializes all the modules. /// If was called before, the same diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs index 8a3b4c7ca1..0079608c2e 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/IAbpApplicationWithInternalServiceProvider.cs @@ -11,11 +11,6 @@ public interface IAbpApplicationWithInternalServiceProvider : IAbpApplication /// IServiceProvider CreateServiceProvider(); - /// - /// Call the Pre/Post/ConfigureServicesAsync method of the modules. - /// - Task ConfigureServicesAsync(); - /// /// Creates the service provider and initializes all the modules. /// If method was called before, From f51efa1e226b61d0f259eb19b1333c9b99354e7f Mon Sep 17 00:00:00 2001 From: albert <9526587+ebicoglu@users.noreply.github.com> Date: Sat, 25 Dec 2021 16:35:06 +0300 Subject: [PATCH 52/57] add RC/preview version access to the FAQ --- .../AbpIoLocalization/Commercial/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 7bb8f4d109..9720354d99 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -193,7 +193,7 @@ "WhatHappensWhenLicenseEnds": "What happens when my license period ends?", "WhatHappensWhenLicenseEndsExplanation1": "ABP Commercial license type is perpetual license. After your license expires, you can continue developing your project. And you are not obliged to renew your license. Your license comes with a one-year Updates and Support plan out of the box. To continue to receive new features, performance enhancements, bug fixes, support and continue to use ABP Suite, make sure to renew your plan each year. When your license expires, you will not be able to get more of the following benefits;", "WhatHappensWhenLicenseEndsExplanation2": "You can not create new solutions using the ABP Commercial, but you can continue to develop your existing applications forever.", - "WhatHappensWhenLicenseEndsExplanation3": "You will be able to get updates for the modules and themes within your MAJOR version. For example; if you are using v3.2.0 of a module, you can still get updates for v3.x.x (v3.3.0, v3.5.2... etc.) of that module. But you cannot get updates for the next major version (like v4.x, v5.x)", + "WhatHappensWhenLicenseEndsExplanation3": "You will be able to get updates for the modules and themes within your MAJOR version (except RC or Preview versions). For example; if you are using v3.2.0 of a module, you can still get updates for v3.x.x (v3.3.0, v3.5.2... etc.) of that module. But you cannot get updates for the next major version (like v4.x, v5.x). Let's say, when your license expired, the latest release was v4.4.3 and the latest preview version was v5.0.0-rc.2, you can only access the v4.X.X but you cannot access the v5.X.X.", "WhatHappensWhenLicenseEndsExplanation4": "You can not install new modules and themes added to the ABP Commercial platform after your license ends.", "WhatHappensWhenLicenseEndsExplanation5": "You can not use the ABP Suite.", "WhatHappensWhenLicenseEndsExplanation6": "You can not get the premium support anymore.", From 5dac7b994e6fd5850a7885ff1389fb2444307b29 Mon Sep 17 00:00:00 2001 From: Afresh Date: Sat, 25 Dec 2021 21:51:53 +0800 Subject: [PATCH 53/57] update zh-Hans/IdentityServer.md --- docs/zh-Hans/Modules/IdentityServer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh-Hans/Modules/IdentityServer.md b/docs/zh-Hans/Modules/IdentityServer.md index d701ee9a24..f5950b5069 100644 --- a/docs/zh-Hans/Modules/IdentityServer.md +++ b/docs/zh-Hans/Modules/IdentityServer.md @@ -98,7 +98,7 @@ public override void PreConfigureServices(ServiceConfigurationContext context) #### 仓储 -为此模块定义了一下自定义仓储: +为此模块定义了以下自定义仓储: * `IApiResourceRepository` * `IClientRepository` From 1a72c1ad1128012171c3091691941f66380cdfc3 Mon Sep 17 00:00:00 2001 From: albert <9526587+ebicoglu@users.noreply.github.com> Date: Sat, 25 Dec 2021 21:46:14 +0300 Subject: [PATCH 54/57] Update POST.md --- .../POST.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md index b2d41a5211..edaeaf46db 100644 --- a/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md +++ b/docs/en/Community-Articles/2021-12-13-Integrating-the-Syncfusion-MVC-Components-to-the-ABP-MVC-UI/POST.md @@ -2,7 +2,7 @@ ## Introduction -Hi, in this article we will see how we can integrate the Syncfusion MVC Components into our application. +In this article we will see how we can integrate the Syncfusion MVC Components into our ABP application. ## Source Code @@ -13,7 +13,8 @@ You can find the source code of the application at https://github.com/EngincanV/ * [.NET 6](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) * In this article, we will create a new startup template in v5.0.0-rc.2 and if you follow this article from top to bottom and create a new startup template with me, you need to install the [.NET 6 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) before starting. - + +**NOTE:** ABP v5.X stable version has been released. You can replace v5.0.0-rc.2 with the latest stable version in your steps. Also, you need to update your ABP CLI to the v5.0.0-rc.2, you can use the command below to update your CLI version: @@ -317,4 +318,4 @@ After injecting the Syncfusion style and script into our application, our config In this article, we've explained how to integrate the **Syncfusion Components** into our applications. After following this article, you can use the Syncfusion components in your application. -Thanks for reading the article, I hope you've found it useful :) \ No newline at end of file +Thanks for reading the article, I hope you've found it useful :) From 6efdaca22d977768dcd98d198833e82e9620e42a Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 26 Dec 2021 11:00:48 +0800 Subject: [PATCH 55/57] Break after the values are got from the provider. Resolve #11042 --- .../Volo/Abp/Settings/SettingProvider.cs | 4 ++++ .../Abp/SettingManagement/SettingManager_Basic_Tests.cs | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingProvider.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingProvider.cs index 401a527b1f..bceaed9983 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingProvider.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingProvider.cs @@ -73,6 +73,10 @@ namespace Volo.Abp.Settings } settingDefinitions.RemoveAll(x => notNullValues.Any(v => v.Name == x.Name)); + if (!settingDefinitions.Any()) + { + break; + } } return result.Values.ToList(); diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_Basic_Tests.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_Basic_Tests.cs index 1dafc31570..17b9bc70b2 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_Basic_Tests.cs +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_Basic_Tests.cs @@ -46,6 +46,15 @@ namespace Volo.Abp.SettingManagement settingValues.ShouldContain(sv => sv.Name == "SettingNotSetInStore" && sv.Value == "default-value"); } + [Fact] + public async Task Should_Get_All_By_Names_Base_Store_Values() + { + var settingValues = await _settingProvider.GetAllAsync(new []{ "MySetting1", "MySetting2" }); + settingValues.Count.ShouldBe(2); + settingValues.ShouldContain(sv => sv.Name == "MySetting1" && sv.Value == "42"); + settingValues.ShouldContain(sv => sv.Name == "MySetting2" && sv.Value == "default-store-value"); + } + [Fact] public async Task Should_Set_Global_Value() { From efae4899ce74101a09f5a0a90722bd7ce0dabca4 Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 26 Dec 2021 14:39:21 +0800 Subject: [PATCH 56/57] Add `WebApplicationBuilderExtensions`. --- .../AbpWebAssemblyHostBuilderExtensions.cs | 8 ++--- .../WebApplicationBuilderExtensions.cs | 35 +++++++++++++++++++ .../Volo/Abp/AbpApplicationFactory.cs | 8 ++--- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../DbMigratorHostedService.cs | 17 +++++---- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../ConsoleTestAppHostedService.cs | 15 ++++---- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../Program.cs | 5 +-- .../ConsoleTestAppHostedService.cs | 15 ++++---- 18 files changed, 83 insertions(+), 75 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/WebApplicationBuilderExtensions.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs index 7c4ff4a868..b92bb96f70 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting; public static class AbpWebAssemblyHostBuilderExtensions { - public static async Task AddApplicationAsync( + public async static Task AddApplicationAsync( [NotNull] this WebAssemblyHostBuilder builder, Action options) where TStartupModule : IAbpModule @@ -65,7 +65,7 @@ public static class AbpWebAssemblyHostBuilderExtensions return application; } - public static async Task InitializeAsync( + public async static Task InitializeAsync( [NotNull] this IAbpApplicationWithExternalServiceProvider application, [NotNull] IServiceProvider serviceProvider) { @@ -80,7 +80,7 @@ public static class AbpWebAssemblyHostBuilderExtensions await SetCurrentLanguageAsync(serviceProvider); } - private static async Task InitializeModulesAsync(IServiceProvider serviceProvider) + private async static Task InitializeModulesAsync(IServiceProvider serviceProvider) { foreach (var service in serviceProvider.GetServices()) { @@ -88,7 +88,7 @@ public static class AbpWebAssemblyHostBuilderExtensions } } - private static async Task SetCurrentLanguageAsync(IServiceProvider serviceProvider) + private async static Task SetCurrentLanguageAsync(IServiceProvider serviceProvider) { var configurationClient = serviceProvider.GetRequiredService(); var utilsService = serviceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/WebApplicationBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/WebApplicationBuilderExtensions.cs new file mode 100644 index 0000000000..692825520b --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/WebApplicationBuilderExtensions.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Builder; +using Volo.Abp; +using Volo.Abp.Modularity; + +namespace Microsoft.Extensions.DependencyInjection; + +public static class WebApplicationBuilderExtensions +{ + public async static Task AddApplicationAsync( + [NotNull] this WebApplicationBuilder builder, + [CanBeNull] Action optionsAction = null) + where TStartupModule : IAbpModule + { + return await builder.Services.AddApplicationAsync(options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + optionsAction?.Invoke(options); + }); + } + + public async static Task AddApplicationAsync( + [NotNull] this WebApplicationBuilder builder, + [NotNull] Type startupModuleType, + [CanBeNull] Action optionsAction = null) + { + return await builder.Services.AddApplicationAsync(startupModuleType, options => + { + options.Services.ReplaceConfiguration(builder.Configuration); + optionsAction?.Invoke(options); + }); + } +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs index 50e5e862ca..3d64b39b7c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationFactory.cs @@ -14,8 +14,8 @@ public static class AbpApplicationFactory { var app = Create(typeof(TStartupModule), options => { - optionsAction?.Invoke(options); options.SkipConfigureServices = true; + optionsAction?.Invoke(options); }); await app.ConfigureServicesAsync(); return app; @@ -27,8 +27,8 @@ public static class AbpApplicationFactory { var app = new AbpApplicationWithInternalServiceProvider(startupModuleType, options => { - optionsAction?.Invoke(options); options.SkipConfigureServices = true; + optionsAction?.Invoke(options); }); await app.ConfigureServicesAsync(); return app; @@ -41,8 +41,8 @@ public static class AbpApplicationFactory { var app = Create(typeof(TStartupModule), services, options => { - optionsAction?.Invoke(options); options.SkipConfigureServices = true; + optionsAction?.Invoke(options); }); await app.ConfigureServicesAsync(); return app; @@ -55,8 +55,8 @@ public static class AbpApplicationFactory { var app = new AbpApplicationWithExternalServiceProvider(startupModuleType, services, options => { - optionsAction?.Invoke(options); options.SkipConfigureServices = true; + optionsAction?.Invoke(options); }); await app.ConfigureServicesAsync(); return app; diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs index 838c64e004..d028aeafad 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs index b9aad1a4cd..8cffe96c42 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/DbMigratorHostedService.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/DbMigratorHostedService.cs index ca084c1833..0b31a64ddd 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/DbMigratorHostedService.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/DbMigratorHostedService.cs @@ -22,25 +22,28 @@ public class DbMigratorHostedService : IHostedService public async Task StartAsync(CancellationToken cancellationToken) { - using (var application = AbpApplicationFactory.Create(options => + using (var application = await AbpApplicationFactory.CreateAsync(options => { - options.Services.ReplaceConfiguration(_configuration); - options.UseAutofac(); - options.Services.AddLogging(c => c.AddSerilog()); + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + options.Services.AddLogging(c => c.AddSerilog()); })) { - application.Initialize(); + await application.InitializeAsync(); await application .ServiceProvider .GetRequiredService() .MigrateAsync(); - application.Shutdown(); + await application.ShutdownAsync(); _hostApplicationLifetime.StopApplication(); } } - public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs index 59b85f1a90..b3bb9299ba 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs index 59b85f1a90..b3bb9299ba 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs index aca0769330..2699dc2993 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs index 3cd8f691dc..8c345c70a2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs index 3cd8f691dc..8c345c70a2 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs index 53eab979d4..b756d400f8 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs @@ -18,20 +18,23 @@ public class ConsoleTestAppHostedService : IHostedService public async Task StartAsync(CancellationToken cancellationToken) { - using (var application = AbpApplicationFactory.Create(options => + using (var application = await AbpApplicationFactory.CreateAsync(options => { - options.Services.ReplaceConfiguration(_configuration); - options.UseAutofac(); + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); })) { - application.Initialize(); + await application.InitializeAsync(); var demo = application.ServiceProvider.GetRequiredService(); await demo.RunAsync(); - application.Shutdown(); + await application.ShutdownAsync(); } } - public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs index c1b5c178d5..cff77845f1 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs index 328016c3b0..a315163da3 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs index 5f5b29332b..540e2312e2 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs @@ -34,10 +34,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs index cdeeed1546..2d54ded331 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs @@ -37,10 +37,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs index a8443ddaca..f8d7f828c5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs @@ -37,10 +37,7 @@ public class Program builder.Host.AddAppSettingsSecretsJson() .UseAutofac() .UseSerilog(); - await builder.Services.AddApplicationAsync(options => - { - options.Services.ReplaceConfiguration(builder.Configuration); - }); + await builder.AddApplicationAsync(); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs index 404248dda8..64b17070d6 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs @@ -18,20 +18,23 @@ public class ConsoleTestAppHostedService : IHostedService public async Task StartAsync(CancellationToken cancellationToken) { - using (var application = AbpApplicationFactory.Create(options => + using (var application = await AbpApplicationFactory.CreateAsync(options => { - options.Services.ReplaceConfiguration(_configuration); - options.UseAutofac(); + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); })) { - application.Initialize(); + await application.InitializeAsync(); var demo = application.ServiceProvider.GetRequiredService(); await demo.RunAsync(); - application.Shutdown(); + await application.ShutdownAsync(); } } - public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } } From aea8749aa52c27028e692b6d9036c8986788dd58 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 27 Dec 2021 09:26:06 +0800 Subject: [PATCH 57/57] Update IdentityServer.md --- docs/zh-Hans/Modules/IdentityServer.md | 90 +++++++++++++------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/docs/zh-Hans/Modules/IdentityServer.md b/docs/zh-Hans/Modules/IdentityServer.md index f5950b5069..838cdfe3ed 100644 --- a/docs/zh-Hans/Modules/IdentityServer.md +++ b/docs/zh-Hans/Modules/IdentityServer.md @@ -1,28 +1,28 @@ # 身份服务器模块 -身份服务器模块提供了一个 [IdentityServer](https://github.com/IdentityServer/IdentityServer4) (IDS) 的完全集成,该框架提供高级身份验证功能,如单点登录和API访问控制。此模块将客户端、资源以及其他 IDS 相关的对象保存到数据库中。 +身份服务器模块提供了一个 [IdentityServer](https://github.com/IdentityServer/IdentityServer4) (IDS) 的完全集成,该框架提供高级身份验证功能,如单点登录和API访问控制.此模块将客户端,资源以及其他 IDS 相关的对象保存到数据库中. ## 如何安装 -当你使用 ABP 框架 [创建一个新的解决方案](https://abp.io/get-started) 时,此模块将被预安装(作为 NuGet/NPM 包)。你可以继续用其作为包并轻松地获取更新,也可以将其源代码包含在解决方案中(请参阅 `get-source` [CLI](../CLI.md))以开发自定义模块。 +当你使用 ABP 框架 [创建一个新的解决方案](https://abp.io/get-started) 时,此模块将被预安装(作为 NuGet/NPM 包).你可以继续用其作为包并轻松地获取更新,也可以将其源代码包含在解决方案中(请参阅 `get-source` [CLI](../CLI.md))以开发自定义模块. ### 源代码 -可以 [在此处](https://github.com/abpframework/abp/tree/dev/modules/identityserver) 访问源代码。源代码使用 [MIT](https://choosealicense.com/licenses/mit/) 许可,所以你可以免费使用和自定义它。 +可以 [在此处](https://github.com/abpframework/abp/tree/dev/modules/identityserver) 访问源代码.源代码使用 [MIT](https://choosealicense.com/licenses/mit/) 许可,所以你可以免费使用和自定义它. ## 用户界面 -此模块使用了领域逻辑和数据库集成,但没有提供任何 UI。如果你需要动态添加客户端和资源, 管理 UI 是非常有用的。在这种情况下,你可以自己构建管理 UI,或者考虑购买为此模块提供了管理 UI 的 [ABP 商业版](https://commercial.abp.io/)。 +此模块使用了领域逻辑和数据库集成,但没有提供任何 UI.如果你需要动态添加客户端和资源, 管理 UI 是非常有用的.在这种情况下,你可以自己构建管理 UI,或者考虑购买为此模块提供了管理 UI 的 [ABP 商业版](https://commercial.abp.io/). ## 与其他模块的关系 -此模块基于 [身份模块](Identity.md) 并且与 [账户模块](Account.md) 有一个 [集成包](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer)。 +此模块基于 [身份模块](Identity.md) 并且[账户模块](Account.md) 有一个 [集成包](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer). ## 选项 ### AbpIdentityServerBuilderOptions -`AbpIdentityServerBuilderOptions` 可以在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置。例如: +`AbpIdentityServerBuilderOptions` 在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置.例如: ````csharp public override void PreConfigureServices(ServiceConfigurationContext context) @@ -34,14 +34,14 @@ public override void PreConfigureServices(ServiceConfigurationContext context) } ```` -`AbpIdentityServerBuilderOptions` 属性: +`AbpIdentityServerBuilderOptions` 属性: -* `UpdateJwtSecurityTokenHandlerDefaultInboundClaimTypeMap` (默认值:true):更新 `JwtSecurityTokenHandler.DefaultInboundClaimTypeMap` 使其与身份服务器声明兼容。 -* `UpdateAbpClaimTypes` (默认值:true):更新 `AbpClaimTypes` 使其与身份服务器声明兼容。 -* `IntegrateToAspNetIdentity` (默认值:true):集成到 ASP.NET Identity. -* `AddDeveloperSigningCredential` (默认值:true):设置 false 以禁止调用 IIdentityServerBuilder 中的 AddDeveloperSigningCredential()。 +* `UpdateJwtSecurityTokenHandlerDefaultInboundClaimTypeMap` (默认值:true):更新 `JwtSecurityTokenHandler.DefaultInboundClaimTypeMap` 使其与身份服务器声明兼容. +* `UpdateAbpClaimTypes` (默认值:true):更新 `AbpClaimTypes` 与身份服务器声明兼容. +* `IntegrateToAspNetIdentity` (默认值:true):集成到 ASP.NET Identity. +* `AddDeveloperSigningCredential` (默认值:true):设置为 false 禁止调用 IIdentityServerBuilder 中的 `AddDeveloperSigningCredential()`. -`IIdentityServerBuilder` 可以在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置。例如: +`IIdentityServerBuilder` 可以在你的身份服务器 [模块](https://docs.abp.io/en/abp/latest/Module-Development-Basics) 中的 `PreConfigureServices` 方法中配置.例如: ````csharp public override void PreConfigureServices(ServiceConfigurationContext context) @@ -61,44 +61,44 @@ public override void PreConfigureServices(ServiceConfigurationContext context) ##### API 资源 -需要 API 资源来允许客户端请求访问令牌。 +需要 API 资源来允许客户端请求访问令牌. -* `ApiResource` (聚合根):表示系统中的 API 资源。 - * `ApiSecret` (集合):API 资源的密钥。 - * `ApiScope` (集合):API 资源的作用域。 - * `ApiResourceClaim` (集合):API 资源的声明。 +* `ApiResource` (聚合根):表示系统中的 API 资源. + * `ApiSecret` (集合):API 资源的密钥. + * `ApiScope` (集合):API 资源的作用域. + * `ApiResourceClaim` (集合):API 资源的声明. ##### 客户端 -客户端表示可以从你的身份服务器请求令牌的应用程序。 +客户端表示可以从你的身份服务器请求令牌的应用程序. -* `Client` (聚合根):表示一个身份服务器的客户端应用程序。 - * `ClientScope` (集合):客户端的作用域。 - * `ClientSecret` (集合):客户端的密钥。 - * `ClientGrantType` (集合):客户端的授权类型。 - * `ClientCorsOrigin` (集合):客户端的 CORS 源。 - * `ClientRedirectUri` (集合):客户端的重定向 URIs。 - * `ClientPostLogoutRedirectUri` (集合):客户端的登出重定向 URIs。 - * `ClientIdPRestriction` (集合):客户端的提供程序约束。 - * `ClientClaim` (集合):客户端的声明。 - * `ClientProperty` (集合):客户端的自定义属性。 +* `Client` (聚合根):表示一个身份服务器的客户端应用程序. + * `ClientScope` (集合):客户端的作用域. + * `ClientSecret` (集合):客户端的密钥. + * `ClientGrantType` (集合):客户端的授权类型. + * `ClientCorsOrigin` (集合):客户端的 CORS 源. + * `ClientRedirectUri` (集合):客户端的重定向 URIs. + * `ClientPostLogoutRedirectUri` (集合):客户端的登出重定向 URIs. + * `ClientIdPRestriction` (集合):客户端的提供程序约束. + * `ClientClaim` (集合):客户端的声明. + * `ClientProperty` (集合):客户端的自定义属性. ##### 持续化授权 -持续化授权存储了授权码、刷新令牌和用户准许。 +持续化授权存储了授权码,刷新令牌和用户准许. -* `PersistedGrant` (聚合根):表示为身份服务器持续化授权。 +* `PersistedGrant` (聚合根):表示为身份服务器持续化授权. ##### 身份资源 -身份资源是用户的用户 ID 、名称或邮件地址等数据。 +身份资源是用户的用户 ID ,名称或邮件地址等数据. -* `IdentityResource` (聚合根):表示与身份服务器的身份资源。 - * `IdentityClaim` (集合):身份资源的声明。 +* `IdentityResource` (聚合根):表示与身份服务器的身份资源. + * `IdentityClaim` (集合):身份资源的声明. #### 仓储 -为此模块定义了以下自定义仓储: +为此模块定义了以下自定义仓储: * `IApiResourceRepository` * `IClientRepository` @@ -109,22 +109,22 @@ public override void PreConfigureServices(ServiceConfigurationContext context) 此模块不包含任何领域服务,但重写了下面的服务; -* `AbpProfileService` (当 `AbpIdentityServerBuilderOptions.IntegrateToAspNetIdentity` 为 true 时使用) +* `AbpProfileService` (当 `AbpIdentityServerBuilderOptions.IntegrateToAspNetIdentity` 为 true 时使用) * `AbpClaimsService` * `AbpCorsPolicyService` ### 设置 -此模块未定义任何设置。 +此模块未定义任何设置. ### 应用层 #### 应用服务 -* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 资源管理 UI 的用例。 -* `IdentityServerClaimTypeAppService` (实现 `IIdentityServerClaimTypeAppService`):用于获取声明列表。 -* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 管理资源 UI 的用例。 -* `IdentityResourceAppService` (实现 `IIdentityResourceAppService`):实现了身份资源管理 UI 的用例。 +* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 资源管理 UI 的用例. +* `IdentityServerClaimTypeAppService` (实现 `IIdentityServerClaimTypeAppService`):用于获取声明列表. +* `ApiResourceAppService` (实现 `IApiResourceAppService`):实现了 API 管理资源 UI 的用例. +* `IdentityResourceAppService` (实现 `IIdentityResourceAppService`):实现了身份资源管理 UI 的用例. ### 数据库提供程序 @@ -132,15 +132,15 @@ public override void PreConfigureServices(ServiceConfigurationContext context) ##### 表/集合 前缀 & 架构 -所有表/集合都使用 `IdentityServer` 作为默认前缀。如果你需要改变表的前缀或设置一个架构名称(如果你的数据库提供程序支持),请设置 `AbpIdentityServerDbProperties` 类的静态属性。 +所有表/集合都使用 `IdentityServer` 作为默认前缀.如果你需要改变表的前缀或设置一个架构名称(如果你的数据库提供程序支持),请设置 `AbpIdentityServerDbProperties` 类的静态属性. ##### 连接字符串 -此模块使用 `AbpIdentityServer` 作为连接字符串的名称。如果你没有用这个名称定义连接字符串,它将回退到 `Default` 连接字符串。 +此模块使用 `AbpIdentityServer` 作为连接字符串的名称.如果你没有用这个名称定义连接字符串,它将回退到 `Default` 连接字符串. -有关详细信息,请参阅 [连接字符串](https://docs.abp.io/en/abp/latest/Connection-Strings) 文档。 +有关详细信息,请参阅 [连接字符串](https://docs.abp.io/en/abp/latest/Connection-Strings) 文档. -#### 实体框架核心 +#### EF Core ##### 表 @@ -170,4 +170,4 @@ public override void PreConfigureServices(ServiceConfigurationContext context) * **IdentityServerApiResources** * **IdentityServerClients** * **IdentityServerPersistedGrants** -* **IdentityServerIdentityResources** \ No newline at end of file +* **IdentityServerIdentityResources**