diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml
index 647397ea04..4f28b14a9c 100644
--- a/.github/workflows/auto-pr.yml
+++ b/.github/workflows/auto-pr.yml
@@ -1,13 +1,13 @@
-name: Merge branch dev with prerel-9.0
+name: Merge branch dev with rel-9.0
on:
push:
branches:
- - prerel-9.0
+ - rel-9.0
permissions:
contents: read
jobs:
- merge-dev-with-prerel-9-0:
+ merge-dev-with-rel-9-0:
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
@@ -18,19 +18,19 @@ jobs:
ref: dev
- name: Reset promotion branch
run: |
- git fetch origin prerel-9.0:prerel-9.0
- git reset --hard prerel-9.0
+ git fetch origin rel-9.0:rel-9.0
+ git reset --hard rel-9.0
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
- branch: auto-merge/prerel-9-0/${{github.run_number}}
- title: Merge branch dev with prerel-9.0
- body: This PR generated automatically to merge dev with prerel-9.0. Please review the changed files before merging to prevent any errors that may occur.
+ branch: auto-merge/rel-9-0/${{github.run_number}}
+ title: Merge branch dev with rel-9.0
+ body: This PR generated automatically to merge dev with rel-9.0. Please review the changed files before merging to prevent any errors that may occur.
reviewers: maliming
token: ${{ github.token }}
- name: Merge Pull Request
env:
GH_TOKEN: ${{ secrets.BOT_SECRET }}
run: |
- gh pr review auto-merge/prerel-9-0/${{github.run_number}} --approve
- gh pr merge auto-merge/prerel-9-0/${{github.run_number}} --merge --auto --delete-branch
+ gh pr review auto-merge/rel-9-0/${{github.run_number}} --approve
+ gh pr merge auto-merge/rel-9-0/${{github.run_number}} --merge --auto --delete-branch
\ No newline at end of file
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index 0bfa3e0711..b707786d73 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -51,7 +51,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-dotnet@master
with:
- dotnet-version: 9.0.100-rc.1.24452.12
+ dotnet-version: 9.0.100-rc.2.24474.11
- name: chown
run: |
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 8ee873c851..3dfacb659c 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -6,7 +6,7 @@
-
+
@@ -51,60 +51,60 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -114,7 +114,7 @@
-
+
@@ -155,17 +155,18 @@
-
+
-
+
-
-
-
+
+
+
+
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
index 987757cd89..581d9bf6fc 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
@@ -446,6 +446,7 @@
"PackageDetailPage_InstallingUsingPMCDescription1": "Open the Package Manager Console in Visual Studio (Tools -> Nuget Package Manager -> Package Manager Console) and execute the following command",
"UIOptions": "UI Options",
"Testimonials": "Testimonials",
+ "TestimonialsDescription": "Our clients' feedback is invaluable to us. Discover what they have to say about their experience working with us.",
"CoolestCompaniesUseABPFramework": "Coolest Companies Use ABP Framework",
"Index_Page_Testimonial_1": "ABP Framework is not just a tool but a catalyst that has accelerated my growth as a developer. It has made it possible for me to build new features faster than ever before, reminiscent of the experiences of other users. The unified coding pattern has streamlined my projects, giving me more time to focus on creating rather than troubleshooting.\nI would say the ABP Framework has been the cornerstone of my early professional journey. It has facilitated my transition from an aspiring developer to a confident professional ready to make a mark in the software world. I am looking forward to the exciting projects that await me, knowing that ABP will be there to guide me. It is more than just a product; it's a partner in success.",
"Index_Page_Testimonial_2": "ABP Framework is not only a framework, it is also a guidance for project development/management, because it provides DDD, GenericRepository, DI, Microservice, Modularity trainings. Even if you are not going to use framework itself, you can develop yourself with abp.io/docs which is well and professionally prepared. (OpenIddict, Redis, Quartz etc.)\nBecause many thing pre-built, it shortens project development time significantly. (Such as login page, exception handling, data filtering-seeding, audit logging, localization, auto api controller etc.)\nAs an example from our app, i have used Local Event Bus for stock control. So, I am able to manage order movements by writing stock handler.\nIt is wonderful not to lose time for CreationTime, CreatorId. They are filled automatically.",
@@ -549,7 +550,7 @@
"CommercialLicenses": "Commercial Licenses",
"WhatIsDifferencePaidLicenses": "What is the difference between a personal license and other types of paid licenses?",
"DifferencePaidLicenseExplanation1": "A non-personal paid license is the standard licensing option for enterprises and commercial entities. Licenses are purchased by the company and can be used by anyone within the organization.",
- "DifferencePaidLicenseExplanation2": "Personal License; on the other hand, is a type of license for private individuals/freelancers/independent developers who purchase licenses with their own funds and solely for their own use. The Personal License has some limitations. In this plan, there can only be 1 developer working on the ABP project and no additional developers are allowed to be added later to the project. Downloading the source-code of PRO modules is not allowed in the personal license plan. Also, there is no microservice template and tier (layered) architecture in this plan. Personal License holders can only use the following modules: Account, Audit Logging UI, GDPR, Identity, Language Management, LeptonX PRO, OpenIddict UI and SaaS. Personal License holders cannot use the following modules: Chat, CMS-Kit PRO, File Management, Forms, Payment, Text Template Management, and Twilio SMS. You can access the full module list at abp.io/modules.",
+ "DifferencePaidLicenseExplanation2": "Personal License; on the other hand, is a type of license for private individuals/freelancers/independent developers who purchase licenses with their own funds and solely for their own use. The Personal License has some limitations. In this plan, there can only be 1 developer working on the ABP project and no additional developers are allowed to be added later to the project. Downloading the source-code of PRO modules is not allowed in the personal license plan. There is no microservice template in this plan. There is no tier architecture (Web and HTTP API layers are physically separated) in this plan. Personal License holders can only use the following modules: Account, Audit Logging UI, GDPR, Identity, Language Management, LeptonX PRO, OpenIddict UI and SaaS. Personal License holders cannot use the following modules: Chat, CMS-Kit PRO, File Management, Forms, Payment, Text Template Management, and Twilio SMS. You can access the full module list at abp.io/modules.",
"ReadyToStart": "Ready to start?",
"TransformYourIdeasIntoRealityWithOurProfessionalNETDevelopmentServices": "Transform your ideas into reality with our professional .NET development services.",
"ReadyToUpgrade": "Ready to upgrade?",
@@ -1868,4 +1869,4 @@
"GeneratePriceQuote": "Generate a Price Quote",
"Qa:QuestionPageTitle": "Support"
}
-}
\ No newline at end of file
+}
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/POST.md b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/POST.md
new file mode 100644
index 0000000000..f06648e586
--- /dev/null
+++ b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/POST.md
@@ -0,0 +1,223 @@
+# ABP Platform 9.0 Has Been Released Based on .NET 9.0
+
+
+
+Today, we are happy to release the [ABP](https://abp.io/) version **9.0 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version.
+
+Try this version and provide feedback for a more stable version of ABP v9.0! Thanks to all of you.
+
+## Get Started with the 9.0 RC
+
+You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli).
+
+By default, ABP Studio uses stable versions to create solutions. Therefore, if you want to create a solution with a preview version, first you need to create a solution and then switch your solution to the preview version from the ABP Studio UI:
+
+
+
+## Migration Guide
+
+There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v8.x: [ABP Version 9.0 Migration Guide](https://abp.io/docs/9.0/release-info/migration-guides/abp-9-0)
+
+## What's New with ABP v9.0?
+
+In this section, I will introduce some major features released in this version.
+Here is a brief list of titles explained in the next sections:
+
+* Upgraded to .NET 9.0
+* Introducing the **Extension Property Policy**
+* Allow wildcards for Redirect Allowed URLs
+* Docs Module: Show larger images on the same page
+* Google Cloud Storage BLOB Provider
+* Removed React Native mobile option from free templates
+* Suite: Better naming for multiple navigation properties to the same entity
+* CMS Kit Pro: Feedback feature improvements
+
+### Upgraded to .NET 9.0
+
+We've upgraded ABP to .NET 9.0, so you need to move your solutions to .NET 9.0 if you want to use ABP 9.0. You can check [Microsoft’s Migrate from ASP.NET Core 8.0 to 9.0 documentation](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90), to see how to update an existing ASP.NET Core 8.0 project to ASP.NET Core 9.0.
+
+> **Note:** Since the stable version of .NET 9 hasn't been released yet, we upgraded ABP to .NET v9.0-rc.2. We will update the entire ABP Platform to .NET 9 stable, after Microsoft releases it on November 13-14 with the stable ABP 9.0 release.
+
+### Introducing the Extension Property Policy
+
+ABP provides a module entity extension system, which is a high level extension system that allows you to define new properties for existing entities of the depended modules. This is a powerful way to dynamically add additional properties to entities without modifying the core structure. However, managing these properties across different modules and layers can become complex, especially when different policies or validation rules are required.
+
+**Extension Property Policy** feature allows developers to define custom policies for these properties, such as access control, validation, and data transformation, directly within ABP.
+
+**Example:**
+
+```csharp
+ObjectExtensionManager.Instance.Modules().ConfigureIdentity(identity =>
+{
+ identity.ConfigureUser(user =>
+ {
+ user.AddOrUpdateProperty( //property type: string
+ "SocialSecurityNumber", //property name
+ property =>
+ {
+ //validation rules
+ property.Attributes.Add(new RequiredAttribute());
+ property.Attributes.Add(new StringLengthAttribute(64) {MinimumLength = 4});
+
+ //Global Features
+ property.Policy.GlobalFeatures = new ExtensionPropertyGlobalFeaturePolicyConfiguration()
+ {
+ Features = new[] {"GlobalFeatureName1", "GlobalFeatureName2"},
+ RequiresAll = true
+ };
+
+ //Features
+ property.Policy.Features = new ExtensionPropertyFeaturePolicyConfiguration()
+ {
+ Features = new[] {"FeatureName1", "FeatureName2"},
+ RequiresAll = false
+ };
+
+ //Permissions
+ property.Policy.Permissions = new ExtensionPropertyPermissionPolicyConfiguration()
+ {
+ PermissionNames = new[] {"AbpTenantManagement.Tenants.Update", "AbpTenantManagement.Tenants.Delete"},
+ RequiresAll = true
+ };
+ }
+ );
+ });
+});
+```
+
+### Allow Wildcards for RedirectAllowedURLs
+
+In this version, we made an improvement to the `RedirectAllowedUrls` configuration, which now allows greater flexibility in defining redirect URLs. Previously, developers faced restrictions when configuring URL redirects. Specifically, the `RedirectAllowedUrls` did not support using **wildcards (*)**, limiting how developers could specify which URLs were permissible for redirects.
+
+With the new changes in [#20628](https://github.com/abpframework/abp/pull/20628), the restriction has been relaxed, allowing developers to define redirect URLs that include wildcards. This makes it easier to handle scenarios where a broad range of URLs need to be allowed, without explicitly listing each one.
+
+```json
+{
+ "App": {
+ //...
+ "RedirectAllowedUrls": "http://*.domain,http://*.domain:4567"
+ }
+```
+
+### Docs Module: Show Larger Images
+
+As developers, we rely heavily on clear documentation to understand complex concepts and workflows. Often, an image is worth more than a thousand words, especially when explaining intricate user interfaces, workflows, or code structures. In recognition of this, we recently rolled out an improvement to the Docs Module that enables larger images to be displayed more effectively.
+
+
+
+Before this enhancement, images embedded in documentation were often limited in size, which sometimes made it difficult to see the details in the diagrams, screenshots, or other visual contents. Now, images can be displayed at a larger size, offering better clarity and usability.
+
+> See [https://github.com/abpframework/abp/pull/20557](https://github.com/abpframework/abp/pull/20557) for more information.
+
+### Google Cloud Storage BLOB Provider
+
+ABP provides a BLOB Storing System, which allows you to work with BLOBs. This system is typically used to store file contents in a project and read these file contents when they are needed. Since ABP provides an abstraction to work with BLOBs, it also provides some pre-built storage providers such as [Azure](https://abp.io/docs/latest/framework/infrastructure/blob-storing/azure), [Aws](https://abp.io/docs/latest/framework/infrastructure/blob-storing/aws) and [Aliyun](https://abp.io/docs/latest/framework/infrastructure/blob-storing/aliyun).
+
+In this version, we have introduced a new BLOB Storage Provider for Google Cloud Storage: [`Volo.Abp.BlobStoring.Google`](https://www.nuget.org/packages/Volo.Abp.BlobStoring.Google)
+
+You can [read the documentation](https://abp.io/docs/9.0/framework/infrastructure/blob-storing/google) for configurations and use Google Cloud Storage as your BLOB Storage Provider easily.
+
+### Removed React Native Mobile Option From Free Templates
+
+In this version, we removed the **React Native** mobile option from the open source templates due to maintaining reasons. We updated the related documents and the ABP CLI (both old & new CLI) for this change, and with v9.0, you will not be able to create a free template with react-native as the mobile option.
+
+> **Note:** Pro templates still provide the **React Native** as the mobile option and we will continue supporting it.
+
+If you want to access the open-source React-Native template, you can visit the abp-archive repository from [here](https://github.com/abpframework/abp-archive).
+
+### Suite: Better Naming For Multiple Navigation Properties
+
+Prior to this version, when you defined multiple (same) navigation properties to same entity, then ABP Suite was renaming them with a duplicate number.
+
+As an example,let's assume that you have a book with an author and coauthor, prior to this version ABP Suite was creating a DTO class as below:
+
+```csharp
+public class BookWithNavigationPropertiesDto
+{
+ public BookDto Book { get; set; }
+
+ public AuthorDto Author { get; set; }
+
+ public AuthorDto Author1 { get; set; }
+}
+```
+
+Notice, that since the book entity has two same navigation properties, ABP Suite renamed them with a duplicate number. In this version, ABP Suite will ask you to define a propertyName for the **navigation properties** and you'll be able to specify a meaningful name such as (*CoAuthor*, in this example):
+
+```csharp
+public class BookWithNavigationPropertiesDto
+{
+ public BookDto Book { get; set; }
+
+ public AuthorDto Author { get; set; }
+
+ //used the specified property name
+ public AuthorDto CoAuthor { get; set; }
+}
+```
+
+ABP Suite respects the specified property name for the related navigation property and generates codes regarding that (by removing the *Id* postfix for the related places):
+
+
+
+### CMS Kit Pro: Feedback Feature Improvements
+
+In this version, we revised the [CMS Kit's Feedback Feature](https://abp.io/docs/9.0/modules/cms-kit-pro/page-feedback) and as a result, we made the following improvements:
+
+* A new **auto-handle** setting has been added to the settings page. When this feature is enabled, if feedback is submitted without a user note, the feedback is automatically marked as handled.
+* You can now require users to enter a note when submitting negative feedback. This can be configured in the settings page, ensuring that users provide context when they submit critical feedback.
+* We've added a feedback user ID that is saved in local storage. This allows you to track the number of unique users submitting feedback or determine if the same user is sending new feedback on updated documents.
+
+> For further information about the Page Feedback System, please refer to the [documentation](https://abp.io/docs/9.0/modules/cms-kit-pro/page-feedback).
+
+## Community News
+
+### Join ABP at the .NET Conf 2024!
+
+ABP is excited to sponsor the [14th annual .NET Conf](https://www.dotnetconf.net/)! We've proudly supported the .NET community for years and recognize the importance of this premier virtual event. Mark your calendars for November 12-14, 2024, and join us for 3 incredible days of learning, networking, and fun.
+
+
+
+Also, don't miss out on the co-founder of [Volosoft](https://volosoft.com/) and Lead Developer of [ABP](https://abp.io/), [Halil Ibrahim Kalkan](https://x.com/hibrahimkalkan)'s talk about "Building Modular Monolith Applications with ASP.NET Core and ABP Studio" at 10:00 - 10:30 AM GMT+3 on Thursday, November 14.
+
+### ABP Team Attended the .NETDeveloperDays 2024
+
+We are thrilled to announce that we sponsored the [.NETDevelopersDays 2024](https://developerdays.eu/warsaw/) event. It's one of the premier conferences for .NET developers with **over 1.000 attendees**, **50+ expert speakers**, and **40+ sessions and workshops**.
+
+
+
+Core team members of the ABP Framework, [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan), [İsmail Çağdaş](https://x.com/ismcagdas), [Enis Necipoğlu](https://x.com/EnisNecipoglu), and [Tarık Özdemir](https://x.com/mtozdemir) attended [.NETDevelopersDays 2024](https://developerdays.eu/warsaw/) on October 22-23, 2024 at Warsaw, Poland.
+
+These 2 days with the team were all about chatting and having fun with amazing attendees and speakers. We met with talented and passionate software developers and introduced the [ABP](https://github.com/abpframework/abp) - web application framework built on ASP.NET Core - to them.
+
+Also, we made a raffle and gifted an Xbox Series S to the lucky winner at the event:
+
+
+
+Thanks to everyone who joined the fun and visited at our booth :)
+
+### New ABP Community Articles
+
+There are exciting articles contributed by the ABP community as always. I will highlight some of them here:
+
+* [Alper Ebiçoğlu](https://twitter.com/alperebicoglu) has created **five** new community articles:
+ * [When to Use Cookies, When to Use Local Storage?](https://abp.io/community/articles/when-to-use-cookies-when-to-use-local-storage-uexsjunf)
+ * [.NET 9 Performance Improvements Summary](https://abp.io/community/articles/.net-9-performance-improvements-summary-gmww3gl8)
+ * [ASP.NET Core SignalR New Features — Summary](https://abp.io/community/articles/asp.net-core-signalr-new-features-summary-kcydtdgq)
+ * [Difference Between "Promise" and "Observable" in Angular](https://abp.io/community/articles/difference-between-promise-and-observable-in-angular-bxv97pkc)
+ * [ASP.NET Core Blazor 9.0 New Features Summary 🆕](https://abp.io/community/articles/asp.net-core-blazor-9.0-new-features-summary--x0fovych)
+* [Mohammad AlMohammad AlMahmoud](https://abp.io/community/members/Mohammad97Dev) has created **two** new community articles:
+ * [Implementing Multi-Language Functionality With ABP Framework](https://abp.io/community/articles/implementing-multilanguage-functionality-with-abp-framework-loq7kfx4)
+ * [Configure Quartz.Net in Abp FrameWork](https://abp.io/community/articles/configure-quartz.net-in-abp-framework-3bveq4y1)
+* [.NET Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l) by [Halil İbrahim Kalkan](https://twitter.com/hibrahimkalkan)
+* [PoC of using GrapesJS for ABPs CMS Kit](https://abp.io/community/articles/poc-of-using-grapesjs-for-abps-cms-kit-1rmv4q41) by [Jack Fistelmann](https://abp.io/community/members/jfistelmann)
+* [ABP-Powered Web App with Inertia.js, React, and Vite](https://abp.io/community/articles/abppowered-web-app-with-inertia.js-react-and-vite-j7cccvad) by [Anto Subash](https://antosubash.com/)
+* [Multi-Tenancy Support in Angular Apps with ABP.IO](https://abp.io/community/articles/multitenancy-support-in-angular-apps-with-abp.io-lw9l36c5) by [HeadChannel Team](https://headchannel.co.uk/)
+
+Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/submit) to the ABP Community.
+
+## Conclusion
+
+This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://abp.io/docs/9.0/release-info/road-map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v9.0 RC and provide feedback to help us release a more stable version.
+
+Thanks for being a part of this community!
\ No newline at end of file
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/abp-team-raffle.jpg b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/abp-team-raffle.jpg
new file mode 100644
index 0000000000..1210f13283
Binary files /dev/null and b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/abp-team-raffle.jpg differ
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/cover-image.png b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/cover-image.png
new file mode 100644
index 0000000000..f272a8d463
Binary files /dev/null and b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/cover-image.png differ
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/docs-image-larger.png b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/docs-image-larger.png
new file mode 100644
index 0000000000..95b999560e
Binary files /dev/null and b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/docs-image-larger.png differ
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/dotnet-conf-2024.png b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/dotnet-conf-2024.png
new file mode 100644
index 0000000000..37ddf06eb4
Binary files /dev/null and b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/dotnet-conf-2024.png differ
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/dotnet-developer-days-2024.jpg b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/dotnet-developer-days-2024.jpg
new file mode 100644
index 0000000000..eb9fe26dfd
Binary files /dev/null and b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/dotnet-developer-days-2024.jpg differ
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/studio-switch-to-preview.png b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/studio-switch-to-preview.png
new file mode 100644
index 0000000000..32f6d01edb
Binary files /dev/null and b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/studio-switch-to-preview.png differ
diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/suite-navigation-properties.png b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/suite-navigation-properties.png
new file mode 100644
index 0000000000..4d329ccc7b
Binary files /dev/null and b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/suite-navigation-properties.png differ
diff --git a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md
index 0401c31898..8f45279b3d 100644
--- a/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md
+++ b/docs/en/Community-Articles/2022-11-14-How-to-add-a-custom-grant-type-in-OpenIddict/POST.md
@@ -73,10 +73,10 @@ public class MyTokenExtensionGrant : ITokenExtensionGrant
claimsPrincipal.SetResources(await GetResourcesAsync(context, principal.GetScopes()));
//abp version < 7.3
- await context.HttpContext.RequestServices.GetRequiredService().SetAsync(principal);
+ await context.HttpContext.RequestServices.GetRequiredService().SetAsync(claimsPrincipal);
//For abp version >= 7.3
- await context.HttpContext.RequestServices.GetRequiredService().HandleAsync(context.Request, principal);
+ await context.HttpContext.RequestServices.GetRequiredService().HandleAsync(context.Request, claimsPrincipal);
return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, claimsPrincipal);
}
diff --git a/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md b/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md
index 7d78d476c5..4afe83c7c9 100644
--- a/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md
+++ b/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md
@@ -300,3 +300,7 @@ After making all our changes, we can run the `AspirationalAbp.AppHost` project.
## Conclusion
Combining .NET Aspire with the ABP framework creates a powerful setup for building robust, observable, and feature-rich applications. By integrating Aspire's observability and cloud capabilities with ABP's approach of focusing on your business without repeating yourself, you can develop feature-rich, scalable applications with enhanced monitoring and seamless cloud integration. This guide provides a clear path to set up and configure these technologies, ensuring your applications are well-structured, maintainable, and ready for modern cloud environments.
+
+## See Also
+
+* [.NET Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l)
diff --git a/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/Post.md b/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/Post.md
new file mode 100644
index 0000000000..bac7f69596
--- /dev/null
+++ b/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/Post.md
@@ -0,0 +1,63 @@
+# When to Use Cookies, When to Use Local Storage?
+
+
+
+
+
+## Cookies vs Local Storage
+
+When you want to save client-side data on browsers, you can use `Cookies` or `Local Storage` of the browser. While these methods look similar, they have different behaviors. You need to decide based on the specific use-case, security concerns and the data size being stored. I'll clarify the differences between these methods.
+
+
+
+## When to use Cookies 🍪?
+
+1. **Server Communication (e.g: Authentication Tokens):** Cookies are ideal when you need to send data automatically with HTTP requests to the server, such as authentication tokens (JWTs) or session IDs. Cookies can be configured to be sent only to specific domains or paths, making them useful for session management.
+2. **Cross-Domain Communication:** Cookies can be shared across subdomains, which is useful when working with multiple subdomains under the same parent domain for microservice architecture.
+3. **Expiration Control:** Cookies come with built-in expiration times. You don’t need to manually remove them after a certain period that should expire.
+4. **Security:** Cookies can be marked as `HttpOnly` which makes them accessible **only via the server**, not via JavaScript! Also, when you set a cookie attribute, `Secure` it can be sent only over HTTPS, which forces enhanced security for sensitive data.
+
+
+### Considerations for Cookies
+
+- **Size Limitation:** Cookies are generally limited to around 4KB of data.
+- **Security Risks:** Cookies are susceptible to cross-site scripting (XSS) attacks unless marked `HttpOnly`.
+
+
+---
+
+
+## When to use Local Storage🗄️?
+
+1. **Client-Side Data Storage:** Local storage is ideal for storing large amounts of data (up to 5–10 MB) that doesn’t need to be sent to the server with every request. For example; *user preferences*, *settings*, or *cached data*.
+2. **Persistence:** Data in local storage persists even after the browser is restarted. This behavior makes it useful for long-term storage needs.
+3. **No Automatic Server Transmission:** Local storage data is never automatically sent to the server, which can be a security advantage if you don’t want certain data to be exposed to the server or included in the requests.
+
+
+### Considerations for Local Storage
+
+- **Security Risks:** Local storage is accessible via JavaScript, making it vulnerable to XSS attacks. Sensitive data should not be stored in local storage unless adequately encrypted.
+
+- **No Expiration Mechanism:** Local storage does not have a built-in expiration mechanism. You must manually remove the data when it’s no longer needed.
+
+
+---
+
+
+
+## Summary
+
+### Use Cookies
+
+- For data that needs to be sent to the server with HTTP requests, particularly for session management or authentication purposes.
+
+### Use Local Storage
+
+- For storing large amounts of client-side data that doesn’t need to be automatically sent to the server and for data that should persist across browser sessions.
+
+
+
+In many cases, you might use both cookies and local storage, depending on the specific requirements of different parts of your application. There are also other places where you can store the client-side data. You can check out [this article](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage) for more information.
+
+
+Happy coding 🧑🏽💻
\ No newline at end of file
diff --git a/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/cover.png b/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/cover.png
new file mode 100644
index 0000000000..5c7f576575
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-09-Cookies-vs-Local-Storage/cover.png differ
diff --git a/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md
index 11f6af4ea4..67e451f0df 100644
--- a/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md
+++ b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/Post.md
@@ -6,6 +6,8 @@ With every release, .NET becomes faster & faster! You get these improvements for
It’s very interesting that **20% of these improvements** are implemented by **open-source volunteers** rather than Microsoft employees. These improvements mostly focus on cloud-native and high-throughput applications. I’ll briefly list them below.
+
+
## 1. Dynamic PGO with JIT Compiler
diff --git a/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/cited-from-microsoft-blog-post.png b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/cited-from-microsoft-blog-post.png
new file mode 100644
index 0000000000..5deb5c12fb
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/cited-from-microsoft-blog-post.png differ
diff --git a/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/cover.png b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/cover.png
index 91ed380f6d..bec5aa6579 100644
Binary files a/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/cover.png and b/docs/en/Community-Articles/2024-10-09-NET9-Performance-Improvements/cover.png differ
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md
new file mode 100644
index 0000000000..9e996d2099
--- /dev/null
+++ b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md
@@ -0,0 +1,138 @@
+# .NET Aspire vs ABP Studio: Side by Side
+
+In this article, I will compare [.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/) by [ABP Studio](https://abp.io/docs/latest/studio) by explaining their similarities and differences.
+
+
+
+## Introduction
+
+While .NET Aspire and ABP Studio are tools for different purpose with different scope and they have different approaches to solve the problems, many developers still may confuse since they also have some similar functionalities and solves some common problems.
+
+In this article, I will clarify all, and you will have a clear understanding of what are the similarities and differences of them. Let's start by briefly define what are .NET Aspire and ABP Studio.
+
+### What is .NET Aspire?
+
+**[.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/)** is a **cloud-ready framework** designed to simplify building distributed, observable, and production-ready applications. It provides a set of opinionated tools and NuGet packages tailored for cloud-native concerns like **orchestration**, **service integration** (e.g., Redis, PostgreSQL), and **telemetry**. Aspire focuses on the **local development experience**, making it easier to manage complex, multi-service apps by **abstracting away configuration details**.
+
+Here, a screenshot from [.NET Aspire dashboard](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/overview) that is used for application monitoring and inspection:
+
+
+
+### What is ABP Studio?
+
+**[ABP Studio](https://abp.io/docs/latest/studio)** is a cross-platform **desktop application** designed to **simplify development** on the ABP Framework by **automating various tasks** and offering a streamlined, **integrated development environment**. It allows developers to **build**, **run**, **test**, **monitor**, and **deploy applications** more efficiently. With features like Kubernetes integration and support for complex multi-application systems, ABP Studio **enhances productivity**, especially in **microservice or modular monolith architectures**.
+
+Here, a screenshot from the ABP Studio [Solution Runner panel](https://abp.io/docs/latest/studio/running-applications) that is used to run, browse, monitor and inspect applications:
+
+
+
+## A Brief Comparison
+
+Before deep diving details, I want to show a **table of features** to compare ABP Studio and .NET Aspire side by side:
+
+
+
+## Comparing the Features
+
+In the next sections, I will go through each feature and explain differences and similarities.
+
+### Integration Packages
+
+ABP Framework has tens of integration packages to 3rd-party libraries and services. .NET Aspire also has some library integrations. But these integrations have different purposes:
+
+* **ABP Framework**'s integrations (like [MongoDB](https://abp.io/docs/latest/framework/data/mongodb), [RabbitMQ](https://abp.io/docs/latest/framework/infrastructure/background-jobs/rabbitmq), [Dapr](https://abp.io/docs/latest/framework/dapr), etc) are integrations for its abstractions and aimed to be **used directly by your application code**. They are complete and sophisticated integrations with the ABP Framework and your codebase.
+* **.NET Aspire**'s integrations (like [MongoDB](https://learn.microsoft.com/en-us/dotnet/aspire/database/mongodb-integration), [RabbitMQ](https://learn.microsoft.com/en-us/dotnet/aspire/messaging/rabbitmq-integration), [Dapr](https://learn.microsoft.com/en-us/dotnet/aspire/frameworks/dapr), etc), on the other hand, for simplifying configuration, service discovery, orchestration and monitoring of these tools within .NET Aspire host. Basically, these are mostly for **integrating to .NET Aspire**, not for integrating to your application.
+
+For example, ABP's [MongoDB](https://abp.io/docs/latest/framework/data/mongodb) integration allows you to use MongoDB over [repository services](https://abp.io/docs/latest/framework/architecture/domain-driven-design/repositories), automatically handles database transactions, [audit logs](https://abp.io/docs/latest/framework/infrastructure/audit-logging), [event publishing](https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed) on data saves, dynamic [connection string](https://abp.io/docs/latest/framework/fundamentals/connection-strings) management, [multi-tenancy](https://abp.io/docs/latest/framework/architecture/multi-tenancy) integration and so on.
+
+On the other hand, .NET Aspire's [MongoDB](https://learn.microsoft.com/en-us/dotnet/aspire/database/mongodb-integration) integration basically adds [MongoDB driver library](https://www.nuget.org/packages/MongoDB.Driver/) to your .NET Aspire host application and configures it so you can discover MongoDB server on runtime, use a MongoDB Docker container and see its health status, logs and traces on .NET Aspire dashboard.
+
+### Starter Templates
+
+Both of ABP Studio and .NET Aspire provide **startup solution templates for new applications**. However, there are huge differences between these startup solution templates and their purpose are completely different.
+
+* ABP Studio provides **production-ready** and [advanced solution templates](https://abp.io/docs/latest/solution-templates) for **layered**, **modular** or **microservice** solution development. They are well configured for **local development** and deploying to **Kubernetes** and other **production environments**. They provide different **UI and database options**, many optional modules and configuration. For example, you can check the [microservice solution template](https://abp.io/docs/latest/solution-templates/microservice/overview) to see how **sophisticated** it is.
+* .NET Aspire's [project templates](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/setup-tooling?tabs=windows&pivots=visual-studio#net-aspire-project-templates)' main purpose is to provide a minimal application structure that is **pre-integrated to .NET Aspire** libraries and configured for **local development** environment.
+
+So, when you start with .NET Aspire project template, you will need to deal with a lot of work to make your solution production and enterprise ready. On the other hand, ABP Studio's solution templates are ready to launch your system from the first day and they provide you a perfect starting point for your new business idea.
+
+### Monitoring & Application Running
+
+Monitoring applications and services is an important requirement for building **complex distributed systems**. Both of ABP Studio and .NET Aspire provide **excellent tools** for that purpose.
+
+* ABP Studio's [Solution Runner panel](https://abp.io/docs/latest/studio/running-applications) provides a powerful UI to run and monitor applications and services. You can see all HTTP requests, distributed events, exceptions and detailed application logs, trace and find problems in your system. You can use its fully functional built-in browser to navigate application UIs easily. You can also create multiple profiles to group and configure the applications for different teams.
+* .NET Aspire's [dashboard](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/overview) can be used to see the states of the running applications and containers, explore their console output, logs, traces and metrics to understand what is happing in your distributed system.
+
+Both tools are pretty useful for monitoring. In addition to monitoring, **ABP Studio offers an advanced UI to control the running applications**, build, start and stop individually or by a group of applications.
+
+### Architecting / Building Solutions
+
+One of the unique features of **ABP Studio** is that it **is an architectural tool** that helps you create the structure and architecture of your solution. You can create any kind of application, from **single-layer** simple web applications to **layered multi-application** solutions, from **monolith modular** to **microservice** systems. In the next section, I will briefly explains these architectural features.
+
+#### Building Modular Monolith Solutions
+
+With ABP Studio, you can create a new solution, **create modules and establish relations** (dependencies) between modules to architect your overall **modular monolith system** easily.
+
+Here, a screenshot where we are adding an existing package reference to the Products module of a modular CRM solution:
+
+
+
+You can see the [Modular Application Development tutorial](https://abp.io/docs/latest/tutorials/modular-crm) to learn how to build such an application step by step.
+
+#### Building Microservice Solutions
+
+ABP Studio provides a full featured [microservice startup solution template](https://abp.io/docs/latest/solution-templates/microservice) and the fundamental tooling to build **large-scale microservice systems**.
+
+Here a screenshot that shows how to add new microservices, API gateways or web applications to a microservice solution:
+
+
+
+.NET Aspire has no such a feature and has no such a plan to provide that kind of architectural solution building experience.
+
+### Kubernetes Integration
+
+Another great ABP Studio feature is [Kubernetes Integration](https://abp.io/docs/latest/studio/kubernetes). It allows you to develop your distributed / microservice solutions as integrated to [Kubernetes](https://kubernetes.io/).
+
+Here, a few tasks you can accomplish using ABP Studio's Kubernetes integration:
+
+* **Build docker images** of your applications and services
+* **Install and uninstall Helm charts** to your Kubernetes cluster
+* **Connect to internal services** of your Kubernetes cluster
+* **Monitor** services and applications that are running in your Kubernetes cluster
+* **Intercept traffic** of a service and redirect requests to your local machine. In that way, you can develop, test and run individual services or applications in your local computer that is **fully integrated** to other services and applications running in Kubernetes.
+
+ABP Studio's Kubernetes Integration makes microservice development so easy and comfortable. On the other hand, .NET Aspire has no such a Kubernetes integrated development experience.
+
+## The ABP Platform
+
+Until now, I directly compared ABP Studio and .NET Aspire features. .NET Aspire is directly built on .NET and ASP.NET Core. However, ABP Studio is not a standalone tool that is built on .NET and ASP.NET Core. It is built on the [ABP Platform](https://abp.io/) (which is built on .NET and ASP.NET Core).
+
+The following diagram shows ABP Platform components at a glance:
+
+
+
+So, when you use ABP Studio, you also take full power of the [open source ABP Framework](https://github.com/abpframework/abp) and other ABP Platform features.
+
+## ABP and .NET Aspire Integration
+
+I have a good news to you. It is actually possible and pretty easy to make ABP Platform and .NET Aspire working together.
+
+You can check [@berkansasmaz](https://abp.io/community/members/berkansasmaz)'s great article: **[How to use .NET Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk)**.
+
+## Licensing
+
+ABP Studio has a Community Edition which is completely free and available to everyone. It includes many of the features I mentioned here. There is also a commercial edition that is included in [commercial ABP licenses](https://abp.io/pricing). You can [check that blog post](https://abp.io/blog/announcing-abp-studio-general-availability) which clearly explains the license differences and introduces the fundamental ABP Studio features.
+
+On the other hand, .NET Aspire is a free tool developed and published by Microsoft. It has no commercial version.
+
+## Conclusion
+
+Both .NET Aspire and ABP Studio serve distinct purposes, catering to different types of development environments. While .NET Aspire excels in simplifying cloud-native application setups and observability, ABP Studio provides a comprehensive framework for modular monoliths and microservice architectures with full-fledged enterprise level production-ready startup solution templates and integrated tools.
+
+In the previous section, it was mentioned that it is possible to [use them together](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk). You don't have to select one of them. However, in my opinion, when you use ABP Studio, you won't need .NET Aspire since ABP Studio can do everything and much more. If you have budget, I suggest to purchase a commercial ABP Studio [license](https://abp.io/pricing) so you can fully unlock its power.
+
+## Resources / Further Reading
+
+* [ABP Studio documentation](https://abp.io/docs/latest/studio)
+* [.NET Aspire documentation](https://learn.microsoft.com/en-us/dotnet/aspire/)
+* [How to use .NET Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk)
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-overall-diagram.png b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-overall-diagram.png
new file mode 100644
index 0000000000..16d397466a
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-overall-diagram.png differ
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-add-existing-package.png b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-add-existing-package.png
new file mode 100644
index 0000000000..a5940a931f
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-add-existing-package.png differ
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-add-new-microservice.png b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-add-new-microservice.png
new file mode 100644
index 0000000000..7af8143949
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-add-new-microservice.png differ
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-solution-runner.png b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-solution-runner.png
new file mode 100644
index 0000000000..27047da5c6
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-solution-runner.png differ
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-vs-dotnet-aspire-comparison-table.png b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-vs-dotnet-aspire-comparison-table.png
new file mode 100644
index 0000000000..8b27070d5c
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/abp-studio-vs-dotnet-aspire-comparison-table.png differ
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/cover.png b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/cover.png
new file mode 100644
index 0000000000..cec722e760
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/cover.png differ
diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/dotnet-aspire-dashboard.png b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/dotnet-aspire-dashboard.png
new file mode 100644
index 0000000000..a0401a3fd0
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/dotnet-aspire-dashboard.png differ
diff --git a/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/cover.png b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/cover.png
new file mode 100644
index 0000000000..68819c12d9
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/cover.png differ
diff --git a/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/dog-food.png b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/dog-food.png
new file mode 100644
index 0000000000..67294f7596
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/dog-food.png differ
diff --git a/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/ef-core-upgrade.png b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/ef-core-upgrade.png
new file mode 100644
index 0000000000..b91d5edd5f
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/ef-core-upgrade.png differ
diff --git a/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/net-support-policy.png b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/net-support-policy.png
new file mode 100644
index 0000000000..ae7afa5d8b
Binary files /dev/null and b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/net-support-policy.png differ
diff --git a/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/post.md b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/post.md
new file mode 100644
index 0000000000..2a75a97df3
--- /dev/null
+++ b/docs/en/Community-Articles/2024-10-23-Abp-Net9-Upgrade/post.md
@@ -0,0 +1,147 @@
+# ABP Now Supports .NET 9
+
+
+
+
+
+**.NET 9.0.100-rc.2** has been released on **October 8, 2024**. To align with the latest .NET, we also released the ABP Platform [9.0.0-rc.1](https://github.com/abpframework/abp/releases/tag/9.0.0-rc.1) version.
+**With this release, ABP now supports .NET 9.**
+
+The .NET 9 stable version is planned to be released on **November 12, 2024** before the [.NET Conf 2024](https://www.dotnetconf.net/) event. The ABP 9.0 stable version is planned to be released on November 19, 2024.
+
+---
+
+- **Download the .NET 9 runtime** and SDK from the following link:
+
+ [https://dotnet.microsoft.com/en-us/download/dotnet/9.0](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)
+
+- There are many enhancements and bug fixes with ABP 9.0. Read the ABP 9 announcement:
+
+ https://abp.io/blog/announcing-abp-9-0-release-candidate
+
+-
+ Read **our migration ABP 9.0 migration guide** from the following link:
+
+ [abp.io/docs/9.0/release-info/migration-guides/abp-9-0](https://abp.io/docs/9.0/release-info/migration-guides/abp-9-0)
+
+- The following is the **PR is for the .NET 9 upgrade** in the ABP source code:
+
+ [https://github.com/abpframework/abp/pull/20803](https://github.com/abpframework/abp/pull/20803)
+
+---
+
+
+
+## .NET 9 Releases
+
+In the following link, you can find **a list of all .NET 9 releases** with direct links to release notes and announcements/discussions:
+
+* https://github.com/dotnet/core/discussions/9234
+
+
+
+---
+
+
+
+## ABP Supports Both .NET 8 & .NET 9
+
+The ABP 9.0 version fully supports .NET 9 within our new templates and modules. For developers who want to update their ABP packages to the latest but want to keep them in .NET 8, **we support both .NET 8 and .NET 9** in ABP 9. In your host application, you can choose your target framework.
+
+So you can decide which version you want to use in your startup Host Application’s `` tag.
+
+In [this link](https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp/Volo.Abp.csproj#L7) you can see that netstandard2.0/2.1 and net8/9 are supported.
+
+```xml
+
+
+ netstandard2.0;netstandard2.1;net8.0;net9.0
+
+
+```
+
+
+
+### New ASP.NET Core Middleware: Static Asset Delivery
+
+`MapStaticAssets` is a new middleware that helps optimize the delivery of static assets in any ASP.NET Core app, including Blazor apps. With this change, some `JavaScript/CSS/Images` files exist in the [Virtual File System](https://abp.io/docs/latest/framework/infrastructure/virtual-file-system?_redirected=B8ABF606AA1BDF5C629883DF1061649A), but the new ASP.NET Core 9 `MapStaticAssets` can't handle them. You need to add `StaticFileMiddleware` to serve these files. In ABP 9, we added `MapAbpStaticAssetsan `extension method to support the new `MapStaticAssets`. You can read about this new feature at [this link](https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-9.0?view=aspnetcore-8.0#static-asset-delivery-optimization).
+ABP’s new extension method is available [here](https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Builder/AbpApplicationBuilderExtensions.cs#L129-L198).
+
+---
+
+
+
+## How to Upgrade from .NET 8 to .NET 9:
+
+Install the latest .NET 9 SDK from [this link](https://dotnet.microsoft.com/en-us/download/dotnet/9.0).
+Upgrade [dotnet-ef](https://learn.microsoft.com/en-us/ef/core/cli/dotnet) tool version with the following command:
+
+```bash
+dotnet tool uninstall --global dotnet-ef && dotnet tool install --global dotnet-ef
+```
+
+
+
+1. Change all `TargetFramework` tags from `net8.0` to `net9.0`.
+2. Upgrade all Microsoft NuGet packages to `9.0.0`.
+3. If you have `global.json`, update `dotnet`version to `9.0.0` .
+4. Replace`app.UseStaticFiles()` to `app.MapAbpStaticAssets()` in your module classes and startup projects.
+ [See the related changes in the repository.](https://github.com/abpframework/abp/commit/0f34f6dfcdbeb5d27fd63cf764f1ef13eb9cdfcd)
+
+
+
+---
+
+
+
+## What’s new with .NET 9
+
+**.NET 9 Blazor New Features**
+
+- https://abp.io/community/articles/asp.net-core-blazor-9.0-new-features-summary--x0fovych
+
+**.NET 9 Performance Improvements Summary**
+
+- https://abp.io/community/articles/.net-9-performance-improvements-summary-gmww3gl8
+
+**What’s new in .NET 9 (Microsoft’s post)**
+
+- https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9/overview
+
+
+
+---
+
+
+
+## We Are Eating Our Own Dog Food
+
+Before we release any version of ABP, **we test our upcoming version** on our sample apps and live website https://abp.io. The ABP.io website is also built on top of the ABP Framework, and you can see that we have already started to use .NET 9-rc.2 on our live website.
+
+
+
+
+
+---
+
+
+
+## Microsoft .NET Support Policy
+
+Lastly, I want to mention Microsoft's .NET support policy.
+
+- **.NET 7** support has been **finished** on **May 2024**.
+- **.NET 8** will be supported until **November 2026**.
+- **.NET 9** is on the standard term support, which means Microsoft will release patches until **May 2026**.
+
+Find detailed information about the .NET support policy at [this link.](https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core)
+
+
+
+---
+
+
+
+## Finally
+
+.NET 9 is making a significant impact. It introduces features like Native AOT for faster applications, enhanced AI integration and improved tools for cloud-native and cross-platform development, all aimed at simplifying developers’ work. Whether you’re handling small projects or large-scale enterprise applications, it offers enhancements that **elevate your productivity by just upgrading your .NET version to 9.0**
diff --git a/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/POST.md b/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/POST.md
new file mode 100644
index 0000000000..3cd4bdc706
--- /dev/null
+++ b/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/POST.md
@@ -0,0 +1,125 @@
+# Hybrid Cache in .NET 9
+
+.NET 9 introduces an exciting feature: **HybridCache**, an advanced caching mechanism that seamlessly combines multiple caching strategies to maximize performance and scalability.
+
+It offers a flexible caching solution that combines the best aspects of local and distributed caching. **HybridCache** is particularly useful in scenarios where quick, in-memory access is desirable but data consistency across multiple application instances is also a requirement.
+
+In this article, we’ll explore **HybridCache** in .NET 9 and how it integrates with ABP Framework using `AbpHybridCache`. This new feature offers a robust solution for applications that need to scale while maintaining efficient caching strategies.
+
+## What is HybridCache?
+
+**HybridCache** is designed to merge different caching layers, commonly including an in-memory cache (for high-speed access) and a distributed cache (for scalability across multiple instances). This hybrid approach allows for:
+
+* **Improved Performance**: Frequently accessed data is stored in-memory, reducing latency.
+* **Increased Scalability**: Cached data can still be shared across distributed environments, essential for load-balanced applications.
+* **Automatic Synchronization**: Changes in distributed cache automatically update the in-memory cache, ensuring data consistency.
+
+## Using HybridCache with ABP
+
+> For more information about the implementation in the ABP side, you can refer to the pull request [here](https://github.com/abpframework/abp/pull/20859).
+
+ABP's support for **HybridCache** is available starting from version 9.0 through the [`AbpHybridCache`](https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/Hybrid/AbpHybridCache.cs) implementation. By leveraging this feature, developers using ABP can implement hybrid caching in a way that aligns with ABP’s modular and extensible architecture.
+
+To demonstrate how to use **HybridCache** in ABP, let's start with a simple example.
+
+> You can create an ABP-based application with v9.0+, and then follow the next steps for using hybrid caching in your application.
+
+### Configuring the `AbpHybridCacheOptions` (Optional)
+
+First, you can configure the hybrid cache options in your module class as below (it's optional):
+
+```csharp
+using Microsoft.Extensions.Caching.Hybrid;
+using Volo.Abp.Caching.Hybrid;
+
+public class YourModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ //...
+
+ Configure(options =>
+ {
+ //configuring the global hybrid cache options
+ options.GlobalHybridCacheEntryOptions = new HybridCacheEntryOptions()
+ {
+ Expiration = TimeSpan.FromMinutes(20),
+ LocalCacheExpiration = TimeSpan.FromMinutes(10)
+ };
+ });
+ }
+}
+```
+
+* You can configure the `AbpHybridCacheOptions` to set *keyPrefix* for your cache keys, throw or hide exceptions for the distributed cache (by default *it hides errors*), or configure cache for specific cache item keys and more...
+* By setting the `GlobalHybridCacheEntryOptions`, you specify the caching options globally in your application. Thanks to that, you don't need to manually pass the related options whenever you use the `IHybridCache` service.
+
+### Using the `IHybridCache` Service
+
+After the configuration, now you can inject the `IHybridCache` and use it to set and retrieve cache values:
+
+```csharp
+using Volo.Abp.Caching.Hybrid;
+
+public class BookAppService : ApplicationService, IBookAppService
+{
+ private readonly IHybridCache _hybridCache;
+
+ public BookAppService(IHybridCache hybridCache)
+ {
+ _hybridCache = hybridCache;
+ }
+
+ public async Task GetBookWithPageCountAsync(string name)
+ {
+ var cacheKey = "cacheKey:book-" + name;
+
+ // Retrieve data from hybrid cache
+ return await _hybridCache.GetOrCreateAsync(cacheKey, async () =>
+ {
+ // Simulating getting and returning the data if not exist in the cache
+ return new BookCacheItem
+ {
+ Name = name,
+ PageCount = 100
+ };
+ });
+ }
+}
+
+public class BookCacheItem
+{
+ public string Name { get; set; }
+
+ public int PageCount { get; set; }
+}
+```
+
+* You can use the `IHybridCache` or `IHybridCache` service to leverage the hybrid caching. If you use `IHybridCache`as the service, then you should pass the cache key as *string* like in the example above.
+* In this example, you used the `GetOrCreateAsync` method, which first tries to get the cache item with the provided cache key, if there is no cache with the specified key, then it runs the factory method and add the returned data to the cache.
+* Alternatively, you can use the `SetAsync` method to set the cache item.
+
+### Debugging the `IHybridCache` Service (deep-dive)
+
+When you debug the `IHybridCache` service, you'll notice the L1 and L2 cache stores. (L1 is in-memory cache store and L2 is the distributed cache store):
+
+
+
+As you can see from the figure, it only set the cache item to the **LocalCache** (`MemoryCache`) and did not set the **BackendCache** (`DistributedCache`) because I did not configure the distributed cache and not running my application in multiple instances. But as you can notice, even without an `IDistributedCache` configuration, the `HybridCache` service will still provide in-process caching.
+
+**Note:** If you configure distributed caching options, `HybridCache` service uses the distributed cache and sets the **BackendCache**.
+
+## Conclusion
+
+The **HybridCache** library in .NET 9 provides a powerful tool for applications needing both high-speed caching and consistency in distributed environments.
+
+With ABP Framework’s `AbpHybridCache` support, integrating this feature into an ABP-based application becomes straightforward. This setup helps ensure that cached data remains synchronized across instances, bringing a new level of flexibility to caching in .NET 9 applications.
+
+> For more information, you can refer to the [Microsoft's official document](https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-9.0?view=aspnetcore-9.0#new-hybridcache-library).
+
+## References
+
+- https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-9.0?view=aspnetcore-9.0#new-hybridcache-library
+- https://www.youtube.com/watch?v=TDyZc11cJfA
+- https://github.com/abpframework/abp/pull/20803
+- https://github.com/abpframework/abp/pull/20859
diff --git a/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/cover-image.png b/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/cover-image.png
new file mode 100644
index 0000000000..3494a01265
Binary files /dev/null and b/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/cover-image.png differ
diff --git a/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/debug-hybrid-cache.png b/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/debug-hybrid-cache.png
new file mode 100644
index 0000000000..3f8c8e0b1c
Binary files /dev/null and b/docs/en/Community-Articles/2024-11-01-Hybrid-Cache-Net-9/debug-hybrid-cache.png differ
diff --git a/docs/en/cli/index.md b/docs/en/cli/index.md
index 9acb0bb2e8..2c8a4d894e 100644
--- a/docs/en/cli/index.md
+++ b/docs/en/cli/index.md
@@ -2,7 +2,7 @@
ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP based solutions or ABP Studio features.
-> 🛈 With **v8.2+**, the old/legacy ABP CLI has been replaced with a new CLI system to align with the new templating system and [ABP Studio](../studio/index.md). The new ABP CLI commands are explained in this documentation. However, if you want to learn more about the differences between the old and new CLIs, want to learn the reason for the change, or need guidance to use the old ABP CLI, please refer to the [Old vs New CLI](differences-between-old-and-new-cli.md) documentation.
+> With **v8.2+**, the old/legacy ABP CLI has been replaced with a new CLI system to align with the new templating system and [ABP Studio](../studio/index.md). The new ABP CLI commands are explained in this documentation. However, if you want to learn more about the differences between the old and new CLIs, want to learn the reason for the change, or need guidance to use the old ABP CLI, please refer to the [Old vs New CLI](differences-between-old-and-new-cli.md) documentation.
>
> You may need to remove the Old CLI before installing the New CLI, by running the following command: `dotnet tool uninstall -g Volo.Abp.Cli`
@@ -142,6 +142,9 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md
* `angular`: Angular UI. There are some additional options for this template:
* `--tiered`: The Auth Server project comes as a separate project and runs at a different endpoint. It separates the Auth Server from the API Host application. If not specified, you will have a single endpoint in the server side. (*Available for* ***Team*** *or higher licenses*)
* `--progressive-web-app` or `-pwa`: Specifies the project as Progressive Web Application.
+ * `blazor-webapp`: Blazor Web App UI. There are some additional options for this template:
+ * `--tiered`: The Auth Server and the API Host project comes as separate projects and run at different endpoints. It has 3 startup projects: *HttpApi.Host*, *AuthServer* and *Blazor* and and each runs on different endpoints. If not specified, you will have a single endpoint for your web project.
+ * `--progressive-web-app` or `-pwa`: Specifies the project as Progressive Web Application.
* `blazor`: Blazor UI. There are some additional options for this template:
* `--tiered`The Auth Server project comes as a separate project and runs at a different endpoint. It separates the Auth Server from the API Host application. If not specified, you will have a single endpoint in the server side. (*Available for* ***Team*** *or higher licenses*)
* `--progressive-web-app` or `-pwa`: Specifies the project as Progressive Web Application.
diff --git a/docs/en/deployment/clustered-environment.md b/docs/en/deployment/clustered-environment.md
index ee611fc988..0c4aa3daca 100644
--- a/docs/en/deployment/clustered-environment.md
+++ b/docs/en/deployment/clustered-environment.md
@@ -1,14 +1,15 @@
# Deploying to a Clustered Environment
-This document introduces the topics that you should consider when you are deploying your application to a clustered environment where **multiple instances of your application run concurrently**, and explains how you can deal with these topics in your ABP based application.
+This document explains the topics that you should consider when deploying your application to a clustered environment where multiple instances of your application run concurrently.
+It explains how you can deal with these topics in your ABP application.
-> This document is valid regardless you have a monolith application or a microservice solution. The Application term is used for a process. An application can be a monolith web application, a service in a microservice solution, a console application, or another kind of an executable process.
->
-> For example, if you are deploying your application to Kubernetes and configure your application or service to run in multiple pods, then your application or service runs in a clustered environment.
+> This document is eligible for both monolith and microservice solutions.
+> The Application term is used for a process. An application can be a monolith web application, a service in a microservice solution, a console application, or another executable process.
+> For example, if you are deploying your application to Kubernetes and configuring your application or service to run in multiple pods, then your application or service runs in a clustered environment.
## Understanding the Clustered Environment
-> You can skip this section if you are already familiar with clustered deployment and load balancers.
+> You can skip this section if you are familiar with clustered deployment and load balancers.
### Single Instance Deployment
@@ -16,11 +17,15 @@ Consider an application deployed as a **single instance**, as illustrated in the

-Browsers and other client applications can directly make HTTP requests to your application. You can put a web server (e.g. IIS or NGINX) between the clients and your application, but you still have a single application instance running in a single server or container. Single-instance configuration is **limited to scale** since it runs in a single server and you are limited with the server's capacity.
+Browsers and other client applications can directly make HTTP requests to your application.
+You can locate a web server (e.g. IIS or NGINX) between the clients and your application, but you still have a single application instance running in a single server or container.
+A single instance configuration is **limited by scale** because it runs on a single server, and the capacity of the server may limit the application's performance.
### Clustered Deployment
-**Clustered deployment** is the way of running **multiple instances** of your application **concurrently** in a single or multiple servers. In this way, different instances can serve different requests and you can scale by adding new servers to the system. The following figure shows a typical implementation of clustering using a **load balancer**:
+**Clustered deployment** is the way of running **multiple instances** of your application **concurrently** in a single or multiple servers.
+In this architecture, different instances can serve different requests, and you can scale them by adding new servers to the system.
+The following figure shows a typical implementation of clustering using a **load balancer**:

@@ -28,53 +33,56 @@ Browsers and other client applications can directly make HTTP requests to your a
[Load balancers](https://en.wikipedia.org/wiki/Load_balancing_(computing)) have a lot of features, but they fundamentally **forward an incoming HTTP request** to an instance of your application and return your response back to the client application.
-Load balancers can use different algorithms for selecting the application instance while determining the application instance that is used to deliver the incoming request. **Round Robin** is one of the simplest and most used algorithms. Requests are delivered to the application instances in rotation. First instance gets the first request, second instance gets the second, and so on. It returns to the first instance after all the instances are used, and the algorithm goes like that for the next requests.
+Load balancers can use different algorithms to route the requests to an application instance. [Round Robin](https://en.wikipedia.org/wiki/Round-robin_scheduling) is one of the simplest and most used algorithms. Requests are delivered to the application instances in rotation. The first instance gets the first request; the second instance gets the second, and so on. It returns to the first instance after all the instances are used, and the algorithm iterates like this until the next request.
### Potential Problems
Once multiple instances of your application run in parallel, you should carefully consider the following topics:
-* Any **state (data) stored in memory** of your application will become a problem when you have multiple instances. A state stored in memory of an application instance may not be available in the next request since the next request will be handled by a different application instance. While there are some solutions (like sticky sessions) to overcome this problem user-basis, it is a **best practice to design your application as stateless** if you want to run it in a cluster, container or/and cloud.
+* Any **state (data) stored in memory** of your application will become a problem when you have multiple instances. A state stored in the memory of an application instance may not be available in the next request since the next request will be handled by a different application instance. While there are some solutions (like sticky sessions) to overcome this problem on a user basis, it is a **best practice to design your application as stateless** if you want to run it in a cluster, container or/and cloud.
* **In-memory caching** is a kind of in-memory state and should not be used in a clustered application. You should use **distributed caching** instead.
* You shouldn't store data in the **local file system**. It should be available to all instances of your application. Different application instance may run in different containers or servers and they may not be able to have access to the same file system. You can use a **cloud or external storage provider** as a solution.
-* If you have **background workers** or **job queue managers**, you should be careful since multiple instances may try to execute the same job or perform the same work concurrently. As a result, you may have the same work done multiple times or you may get a lot of errors while trying to access and change the same resources.
+* If you have **background workers** or **job queue managers**, you should be careful since multiple instances may try to execute the same job or perform the same work concurrently. As a result, you may have the same work done multiple times, or you may get a lot of errors while trying to access and change the same resources.
You may have more problems with clustered deployment, but these are the most common ones. ABP has been designed to be compatible with the clustered deployment scenario. The following sections explain what you should do when you are deploying your ABP based application to a clustered environment.
## Switching to a Distributed Cache
-ASP.NET Core provides different kind of caching features. [In-memory cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory) stores your objects in the memory of the local server and is only available to the application that stored the object. Non-sticky sessions in a clustered environment should use the [distributed caching](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) except some specific scenarios (for example, you can cache a local CSS file into memory. It is read-only data and it is the same in all application instances. You can cache it in memory for performance reasons without any problem).
+ASP.NET Core provides different kinds of caching features. [In-memory cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory) stores your objects in the memory of the local server and is only available to the application that stores the object. Non-sticky sessions in a clustered environment should use the [distributed caching](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) except for some specific scenarios (for example, you can cache a local CSS file into memory. It is read-only data and it is the same in all application instances. You can cache it in memory for performance reasons without any problem).
-[ABP's Distributed Cache](../framework/fundamentals/caching.md) extends [ASP.NET Core's distributed cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) infrastructure. It works in-memory by default. You should configure an actual distributed cache provider when you want to deploy your application to a clustered environment.
+[ABP's Distributed Cache](../framework/fundamentals/caching.md) extends [ASP.NET Core's distributed cache](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) infrastructure. It works in memory by default. You should configure an actual distributed cache provider when you want to deploy your application to a clustered environment.
-> You should configure the cache provider for clustered deployment, even if your application doesn't directly use `IDistributedCache`. Because the ABP and the pre-built [application modules](../modules) are using distributed cache.
+> You should configure the cache provider for clustered deployment, even if your application doesn't directly use `IDistributedCache`.
+> The ABP and the pre-built [application modules](../modules) use distributed cache.
ASP.NET Core provides multiple integrations to use as your distributed cache provider, like [Redis](https://redis.io/) and [NCache](https://www.alachisoft.com/ncache/). You can follow [Microsoft's documentation](https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed) to learn how to use them in your applications.
If you decided to use Redis as your distributed cache provider, **follow [ABP's Redis Cache Integration document](../framework/fundamentals/redis-cache.md)** for the steps you need to follow to install it into your application and setup your Redis configuration.
-> Based on your preferences while creating a new ABP solution, Redis cache might be pre-installed in your solution. For example, if you have selected the *Tiered* option with the MVC UI, Redis cache comes as pre-installed. Because, in this case, you have two applications in your solution and they should use the same cache source to be consistent.
+> Depending on your preferences when creating a new ABP solution, Redis cache might be pre-installed.
+> For example, if you select the *Tiered* option with the MVC UI, the Redis cache will be pre-installed by default.
+> Because, in this case, you have two applications in your solution that should use the same cache source to be consistent.
## Using a Proper BLOB Storage Provider
-If you have used ABP's [BLOB Storing](../framework/infrastructure/blob-storing) feature with the [File System provider](../framework/infrastructure/blob-storing/file-system.md), you should use another provider in your clustered environment since the File System provider uses the application's local file system.
+If you use ABP's [BLOB Storing](../framework/infrastructure/blob-storing) feature with the [File System provider](../framework/infrastructure/blob-storing/file-system.md), you should use another provider in your clustered environment since the File System provider uses the application's local file system.
-The [Database BLOB provider](../framework/infrastructure/blob-storing/database.md) is the easiest way since it uses your application's main database (or another database if you configure) to store BLOBs. However, you should remember that BLOBs are large objects and may quickly increase your database's size.
+The [Database BLOB provider](../framework/infrastructure/blob-storing/database.md) is the easiest way since it uses your application's main database (or another database if you configure it) to store BLOBs. However, you should remember that BLOBs are large objects and may quickly increase your database's size.
-> [ABP](https://abp.io/) startup solution templates come with the database BLOB provider as pre-installed, and stores BLOBs in the application's database.
+> [ABP](https://abp.io/) startup solution templates come with the database BLOB provider as pre-installed and store BLOBs in the application's database.
Check the [BLOB Storing](../framework/infrastructure/blob-storing) document to see all the available BLOB storage providers.
## Configuring Background Jobs
-ABP's [background job system](../framework/infrastructure/background-jobs) is used to queue tasks to be executed in the background. Background job queue is persistent and a queued task is guaranteed to be executed (it is re-tried if it fails).
+ABP's [background job system](../framework/infrastructure/background-jobs) queues tasks to be executed in the background. The background job queue is persistent, and a queued task is guaranteed to be executed (it will retry if it fails).
-ABP's default background job manager is compatible with clustered environments. It uses a [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure that the jobs are executed only in a single application instance at a time. See the *Configuring a Distributed Lock Provider* section below to learn how to configure a distributed lock provider for your application, so the default background job manager properly works in a clustered environment.
+ABP's default background job manager is compatible with clustered environments. It uses a [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure that the jobs are executed only in a single application instance at a time. See the *Configuring a Distributed Lock Provider* section below to learn how to configure a distributed lock provider for your application. Hence, the default background job manager properly works in a clustered environment.
If you don't want to use a distributed lock provider, you may go with the following options:
* Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false`) in all application instances except one of them, so only the single instance executes the jobs (while other application instances can still queue jobs).
-* Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background jobs. This can be a good option if your background jobs consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background jobs don't affect your application's performance.
+* Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background jobs. This can be a good option if your background jobs consume high system resources (CPU, RAM, disk), you can deploy that background application to a dedicated server and your background jobs don't affect your application's performance.
> If you are using an external background job integration (e.g. [Hangfire](../framework//infrastructure/background-workers/hangfire.md) or [Quartz](../framework//infrastructure/background-workers/quartz.md)) instead of the default background job manager, then please refer to your provider's documentation to learn how it should be configured for a clustered environment.
@@ -82,13 +90,13 @@ If you don't want to use a distributed lock provider, you may go with the follow
ABP provides a distributed locking abstraction with an implementation made with the [DistributedLock](https://github.com/madelson/DistributedLock) library. A distributed lock is used to control concurrent access to a shared resource by multiple applications to prevent corruption of the resource because of concurrent writes. The ABP and some pre-built [application modules](../modules) are using distributed locking for several reasons.
-However, the distributed lock system works in-process by default. That means it is not distributed actually, unless you configure a distributed lock provider. So, please follow the [distributed lock](../framework/infrastructure/distributed-locking.md) document to configure a provider for your application, if it is not already configured.
+However, the distributed lock system works in-process by default. That means it is not actually distributed unless you configure a distributed lock provider. So, please follow the [distributed lock](../framework/infrastructure/distributed-locking.md) document to configure a provider for your application if it is not already configured.
## Configuring SignalR
ABP provides [SignalR](../framework/real-time/signalr.md) integration packages to simplify integration and usage. SignalR can be used whenever you need to add real-time web functionality (real-time messaging, real-time notification etc.) into your application.
-SignalR requires that all HTTP requests for a specific connection be handled (needs to keep track of all its connections) by the same server process. So, when SignalR is running on a clustered environment (with multiple servers) **"sticky sessions"** must be used.
+SignalR requires that all HTTP requests for a specific connection be handled (needs to keep track of all its connections) using the same server process. So, when SignalR is running on a clustered environment (with multiple servers), **"sticky sessions"** must be used.
If you are considering [scaling out](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#scale-out) your servers and don't want to have inconsistency with the active socket connections, you can use [Azure SignalR Service](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#azure-signalr-service) or [Redis backplane](https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-6.0#redis-backplane).
@@ -100,10 +108,10 @@ ASP.NET Core provides [hosted services](https://docs.microsoft.com/en-us/aspnet/
If your application has tasks running in the background, you should consider how they will behave in a clustered environment, especially if your background tasks are using the same resources. You should design your background tasks so that they continue to work properly in the clustered environment.
-Assume that your background worker in your SaaS application checks user subscriptions and sends emails if their subscription renewal date approaches. If the background task runs in multiple application instances, it is probable to send the same email many times to some users, which will disturb them.
+Suppose your SaaS application checks user subscriptions in the background and sends emails to those whose subscription renewal dates are approaching. If the background task runs on multiple application instances, users may get duplicate e-mails.
-We suggest you to use one of the following approaches to overcome the problem:
+Use one of the following approaches to overcome the **multiple workers same pool problem**:
-* Implement your background workers so that they work in a clustered environment without any problem. Using the [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure concurrency control is a way of doing that. A background worker in an application instance may handle a distributed lock, so the workers in other application instances will wait for the lock. In this way, only one worker does the actual work, while others wait in idle. If you implement this, your workers run safely without caring about how the application is deployed.
+* Implement your background workers so that they work in a clustered environment without any problems. Using the [distributed lock](../framework/infrastructure/distributed-locking.md) to ensure concurrency control is a way of doing that. A background worker in an application instance may handle a distributed lock, so the workers in other application instances will wait for the lock. In this way, only one worker does the actual work while others wait in an idle state. If you implement this, your workers run safely without caring about how the application is deployed.
* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances except one of them, so only the single instance runs the workers.
-* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance.
+* Stop the background workers (set `AbpBackgroundWorkerOptions.IsEnabled` to `false`) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background tasks. This can be a good option if your background workers consume high system resources (CPU, RAM, disk), so you can deploy that background application to a dedicated server and your background tasks don't affect your application's performance.
diff --git a/docs/en/deployment/configuring-openIddict.md b/docs/en/deployment/configuring-openIddict.md
index b044bcb275..80fa74d898 100644
--- a/docs/en/deployment/configuring-openIddict.md
+++ b/docs/en/deployment/configuring-openIddict.md
@@ -26,7 +26,7 @@ public override void PreConfigureServices(ServiceConfigurationContext context)
## Development Environment
-We've enabled `AddDevelopmentEncryptionAndSigningCertificate` by default on the development environment. It registers (and generates if necessary) a user-specific development encryption/development signing certificate. This is a certificate used for signing and encrypting the tokens and for **development environment only**.
+`AddDevelopmentEncryptionAndSigningCertificate` is enabled by default on the development environment. It registers (and also generates, if necessary, a user-specific development encryption/development signing certificate. This is a certificate used for signing and encrypting the tokens and for **development environment only**.
`AddDevelopmentEncryptionAndSigningCertificate` cannot be used in applications deployed on IIS or Azure App Service: trying to use them on IIS or Azure App Service will result in an exception being thrown at runtime (unless the application pool is configured to [load a user profile](https://learn.microsoft.com/en-us/iis/manage/configuring-security/application-pool-identities#user-profile)).
@@ -34,7 +34,7 @@ To avoid that, consider creating self-signed certificates and storing them in th
## Production Environment
-We've disabled `AddDevelopmentEncryptionAndSigningCertificate` in the production environment and tried to setup signing and encrypting certificates using `openiddict.pfx` file.
+`AddDevelopmentEncryptionAndSigningCertificate` is disabled in production environment. Signing and encryption of certificates is done using `openiddict.pfx` file in production environment.
You can use the `dotnet dev-certs https -v -ep openiddict.pfx -p 00000000-0000-0000-0000-000000000000` command to generate the `authserver.pfx` certificate.
diff --git a/docs/en/deployment/configuring-production.md b/docs/en/deployment/configuring-production.md
index 0eb9b0ba81..1480f933fe 100644
--- a/docs/en/deployment/configuring-production.md
+++ b/docs/en/deployment/configuring-production.md
@@ -1,10 +1,13 @@
# Configuring Your Application for Production Environments
-ABP has a lot of options to configure and fine-tune its features. They are all explained in their own documents. Default values for these options are pretty well for most of the deployment environments. However, you may need to care about some options based on how you've structured your deployment environment. In this document, we will highlight these kind of options. So, it is highly recommended to read this document in order to not have unexpected behaviors in your system in production.
+ABP predefines the configurations for the best performance for common deployment scenarios.
+However, depending on how you have structured your deployment environment, you may need to consider some extra options. This document highlights these options.
+It is highly recommended that you read it to prevent unexpected behaviors in your production environment.
## Distributed Cache Prefix
-ABP's [distributed cache infrastructure](../framework/fundamentals/caching.md) provides an option to set a key prefix for all of your data that is saved into your distributed cache provider. The default value of this option is not set (it is `null`). If you are using a distributed cache server that is shared by different applications, then you can set a prefix value to isolate an application's cache data from others.
+ABP's [distributed cache infrastructure](../framework/fundamentals/caching.md) provides an option to set a key prefix for all your data saved into your distributed cache provider.
+The default value of this option is not set (it is `null`). If you are using a distributed cache server that is shared by different applications, then you can set a prefix value to isolate an application's cache data from others.
````csharp
Configure(options =>
@@ -13,19 +16,21 @@ Configure(options =>
});
````
-That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache` or `IDistributedCache` services. See the [Caching documentation](../framework/fundamentals/caching.md) if you are new to distributed caching.
+That's all! This prefix will be added to all cache keys in your application, as long as you use ABP's `IDistributedCache` or `IDistributedCache` services.
+If you are new to distributed caching, check out the [caching documentation](../framework/fundamentals/caching.md).
-> **Warning**: If you use ASP.NET Core's standard `IDistributedCache` service, it's your responsibility to add the key prefix (you can get the value by injecting `IOptions`). ABP can not do it.
+
+> **Warning**: If you use ASP.NET Core's standard `IDistributedCache` [service](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.distributed.idistributedcache), it is your responsibility to add the key prefix (you can get the value by injecting `IOptions`). ABP can not do it anymore.
> **Warning**: Even if you have never used distributed caching in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your caching server is shared among multiple systems.
-> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) should normally use the same cache prefix, because you want all the applications to use the same cache data to have consistency between them.
+> **Warning**: If you are building a microservice architecture, then you will have multiple applications that share the same distributed cache server. All applications (sub-services) in these systems should use the same cache prefix and cache values to have application-wide consistency.
-> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured.
+> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for the distributed cache. If your application code is already configured, please check it.
## Distributed Lock Prefix
-ABP's [distributed locking infrastructure](../framework/infrastructure/distributed-locking.md) provides an option to set a prefix for all the keys you are using in the distributed lock server. The default value of this option is not set (it is `null`). If you are using a distributed lock server that is shared by different applications, then you can set a prefix value to isolate an application's lock from others.
+ABP's [distributed locking infrastructure](../framework/infrastructure/distributed-locking.md) provides an option to set a prefix for all the keys you use in the distributed lock server. The default value of this option is not set (it is `null`). If you use a distributed lock server shared by different applications, you can set a prefix value to isolate an application's lock from others.
````csharp
Configure(options =>
@@ -34,29 +39,31 @@ Configure(options =>
});
````
-That's all. ABP, then will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../framework/infrastructure/distributed-locking.md) if you are new to distributed locking.
+That's all! ABP will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../framework/infrastructure/distributed-locking.md) if you are new to distributed locking.
> **Warning**: Even if you have never used distributed locking in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your distributed lock server is shared among multiple systems.
> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed locking server. In such systems, all applications (or services) should normally use the same lock prefix, because you want to globally lock your resources in your system.
-> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for distributed locking. So, please check your application code if it is already configured.
+> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for distributed locking. Please check your application code to see if it has already been configured.
## Email Sender
ABP's [Email Sending](../framework/infrastructure/emailing.md) system abstracts sending emails from your application and module code and allows you to configure the email provider and settings in a single place.
-Email service is configured to write email contents to the standard [application log](../framework/fundamentals/logging.md) in development environment. You should configure the email settings to be able to send emails to users in your production environment.
+For the development environment, ABP will not send real emails. The email service is configured to write email contents in the development environment's standard [application log](../framework/fundamentals/logging.md). By default, it will write to the `Logs.txt` in your host project's `Logs` folder. You should configure the email settings to be able to send emails to users in your production environment.
-Please see the [Email Sending](../framework/infrastructure/emailing.md) document to learn how to configure its settings to really send emails.
+See the [Sending Email](../framework/infrastructure/emailing.md) document to learn what settings to configure to send actual email without writing to the logs.
> **Warning**: If you don't configure the email settings, you will get errors while trying to send emails. For example, the [Account module](../modules/account.md)'s *Password Reset* feature sends email to the users to reset their passwords if they forget it.
## SMS Sender
-ABP's [SMS Sending abstraction](../framework/infrastructure/sms-sending.md) provides a unified interface to send SMS to users. However, its implementation is left to you. Because, typically a paid SMS service is used to send SMS, and ABP doesn't depend on a specific SMS provider.
+ABP's [SMS Sending abstraction](../framework/infrastructure/sms-sending.md) provides a unified interface for sending SMS to users.
+However, its implementation is left to you. Typically, a paid SMS service is used to send SMS, and ABP doesn't depend on a specific SMS provider.
+> PRO users can use the [Twilio SMS module](../modules/twilio-sms.md) to send SMS.
-So, if you are using the `ISmsSender` service, you must implement it yourself, as shown in the following code block:
+In the following code-block you can see where to implement the `ISmsSender` service:
````csharp
public class MySmsSender : ISmsSender, ITransientDependency
@@ -89,11 +96,11 @@ Configure(options =>
});
````
-Note that ABP CLI automatically sets the password to a random value on a new project creation. However, it is stored in the `appsettings.json` file and is generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value.
+Note that ABP CLI automatically sets the password to a random value on new project creation. However, it is stored in the `appsettings.json` file and is generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value.
## Logging
-ABP uses .NET's standard [Logging services](../framework/fundamentals/logging.md). So, it is compatible with any logging provider that works with .NET. ABP's startup solution templates come with [Serilog](https://serilog.net/) pre-installed and configured for you. It writes logs to file system and console with the initial configuration. File system is useful for development environment, but it is suggested you to use a different provider for your production environment, like Elasticsearch, database or any other provider that can properly work.
+ABP uses .NET's standard [Logging services](../framework/fundamentals/logging.md). So, it is compatible with any logging provider that works with .NET. ABP's startup solution templates come with [Serilog](https://serilog.net/) pre-installed and configured for you. It writes logs to the file system and console with the initial configuration. The file system is useful for the development environment, but it is suggested you use a different provider for your production environment, like Elasticsearch, database or any other provider that can properly work.
## The Swagger UI
diff --git a/docs/en/deployment/distributed-microservice.md b/docs/en/deployment/distributed-microservice.md
index 933edf61cd..1a020b1e1b 100644
--- a/docs/en/deployment/distributed-microservice.md
+++ b/docs/en/deployment/distributed-microservice.md
@@ -1,6 +1,6 @@
# Deploying Distributed / Microservice Solutions
-The ABP is designed to consider distributed and microservice systems, where you have multiple applications and/or services communicating internally. All of its features are compatible with distributed scenarios. This document highlights some points you should care about when you deploy your distributed or microservice solution.
+ABP is designed for distributed and microservice systems, where multiple applications and/or services communicate internally. All of its features are compatible with distributed scenarios. This document highlights some points you should consider when deploying your distributed or microservice solution.
## Application Name & Instance Id
@@ -9,7 +9,7 @@ ABP provides the `IApplicationInfoAccessor` service that provides the following
* `ApplicationName`: A human-readable name for an application. It is a unique value for an application.
* `InstanceId`: A random (GUID) value generated by the ABP each time you start the application.
-These values are used by the ABP in several places to distinguish the application and the application instance (process) in the system. For example, the [audit logging](../framework/infrastructure/audit-logging.md) system saves the `ApplicationName` in each audit log record written by the related application, so you can understand which application has created the audit log entry. So, if your system consists of multiple applications saving audit logs to a single point, you should be sure that each application has a different `ApplicationName`.
+ABP uses these values in several places to distinguish the application and the application instance (process) in the system. For example, the [audit logging](../framework/infrastructure/audit-logging.md) system saves the `ApplicationName` in each audit log record written by the related application so you can understand which application has created the audit log entry. So, if your system consists of multiple applications saving audit logs to a single point, you should be sure that each application has a different `ApplicationName`.
The `ApplicationName` property's value is set automatically from the **entry assembly's name** (generally, the project name in a .NET solution) by default, which is proper for most cases, since each application typically has a unique entry assembly name.
@@ -32,13 +32,13 @@ await builder.AddApplicationAsync(options =>
## Using a Distributed Event Bus
-ABP's [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) system provides a standard interface to communicate with other applications and services. While the name is "distributed", the default implementation is in-process. That means, your applications / services can not communicate with each other unless you explicitly configure a distributed event bus provider.
+ABP's [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) system provides a standard interface for communicating with other applications and services. While the name is "distributed," the default implementation is in process. That means your applications/services can not communicate with each other unless you explicitly configure a distributed event bus provider.
-If you are building a distributed system, then the applications should communicate through an external distributed messaging server. Please follow the [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) document to learn how to install and configure your distributed event bus provider.
+The applications should communicate through an external distributed messaging server if you are building a distributed system. Please follow the [Distributed Event Bus](../framework/infrastructure/event-bus/distributed) document to learn how to install and configure your distributed event bus provider.
-> **Warning**: Even if you don't use the distributed event bus directly in your application code, the ABP and some of the modules you are using may use it. So, if you are building a distributed system, always configure a distributed event bus provider.
+> **Warning**: Even if you do not use the distributed event bus directly in your application code, ABP and some of the modules you are using may use it. So, if you are building a distributed system, always configure a distributed event bus provider.
-> **Info**: [Clustered deployment](./clustered-environment.md) of a single application is not considered as a distributed system. So, if you only have a single application with multiple instances serving behind a load balancer, a real distributed messaging server may not be needed.
+> **Info**: [Clustered deployment](./clustered-environment.md) of a single application is not considered as distributed system. So, a real distributed messaging server may not be needed if you only have a single application with multiple instances serving behind a load balancer.
## See Also
diff --git a/docs/en/deployment/index.md b/docs/en/deployment/index.md
index 50b6fd0938..3537e4593e 100644
--- a/docs/en/deployment/index.md
+++ b/docs/en/deployment/index.md
@@ -1,6 +1,6 @@
# Deployment
-Deploying an ABP application is not different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g. Azure, AWS, Google Could) or on-premise server, IIS or any other web server. ABP's documentation doesn't contain much information on deployment. You can refer to your provider's documentation.
+Deploying an ABP application is not different than deploying any .NET or ASP.NET Core application. You can deploy it to a cloud provider (e.g., Azure, AWS, Google Could) or an on-premise server, IIS or any other web server. ABP's documentation doesn't contain much information on deployment. You can refer to your provider's documentation.
However, there are some topics that you should care about when you are deploying your applications. Most of them are general software deployment considerations, but you should understand how to handle them within your ABP based applications. We've prepared guides for this purpose and we suggest you to read these guides carefully before designing your deployment configuration.
@@ -9,6 +9,6 @@ However, there are some topics that you should care about when you are deploying
* [Configuring SSL certificate(HTTPS)](./ssl.md): Explains how to configure SSL certificate(HTTPS) for your application.
* [Configuring OpenIddict](./configuring-openIddict.md): Notes for some essential configurations for OpenIddict.
* [Configuring for Production](./configuring-production.md): Notes for some essential configurations for production environments.
-* [Optimization for Production](./optimizing-production.md): Tips and suggestions for optimizing your application on production environments.
+* [Optimization for Production](./optimizing-production.md): Tips and suggestions for optimizing your application in production environments.
* [Deploying to a Clustered Environment](./clustered-environment.md): Explains how to configure your application when you want to run multiple instances of your application concurrently.
* [Deploying Distributed / Microservice Solutions](./distributed-microservice.md): Deployment notes for solutions consisting of multiple applications and/or services.
diff --git a/docs/en/deployment/optimizing-production.md b/docs/en/deployment/optimizing-production.md
index 3803493be7..d6689b77fe 100644
--- a/docs/en/deployment/optimizing-production.md
+++ b/docs/en/deployment/optimizing-production.md
@@ -1,22 +1,26 @@
# Optimizing Your Application for Production Environments
-ABP and the startup solution templates are configured well to get the maximum performance on production environments. However, there are still some points you need to pay attention to in order to optimize your system in production. In this document, we will mention some of these topics.
+ABP and the startup solution templates are configured well to get the maximum performance on production environments.
+However, you still need to pay attention to some points to optimize your system in production.
+This document will explain optimization points for the production environment.
## Caching Static Contents
-The following items are contents that can be cached in the client side (typically in the Browser) or in a CDN server:
+The following items are contents that can be cached on the client side (typically in the Browser) or in a CDN server:
-* **Static images** can always be cached. Here, you should be careful that if you change an image, use a different file name, or use a versioning query-string parameter, so the browser (or CDN) understands it's been changed.
-* **CSS and JavaScript files**. ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system always uses a query-string versioning parameter and a hash value in the files names of the CSS & JavaScript files for the [MVC (Razor Pages)](../framework/ui/mvc-razor-pages/overall.md) UI. So, you can safely cache these files in the client side or in a CDN server.
+* **Static images** can always be cached. Here, you should be careful that if you change an image, use a different file name, or use a versioning query-string parameter so the browser (or CDN) understands it's been changed.
+* **CSS and JavaScript files**. ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system always uses a query-string versioning parameter and a hash value in the files names of the CSS & JavaScript files for the [MVC (Razor Pages)](../framework/ui/mvc-razor-pages/overall.md) UI. So you can safely cache these files on the client side or on a CDN server.
* **Application bundle files** of an [Angular UI](../framework/ui/angular/quick-start.md) application.
-* **[Application Localization Endpoint](../framework/api-development/standard-apis/localization.md)** can be cached per culture (it already has a `cultureName` query string parameter) if you don't use dynamic localization on the server-side. ABP's [Language Management](https://abp.io/modules/Volo.LanguageManagement) module provides dynamic localization. If you're using it, you can't cache that endpoint forever. However, you can still cache it for a while. Applying dynamic localization text changes to the application can delay for a few minutes, even for a few hours in a real life scenario.
+* **[Application Localization Endpoint](../framework/api-development/standard-apis/localization.md)** can be cached per culture (it already has a `cultureName` query string parameter) if you don't use dynamic localization on the server-side. ABP's [Language Management](https://abp.io/modules/Volo.LanguageManagement) module provides dynamic localization. If you're using it, you can't cache that endpoint forever. However, you can still cache it for a while. Applying dynamic localization text changes to the application can delay a few minutes, even a few hours, in a real-life scenario.
-There may be more ways based on your solution structure and deployment environment, but these are the essential points you should consider to client-side cache in a production environment.
+There may be more ways based on your solution structure and deployment environment, but these are the essential points you should consider for client-side cache in a production environment.
## Bundling & Minification for MVC (Razor Pages) UI
-ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system automatically bundles, minifies and versions your CSS and JavaScript files in production environment. Normally, you don't need to do anything, if you haven't disabled it yourself in your application code. It is important to follow the [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) document and truly use the system to get the maximum optimization.
+ABP's [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) system automatically bundles, minifies and versions your CSS and JavaScript files in the production environment.
+Normally, you don't need to do anything if you have not disabled it yourself in your application code.
+It is important to follow the [bundling & minification](../framework/ui/mvc-razor-pages/bundling-minification.md) document and truly use the system to get the maximum optimization.
## Background Jobs
-ABP's [Background Jobs](../framework/infrastructure/background-jobs) system provides an abstraction with a basic implementation to enqueue jobs and execute them in a background thread. ABP's Default Background Job Manager may not be enough if you are adding too many jobs to the queue and want them to be executed in parallel by multiple servers with a high performance. If you need these, you should consider to configure a dedicated background job software, like [Hangfire](https://www.hangfire.io/). ABP has a pre-built [Hangfire integration](../framework/infrastructure/background-jobs/hangfire.md), so you can switch to Hangfire without changing your application code.
+ABP's [Background Jobs](../framework/infrastructure/background-jobs) system provides an abstraction with a basic implementation to enqueue jobs and execute them in a background thread. ABP's Default Background Job Manager may not be enough if you are adding too many jobs to the queue and want them to be executed in parallel by multiple servers with a high performance. If you need these, you should consider configuring a dedicated background job software, like [Hangfire](https://www.hangfire.io/). ABP has a pre-built [Hangfire integration](../framework/infrastructure/background-jobs/hangfire.md), so you can switch to Hangfire without changing your application code.
diff --git a/docs/en/deployment/ssl.md b/docs/en/deployment/ssl.md
index 81fbe8ae33..27c83ea80f 100644
--- a/docs/en/deployment/ssl.md
+++ b/docs/en/deployment/ssl.md
@@ -1,10 +1,8 @@
# Configuring SSL certificate(HTTPS)
-A website needs an SSL certificate in order to keep user data secure, verify ownership of the website, prevent attackers from creating a fake version of the site, and gain user trust.
-
-This document introduces how to get and use an SSL certificate(HTTPS) for your application.
-
+A website needs an SSL certificate to keep user data secure, verify ownership, prevent attackers from creating a fake version of the site, and gain user trust.
+This document introduces how to get and use an SSL certificate (HTTPS) for your application.
## Get an SSL Certificate from a Certificate Authority
@@ -16,16 +14,12 @@ Once you have a certificate, you need to configure your web server to use it. Th
* [Host ASP.NET Core on Linux with Nginx: HTTPS configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx)
* [How to Set Up SSL on IIS 7 or later](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis)
-
-
### How to get a free SSL certificate from Let's Encrypt?
Let's Encrypt is **a free, automated, and open certificate authority (CA)**. It gives the digital certificates to enable HTTPS (SSL/TLS) for websites. To get a free SSL certificate, we will use [acme.sh](https://github.com/acmesh-official/acme.sh) and Cloudflare DNS API to get a free SSL certificate from [Let's Encrypt](https://letsencrypt.org/).
> If you have any problem with the following steps, you can read the [acme.sh](https://github.com/acmesh-official/acme.sh/wiki/dnsapi) tutorial.
-
-
#### Install [acme.sh](https://github.com/acmesh-official/acme.sh)
Ensure that you have `curl` command in your terminal. And run the following command on your terminal:
@@ -34,11 +28,8 @@ Ensure that you have `curl` command in your terminal. And run the following comm
curl https://get.acme.sh | sh -s email=my@example.com
```
-
-
#### [Cloudflare DNS API token](https://dash.cloudflare.com/profile/api-tokens)
-
You will need to create an API token which either:
(i) has permission to edit a single specific DNS zone; or
@@ -58,8 +49,6 @@ You must give acme.sh the account ID of the Cloudflare account to which the rele
You provide this info by setting the environment variable CF_Account_ID to this account ID, e.g. run export CF_Account_ID="763eac4f1bcebd8b5c95e9fc50d010b4".
-
-
#### Issue a certificate
```bash
@@ -123,8 +112,6 @@ openssl pkcs12 -export \
If you want to set a password for the PFX file, you can set the password with `-passout pass:your_password`.
-
-
## Common Exceptions
If you encounter the following exceptions, it means your **certificate is not trusted by the client or the certificate is not valid**.
@@ -140,8 +127,6 @@ You will may see the following SSL certificate errors in your browser when you t
---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
```
-
-
## References
* [ABP IIS Deployment](./index.md)
diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json
index 80a23d6c37..9e920ef97c 100644
--- a/docs/en/docs-nav.json
+++ b/docs/en/docs-nav.json
@@ -23,19 +23,19 @@
"text": "Others",
"items": [
{
- "text": "Empty ASP.NET Core MVC / Razor Pages Application",
+ "text": "Empty ASP.NET Core Application",
"path": "get-started/empty-aspnet-core-application.md"
},
{
- "text": "MAUI Application Startup Template",
+ "text": "MAUI Application",
"path": "get-started/maui.md"
},
{
- "text": "WPF Application Startup Template",
+ "text": "WPF Application",
"path": "get-started/wpf.md"
},
{
- "text": "Console Application Startup Template",
+ "text": "Console Application",
"path": "get-started/console.md"
}
]
@@ -67,7 +67,7 @@
]
},
{
- "text": "Web Application Development",
+ "text": "Book Store Application",
"items": [
{
"text": "Overview",
@@ -657,7 +657,7 @@
"path": "framework/architecture"
},
{
- "text": "Module Development Best Practices & Conventions",
+ "text": "Module Development Best Practices",
"items": [
{
"text": "Overview",
@@ -1648,14 +1648,59 @@
},
{
"text": "Layered Solution",
- "path": "solution-templates/layered-web-application"
+ "path": "solution-templates/layered-web-application",
+ "items": [
+ {
+ "text": "Deployment",
+ "path": "solution-templates/layered-web-application/deployment",
+ "items": [
+ {
+ "text": "Docker Deployment",
+ "path": "solution-templates/layered-web-application/deployment/deployment-docker-compose.md"
+ },
+ {
+ "text": "Azure Deployment",
+ "items": [
+ {
+ "text": "Deploy to Azure Web App Service",
+ "path": "solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md"
+ },
+ {
+ "text": "Creating an Azure Web App Service Environment",
+ "path": "solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md"
+ },
+ {
+ "text": "Customizing the Configuration of Your ABP Application",
+ "path": "solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md"
+ },
+ {
+ "text": "Deploying Application With GitHub Actions",
+ "path": "solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md"
+ }
+ ]
+ },
+ {
+ "text": "IIS Deployment",
+ "path": "solution-templates/layered-web-application/deployment/deployment-iis.md"
+ },
+ {
+ "text": "IdentityServer Deployment",
+ "path": "solution-templates/layered-web-application/deployment/identityserver-deployment.md"
+ },
+ {
+ "text": "OpenIddict Deployment",
+ "path": "solution-templates/layered-web-application/deployment/openiddict-deployment.md"
+ }
+ ]
+ }
+ ]
},
{
"text": "Microservice Solution",
"path": "solution-templates/microservice"
},
{
- "text": "Module Solution",
+ "text": "Application Module",
"path": "solution-templates/application-module"
}
]
@@ -1673,7 +1718,16 @@
},
{
"text": "Account (Pro)",
- "path": "modules/account-pro.md"
+ "items": [
+ {
+ "text": "Overview",
+ "path": "modules/account-pro.md"
+ },
+ {
+ "text": "Tenant impersonation & User impersonation",
+ "path": "modules/account/impersonation.md"
+ }
+ ]
},
{
"text": "Audit Logging",
@@ -1886,13 +1940,17 @@
"text": "Overview",
"path": "samples"
},
+ {
+ "text": "EventHub",
+ "path": "https://github.com/abpframework/eventhub"
+ },
{
"text": "eShopOnAbp",
"path": "https://github.com/abpframework/eShopOnAbp"
},
{
- "text": "EventHub",
- "path": "https://github.com/abpframework/eventhub"
+ "text": "CMS Kit Demo",
+ "path": "https://github.com/abpframework/cms-kit-demo"
},
{
"text": "Easy CRM",
diff --git a/docs/en/framework/architecture/domain-driven-design/specifications.md b/docs/en/framework/architecture/domain-driven-design/specifications.md
index 867080b86e..68ff038b7e 100644
--- a/docs/en/framework/architecture/domain-driven-design/specifications.md
+++ b/docs/en/framework/architecture/domain-driven-design/specifications.md
@@ -81,7 +81,7 @@ namespace MyProject
{
public class CustomerService : ITransientDependency
{
- public async Task BuyAlcohol(Customer customer)
+ public async Task BookRoom(Customer customer)
{
if (!new Age18PlusCustomerSpecification().IsSatisfiedBy(customer))
{
@@ -120,7 +120,7 @@ namespace MyProject
_customerRepository = customerRepository;
}
- public async Task> GetCustomersCanBuyAlcohol()
+ public async Task> GetCustomersCanBookRoom()
{
var queryable = await _customerRepository.GetQueryableAsync();
var query = queryable.Where(
@@ -254,4 +254,4 @@ Some benefits of using specifications:
### When To Not Use?
- **Non business expressions**: Do not use specifications for non business-related expressions and operations.
-- **Reporting**: If you are just creating a report, do not create specifications, but directly use `IQueryable` & LINQ expressions. You can even use plain SQL, views or another tool for reporting. DDD does not necessarily care about reporting, so the way you query the underlying data store can be important from a performance perspective.
\ No newline at end of file
+- **Reporting**: If you are just creating a report, do not create specifications, but directly use `IQueryable` & LINQ expressions. You can even use plain SQL, views or another tool for reporting. DDD does not necessarily care about reporting, so the way you query the underlying data store can be important from a performance perspective.
diff --git a/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md b/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md
index 7cb7b8e421..8a5b50652e 100644
--- a/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md
+++ b/docs/en/framework/architecture/modularity/extending/module-entity-extensions.md
@@ -48,7 +48,7 @@ public static void ConfigureExtraProperties()
* `AddOrUpdateProperty` gets a second argument (the `property =>` lambda expression) to configure additional options for the new property.
* We can add data annotation attributes like shown here, just like adding a data annotation attribute to a class property.
-#### Create & Update Forms
+### Create & Update Forms
Once you define a property, it appears in the create and update forms of the related entity:
diff --git a/docs/en/framework/data/entity-framework-core/migrations.md b/docs/en/framework/data/entity-framework-core/migrations.md
index 5528b34291..93a5e3905f 100644
--- a/docs/en/framework/data/entity-framework-core/migrations.md
+++ b/docs/en/framework/data/entity-framework-core/migrations.md
@@ -4,7 +4,7 @@ This document begins by **introducing the default structure** provided by [the a
> This document is for who want to fully understand and customize the database structure comes with [the application startup template](../../../solution-templates/layered-web-application). If you simply want to create entities and manage your code first migrations, just follow [the startup tutorials](../../../tutorials/book-store/part-01.md).
-### Source Code
+## Source Code
You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo). However, you need to read and understand this document in order to understand the example project's source code.
@@ -554,4 +554,4 @@ This document explains how to split your databases and manage your database migr
## Source Code
-You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo). You can also find the changes explained in this document as a [single commit](https://github.com/abpframework/abp-samples/pull/95/commits/c2ffd76175e0a6fdfcf6477bbaea23dc2793fedd).
\ No newline at end of file
+You can find the source code of the example project referenced by this document [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo). You can also find the changes explained in this document as a [single commit](https://github.com/abpframework/abp-samples/pull/95/commits/c2ffd76175e0a6fdfcf6477bbaea23dc2793fedd).
diff --git a/docs/en/framework/fundamentals/exception-handling.md b/docs/en/framework/fundamentals/exception-handling.md
index 44692e8e68..a85ae58e24 100644
--- a/docs/en/framework/fundamentals/exception-handling.md
+++ b/docs/en/framework/fundamentals/exception-handling.md
@@ -31,7 +31,7 @@ Error Message is an instance of the `RemoteServiceErrorResponse` class. The simp
There are **optional fields** those can be filled based upon the exception that has occurred.
-##### Error Code
+#### Error Code
Error **code** is an optional and unique string value for the exception. Thrown `Exception` should implement the `IHasErrorCode` interface to fill this field. Example JSON value:
@@ -46,7 +46,7 @@ Error **code** is an optional and unique string value for the exception. Thrown
Error code can also be used to localize the exception and customize the HTTP status code (see the related sections below).
-##### Error Details
+#### Error Details
Error **details** in an optional field of the JSON error message. Thrown `Exception` should implement the `IHasErrorDetails` interface to fill this field. Example JSON value:
@@ -60,7 +60,7 @@ Error **details** in an optional field of the JSON error message. Thrown `Except
}
```
-##### Validation Errors
+#### Validation Errors
**validationErrors** is a standard field that is filled if the thrown exception implements the `IHasValidationErrors` interface.
@@ -340,4 +340,4 @@ Here, a list of the options you can configure:
## See Also
-* [Video tutorial](https://abp.io/video-courses/essentials/exception-handling)
\ No newline at end of file
+* [Video tutorial](https://abp.io/video-courses/essentials/exception-handling)
diff --git a/docs/en/framework/fundamentals/localization.md b/docs/en/framework/fundamentals/localization.md
index 61f8e58691..61118fd742 100644
--- a/docs/en/framework/fundamentals/localization.md
+++ b/docs/en/framework/fundamentals/localization.md
@@ -183,7 +183,7 @@ public class MyService : ITransientDependency
}
````
-##### Format Arguments
+### Format Arguments
Format arguments can be passed after the localization key. If your message is `Hello {0}, welcome!`, then you can pass the `{0}` argument to the localizer like `_localizer["HelloMessage", "John"]`.
@@ -255,4 +255,4 @@ See the following documents to learn how to reuse the same localization texts in
* [Localization for the MVC / Razor Pages UI](../ui/mvc-razor-pages/javascript-api/localization)
* [Localization for the Blazor UI](../ui/blazor/localization.md)
* [Localization for the Angular UI](../ui/angular/localization.md)
-* [Video tutorial](https://abp.io/video-courses/essentials/localization)
\ No newline at end of file
+* [Video tutorial](https://abp.io/video-courses/essentials/localization)
diff --git a/docs/en/framework/infrastructure/audit-logging.md b/docs/en/framework/infrastructure/audit-logging.md
index f14d522d25..f04bfafbe5 100644
--- a/docs/en/framework/infrastructure/audit-logging.md
+++ b/docs/en/framework/infrastructure/audit-logging.md
@@ -14,7 +14,7 @@ An **audit log object** (see the Audit Log Object section below) is typically cr
> [Startup templates](../../solution-templates) are configured for the audit logging system which is suitable for most of the applications. Use this document for a detailed control over the audit log system.
-### Database Provider Support
+## Database Provider Support
* Fully supported by the [Entity Framework Core](../data/entity-framework-core) provider.
* Entity change logging is not supported by the [MongoDB](../data/mongodb) provider. Other features work as expected.
diff --git a/docs/en/framework/infrastructure/json.md b/docs/en/framework/infrastructure/json.md
index d5bdc8c22e..67126edceb 100644
--- a/docs/en/framework/infrastructure/json.md
+++ b/docs/en/framework/infrastructure/json.md
@@ -63,7 +63,7 @@ Properties:
Add [Volo.Abp.Json.Newtonsoft](https://www.nuget.org/packages/Volo.Abp.Json.Newtonsoft) package and depends on `AbpJsonNewtonsoftModule` to replace the `System Text Json`.
-#### AbpNewtonsoftJsonSerializerOptions
+### AbpNewtonsoftJsonSerializerOptions
- **JsonSerializerSettings(`Newtonsoft.Json.JsonSerializerSettings`)**: Global options for Newtonsoft library operations. See [here](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonSerializerSettings.htm) for reference.
diff --git a/docs/en/framework/ui/angular/account-module.md b/docs/en/framework/ui/angular/account-module.md
index dac9771fb7..eb149af61e 100644
--- a/docs/en/framework/ui/angular/account-module.md
+++ b/docs/en/framework/ui/angular/account-module.md
@@ -7,7 +7,7 @@ If you add the account module to your project;
- "My account" link in the current user dropdown on the top bar will redirect the user to a page in the account module.
- You can switch the authentication flow to the resource owner password flow.
-### Account Module Implementation
+## Account Module Implementation
Install the `@abp/ng.account` NPM package by running the below command:
@@ -49,7 +49,7 @@ const routes: Routes = [
export class AppRoutingModule {}
```
-### Account Public Module Implementation for Commercial Templates
+## Account Public Module Implementation for Commercial Templates
The pro startup template comes with `@volo/abp.ng.account` package. You should update the package version to v4.3 or higher version. The package can be updated by running the following command:
@@ -97,11 +97,11 @@ const routes: Routes = [
export class AppRoutingModule {}
```
-### My Account Page
+## My Account Page
Before v4.3, the "My account" link in the current user dropdown on the top bar redirected the user to MVC's profile management page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account module instead.
-### Personal Info Page Confirm Message
+## Personal Info Page Confirm Message
When the user changes their own data on the personal settings tab in My Account, The data can not update the CurrentUser key of Application-Configuration. The information of the user is stored in claims. The only way to apply this information to the CurrentUser of Application-Configuration is user should log out and log in. When the Refresh-Token feature is implemented, it will be fixed. So We've added a confirmation alert.
@@ -119,11 +119,11 @@ const routes: Routes = [
export class AppRoutingModule {}
```
-### Security Logs Page [COMMERCIAL]
+## Security Logs Page [COMMERCIAL]
Before v4.3, the "Security Logs" link in the current user dropdown on the top bar redirected the user to MVC's security logs page. As of v4.3, if you added the account module to your project, the same link will land on a page in the Angular UI account public module instead.
-### Resource Owner Password Flow
+## Resource Owner Password Flow
OAuth is preconfigured as authorization code flow in Angular application templates by default. If you added the account module to your project, you can switch the flow to resource owner password flow by changing the OAuth configuration in the _environment.ts_ files as shown below:
diff --git a/docs/en/framework/ui/angular/current-user.md b/docs/en/framework/ui/angular/current-user.md
index c4b5e3db14..8d90b0cfda 100644
--- a/docs/en/framework/ui/angular/current-user.md
+++ b/docs/en/framework/ui/angular/current-user.md
@@ -2,7 +2,7 @@
The current user information stored in Config State.
-### How to Get a Current User Information Configuration
+## How to Get a Current User Information Configuration
You can use the `getOne` or `getOne$` method of `ConfigStateService` to get a specific configuration property. For that, the property name should be passed to the method as parameter.
diff --git a/docs/en/framework/ui/angular/datetime-format-pipe.md b/docs/en/framework/ui/angular/datetime-format-pipe.md
index 3a95b25379..88eb9fb604 100644
--- a/docs/en/framework/ui/angular/datetime-format-pipe.md
+++ b/docs/en/framework/ui/angular/datetime-format-pipe.md
@@ -11,21 +11,21 @@ Example
ShortDate, ShortTime and ShortDateTime format data like angular's data pipe but easier. Also the pipes get format from config service by culture.
-# ShortDate Pipe
+## ShortDate Pipe
```html
{{today | shortDate }}
```
-# ShortTime Pipe
+## ShortTime Pipe
```html
{{today | shortTime }}
```
-# ShortDateTime Pipe
+## ShortDateTime Pipe
```html
{{today | shortDateTime }}
diff --git a/docs/en/framework/ui/angular/http-error-handling.md b/docs/en/framework/ui/angular/http-error-handling.md
index 21e13d46e7..e165ac7125 100644
--- a/docs/en/framework/ui/angular/http-error-handling.md
+++ b/docs/en/framework/ui/angular/http-error-handling.md
@@ -1,6 +1,6 @@
# HTTP Error Handling
-### Error Configurations
+## Error Configurations
ABP offers a configurations for errors handling like below
diff --git a/docs/en/framework/ui/angular/images/list-service-request-status.gif b/docs/en/framework/ui/angular/images/list-service-request-status.gif
new file mode 100644
index 0000000000..a387258d0a
Binary files /dev/null and b/docs/en/framework/ui/angular/images/list-service-request-status.gif differ
diff --git a/docs/en/framework/ui/angular/list-service.md b/docs/en/framework/ui/angular/list-service.md
index 8df8b945d7..e657cdab1b 100644
--- a/docs/en/framework/ui/angular/list-service.md
+++ b/docs/en/framework/ui/angular/list-service.md
@@ -139,35 +139,85 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide
```
-...or...
+## Handle request status
+To handle the request status `ListService` provides a `requestStatus$` observable. This observable emits the current status of a request, which can be one of the following values: `idle`, `loading`, `success` or `error`. These statuses allow you to easily manage the UI flow based on the request's state.
+
```js
- @Select(BookState.getBooks)
- books$: Observable;
+import { ListService } from '@abp/ng.core';
+import { AsyncPipe } from '@angular/common';
+import { Component, inject } from '@angular/core';
+import { BookDto, BooksService } from './books.service';
- @Select(BookState.getBookCount)
- bookCount$: Observable;
+@Component({
+ standalone: true,
+ selector: 'app-books',
+ templateUrl: './books.component.html',
+ providers: [ListService, BooksService],
+ imports: [AsyncPipe],
+})
+export class BooksComponent {
+ list = inject(ListService);
+ booksService = inject(BooksService);
- ngOnInit() {
- this.list.hookToQuery((query) => this.store.dispatch(new GetBooks(query))).subscribe();
+ items = new Array();
+ count = 0;
+
+ //It's an observable variable
+ requestStatus$ = this.list.requestStatus$;
+
+ ngOnInit(): void {
+ this.list
+ .hookToQuery(() => this.booksService.getList())
+ .subscribe(response => {
+ this.items = response.items;
+ this.count = response.totalCount;
+ });
}
+}
```
-
+{%{
```html
-
-
-
-
-
+
```
-
-> We do not recommend using the NGXS store for CRUD pages unless your application needs to share list information between components or use it later on in another page.
+}%}
## How to Refresh Table on Create/Update/Delete
@@ -183,15 +233,6 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide
});
```
-...or...
-
-```js
- this.store.dispatch(new DeleteBook(id)).subscribe(this.list.get);
-```
-
-> We do not recommend using the NGXS store for CRUD pages unless your application needs to share list information between components or use it later on in another page.
-
-
## How to Implement Server-Side Search in a Table
`ListService` exposes a `filter` property that will trigger a request with the current query and the given search string. All you need to do is to bind it to an input element with two-way binding.
diff --git a/docs/en/framework/ui/angular/localization.md b/docs/en/framework/ui/angular/localization.md
index 9f2b71bc7b..4ff0744212 100644
--- a/docs/en/framework/ui/angular/localization.md
+++ b/docs/en/framework/ui/angular/localization.md
@@ -215,7 +215,7 @@ The localizations above can be used like this:
As of v2.9 ABP has RTL support. If you are generating a new project with v2.9 and above, everything is set, you do not need to do any changes. If you are migrating your project from an earlier version, please follow the 2 steps below:
-#### Step 1. Create Chunks for Bootstrap LTR and RTL
+### Step 1. Create Chunks for Bootstrap LTR and RTL
Find [styles configuration in angular.json](https://angular.io/guide/workspace-config#style-script-config) and make sure the chunks in your project has `bootstrap-rtl.min` and `bootstrap-ltr.min` as shown below.
@@ -257,7 +257,7 @@ Find [styles configuration in angular.json](https://angular.io/guide/workspace-c
}
```
-#### Step 2. Clear Lazy Loaded Fontawesome in AppComponent
+### Step 2. Clear Lazy Loaded Fontawesome in AppComponent
If you have created and injected chunks for Fontawesome as seen above, you no longer need the lazy loading in the `AppComponent` which was implemented before v2.9. Simply remove them. The `AppComponent` in the template of the new version looks like this:
diff --git a/docs/en/framework/ui/angular/sorting-navigation-elements.md b/docs/en/framework/ui/angular/sorting-navigation-elements.md
index 07267957a6..7385a1681c 100644
--- a/docs/en/framework/ui/angular/sorting-navigation-elements.md
+++ b/docs/en/framework/ui/angular/sorting-navigation-elements.md
@@ -5,7 +5,7 @@ This documentation describes how the navigation elements are sorted and how to c
- When you want to add the `Navigation Element` you can use the `RoutesService`. For more details, see the [document](../angular/modifying-the-menu.md).
- However, in this documentation, we will talk more about how to sort the navigation elements.
-### Order Property
+## Order Property
- Normally, you are able to sort your routes with this property. But you can customize our default sorting algorithm.
diff --git a/docs/en/framework/ui/mvc-razor-pages/basic-theme.md b/docs/en/framework/ui/mvc-razor-pages/basic-theme.md
index 9178d3e22a..ca4ca98144 100644
--- a/docs/en/framework/ui/mvc-razor-pages/basic-theme.md
+++ b/docs/en/framework/ui/mvc-razor-pages/basic-theme.md
@@ -85,7 +85,7 @@ See the [User Interface Customization Guide](customization-user-interface.md) to
You can run the following [ABP CLI](../../../cli) command in **Web** project directory to copy the source code to your solution:
-`abp add-module Volo.BasicTheme --with-source-code --add-to-solution-file`
+`abp add-source-code Volo.Abp.BasicTheme`
----
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png
index 9f9df8991f..af701b00d8 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png
index 4a2d3c2dd2..cf6700d1b6 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options.png differ
diff --git a/docs/en/get-started/layered-web-application.md b/docs/en/get-started/layered-web-application.md
index 0b051b9681..188e0cfd15 100644
--- a/docs/en/get-started/layered-web-application.md
+++ b/docs/en/get-started/layered-web-application.md
@@ -41,7 +41,7 @@ The following tools should be installed on your development machine:
## Creating a New Solution
-> 🛈 This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. **ABP Studio** is in the beta version now. If you have any issues, you can use the [ABP CLI](../cli/index.md) to create new solutions. You can also use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands for new project creations.
+> This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. **ABP Studio** is in the beta version now. If you have any issues, you can use the [ABP CLI](../cli/index.md) to create new solutions. You can also use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands for new project creations.
> ABP startup solution templates have many options for your specific needs. If you don't understand an option that probably means you don't need it. We selected common defaults for you, so you can leave these options as they are.
@@ -119,7 +119,7 @@ Here, you can select the database management systems (DBMS){{ if DB == "EF" }} a

-If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, such as Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login.
+If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, such as Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include or exclude the test projects from the solution.
Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:
diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md
index 47f1091b14..5be705e215 100644
--- a/docs/en/get-started/microservice.md
+++ b/docs/en/get-started/microservice.md
@@ -71,7 +71,7 @@ Click the Next button to see *Additional Options* selection:

-If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login.
+If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include the test projects in the solution.
Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:
diff --git a/docs/en/images/my-externa-logins.png b/docs/en/images/my-externa-logins.png
new file mode 100644
index 0000000000..6bb1eeea7e
Binary files /dev/null and b/docs/en/images/my-externa-logins.png differ
diff --git a/docs/en/images/new-external-login.png b/docs/en/images/new-external-login.png
new file mode 100644
index 0000000000..08fa250936
Binary files /dev/null and b/docs/en/images/new-external-login.png differ
diff --git a/docs/en/images/require-local-password-on-social-account-linking.png b/docs/en/images/require-local-password-on-social-account-linking.png
new file mode 100644
index 0000000000..baed8f3956
Binary files /dev/null and b/docs/en/images/require-local-password-on-social-account-linking.png differ
diff --git a/docs/en/index.md b/docs/en/index.md
index e8bdac3184..187bd6ff83 100644
--- a/docs/en/index.md
+++ b/docs/en/index.md
@@ -2,6 +2,7 @@
ABP 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, pre-built application modules, UI themes, tooling, guides and documentation to implement that architecture properly and **automate the details** and repetitive works as much as possible.
+## Why ABP Platform?
The following pages outline why you should use the ABP Platform and how it is used:
* [Why choose ABP?](https://abp.io/why-choose-abp)
diff --git a/docs/en/modules/account-pro.md b/docs/en/modules/account-pro.md
index 7c4b53ffb5..327a274f84 100644
--- a/docs/en/modules/account-pro.md
+++ b/docs/en/modules/account-pro.md
@@ -119,7 +119,7 @@ Follow the steps below to install a new external/social login. We will show Face
#### Add the NuGet Package
-Add the [Microsoft.AspNetCore.Authentication.Facebook](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Facebook) package to your project. Based on your architecture, this can be `.Web`, `.IdentityServer` (for tiered setup) or `.Host` project.
+Add the [Microsoft.AspNetCore.Authentication.Facebook](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Facebook) package to your project. Based on your architecture, this can be `.Web`, `.AuthServer` (for tiered setup) or `.Host` project.
#### Configure the Provider
@@ -194,12 +194,26 @@ context.Services.AddAuthentication()
context.Services.TryAddEnumerable(ServiceDescriptor.Singleton, OpenIdConnectPostConfigureAccountExternalProviderOptions>());
````
-#### For Tiered / Separate IdentityServer Solutions
+#### For Tiered / Separate AuthServer Solutions
-If your `.IdentityServer` is separated from the `.Host` project, then the `.Host` project should also be configured.
+If your `.AuthServer` is separated from the `.Host` project, then the `.Host` project should also be configured.
* Add the [Microsoft.AspNetCore.Authentication.Facebook](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Facebook) package to your `.Host` project.
-* Add `WithDynamicOptions()` configuration into the `ConfigureServices` method of your module (just copy the all code above and remove the `.AddFacebook(...)` part since it is only needed in the IdentityServer side).
+* Add `WithDynamicOptions()` configuration into the `ConfigureServices` method of your module (just copy the all code above and remove the `.AddFacebook(...)` part since it is only needed in the AuthServer side).
+
+## Manage External Logins
+
+You can link an external login in `Account/ExternalLogins` page of `Account` module.
+
+
+
+
+
+### Social Account Security Setting
+
+Users who register via both local registration and external/social login using the same email address will be required to enter their local password on the first external/social login.
+
+
## Internals
diff --git a/docs/en/modules/account/impersonation.md b/docs/en/modules/account/impersonation.md
index a086729054..e814a414b2 100644
--- a/docs/en/modules/account/impersonation.md
+++ b/docs/en/modules/account/impersonation.md
@@ -71,7 +71,7 @@ No need to do anything here.
#### Web
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` on your `WebModule`
-2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
+2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
@@ -197,7 +197,7 @@ No need to do anything here.
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` and `AbpAccountPublicBlazorServerModule(Volo.Abp.Account.Pro.Public.Blazor.Server)` on your `BlazorModule`
-2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
+2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
{
@@ -258,6 +258,20 @@ if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
}
```
+Add `impersonation: { userImpersonation: true, tenantImpersonation: true}` object to `oAuthConfig` of `environment` if not exits.
+
+```js
+export const environment = {
+ //Other props..
+ oAuthConfig: {
+ //Other props..
+ impersonation: {
+ userImpersonation: true,
+ tenantImpersonation: true,
+ },
+ },
+```
+
### Blazor WASM
It is currently not supported.
@@ -287,7 +301,7 @@ public override void ConfigureServices(ServiceConfigurationContext context)
#### Web
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` on your `WebModule`
-2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
+2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
@@ -353,7 +367,7 @@ public override void ConfigureServices(ServiceConfigurationContext context)
1. Depends `AbpAccountPublicWebImpersonationModule(Volo.Abp.Account.Pro.Public.Web.Impersonation)` and `AbpAccountPublicBlazorServerModule(Volo.Abp.Account.Pro.Public.Blazor.Server)` on your `BlazorModule`
-2. Chnage the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
+2. Change the base class of `AccountController` to `AbpAccountImpersonationChallengeAccountController`
```cs
public class AccountController : AbpAccountImpersonationChallengeAccountController
{
diff --git a/docs/en/modules/chat.md b/docs/en/modules/chat.md
index 6a7930e3c3..589980ec98 100644
--- a/docs/en/modules/chat.md
+++ b/docs/en/modules/chat.md
@@ -100,19 +100,19 @@ You can visit [Chat module package list page](https://abp.io/packages?moduleName
## User interface
-#### Manage chat feature
+### Manage chat feature
Chat module defines the chat feature, you need to enable the chat feature to use chat.

-#### Chat page
+### Chat page
This is the page that users send messages to each other.

-#### Chat icon on navigation bar
+### Chat icon on navigation bar
An icon that shows unread message count of the user and leads to chat page when clicked is added to navigation menu.
diff --git a/docs/en/modules/cms-kit/marked-items.md b/docs/en/modules/cms-kit/marked-items.md
index b6b0af4173..05b9dd9e06 100644
--- a/docs/en/modules/cms-kit/marked-items.md
+++ b/docs/en/modules/cms-kit/marked-items.md
@@ -58,6 +58,32 @@ The marking system provides a toggle widget to allow users to add/remove the mar
* `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here.
* `needsConfirmation` An optional parameter to let the user confirm when removing the mark.
+### Filtering on Marked Items
+
+Users can filter their marked items to easily find their favorites. Here's how to utilize the `GetEntityIdsFilteredByUserAsync` method to filter the user's marked items within your repository queries:
+
+```csharp
+List entityIdFilters = null;
+if (userId.HasValue)
+{
+ entityIdFilters = await UserMarkedItemRepository.GetEntityIdsFilteredByUserAsync(
+ userId.Value,
+ entityType,
+ cancellationToken: cancellationToken
+ );
+}
+
+var queryable = (await GetDbSetAsync())
+ .WhereIf(entityIdFilters != null, x => entityIdFilters.Contains(x.Id.ToString()));
+
+// Additional query logic...
+```
+
+- `GetEntityIdsFilteredByUserAsync`: Retrieves a list of entity IDs marked by the user for the given entity type.
+- `userId`: The ID of the user performing the filtering.
+- `entityType`: The type of entity being filtered (e.g., "product").
+- `entityIdFilters`: A list of marked entity IDs that will be used to filter the items in the database.
+
# Internals
## Domain Layer
diff --git a/docs/en/modules/gdpr.md b/docs/en/modules/gdpr.md
index 45d380ecd9..76875e0403 100644
--- a/docs/en/modules/gdpr.md
+++ b/docs/en/modules/gdpr.md
@@ -236,9 +236,17 @@ This [Event Transfer Object](../framework/infrastructure/event-bus/distributed#e
Cookie Consent can be used to inform the users of the application, before saving any specific data about the users.
-This feature is enabled by default for the [Application](../solution-templates/layered-web-application) and [Application Single Layer](../solution-templates/single-layer-web-application) Startup Templates.
+This feature is enabled by default for the [Application](../solution-templates/layered-web-application) and [Application Single Layer](../solution-templates/single-layer-web-application) Startup Templates. You can easily enable/disable showing Cookie Consent by configuring the `AbpCookieConsentOptions`
-> You can easily enable/disable to show the Cookie Consent by configuring the `AbpCookieConsentOptions`, which explained above.
+If you want to override the texts in the Cookie Consent component, you just need to define the following localization keys in your localization resource files and change text as you wish:
+
+```json
+ "ThisWebsiteUsesCookie": "This website uses cookies to ensure you get the best experience on the website.",
+ "CookieConsentAgreePolicies": "If you continue to browse, then you agree to our {0} and {1}.",
+ "CookieConsentAgreePolicy": "If you continue to browse, then you agree to our {0}.",
+```
+
+> Refer to the [Localization documentation](../framework/fundamentals/localization.md) for more info about defining localization resources and overriding existing localization entries that comes from pre-built modules.
### Configuring the Cookie Consent
diff --git a/docs/en/modules/openiddict-pro.md b/docs/en/modules/openiddict-pro.md
index b9102cee6d..b70cd83ac2 100644
--- a/docs/en/modules/openiddict-pro.md
+++ b/docs/en/modules/openiddict-pro.md
@@ -333,7 +333,7 @@ LogoutController -> connect/logout
UserInfoController -> connect/userinfo
```
-#### AbpOpenIddictAspNetCoreOptions
+### AbpOpenIddictAspNetCoreOptions
`AbpOpenIddictAspNetCoreOptions` can be configured in the `PreConfigureServices` method of your OpenIddict [module](../framework/architecture/modularity/basics.md).
diff --git a/docs/en/modules/openiddict.md b/docs/en/modules/openiddict.md
index f3e8f88975..5f421d9001 100644
--- a/docs/en/modules/openiddict.md
+++ b/docs/en/modules/openiddict.md
@@ -516,7 +516,7 @@ In the module's `app` directory there are six projects(including `angular`)
* `OpenIddict.Demo.Client.BlazorWASM:` ASP NET Core Blazor application using `OidcAuthentication` for authentication.
* `angular`: An angular application that integrates the abp ng modules and uses oauth for authentication.
-#### How to run?
+### How to run?
Confirm the connection string of `appsettings.json` in the `OpenIddict.Demo.Server` project. Running the project will automatically create the database and initialize the data.
After running the `OpenIddict.Demo.API` project, then you can run the rest of the projects to test.
diff --git a/docs/en/modules/tenant-management.md b/docs/en/modules/tenant-management.md
index b5e7f6156d..4116bccb33 100644
--- a/docs/en/modules/tenant-management.md
+++ b/docs/en/modules/tenant-management.md
@@ -6,7 +6,7 @@
> Please **refer to the [Multi-Tenancy](../framework/architecture/multi-tenancy) documentation** to understand the multi-tenancy system of the ABP. This document focuses on the Tenant Management module.
-### About the ABP SaaS Module
+## About the ABP SaaS Module
The [SaaS Module](https://abp.io/modules/Volo.Saas) is an alternative implementation of this module with more features and possibilities. It is distributed as a part of the [ABP](https://abp.io/) subscription.
diff --git a/docs/en/release-info/migration-guides/abp-8-3.md b/docs/en/release-info/migration-guides/abp-8-3.md
index 50a7f274a4..b68805a3ab 100644
--- a/docs/en/release-info/migration-guides/abp-8-3.md
+++ b/docs/en/release-info/migration-guides/abp-8-3.md
@@ -49,10 +49,32 @@ However, notice this package is used by the `@abp/aspnetcore.mvc.ui.theme.shared
See the PR for more info: https://github.com/abpframework/abp/pull/19340
+### `ApplyAbpConcepts` to Entities Whose Navigation Properties Changed
+
+In this version, we have started updating entities' `EntityVersion`, `ModificationAuditProperties`, and `ConcurrencyStamp` properties whenever their navigation property changes. Normally, this should not affect your code, however, you may need to fix your tests or codebase for this change. Please see [#20012](https://github.com/abpframework/abp/pull/20012#issuecomment-2438383059) for more information.
+
### Angular UI
We wish to formally inform you that ABP version 8.3 has been upgraded to incorporate Angular version 18. Consequently, we recommend migrating your application to [Angular v18](https://angular.dev/update-guide) to ensure compatibility.
+#### Tenant impersonation & User impersonation
+
+Add the `impersonation: { userImpersonation: true, tenantImpersonation: true}` object to the `oAuthConfig` of the environment if it does not exit.
+
+```
+export const environment = {
+ //Other props..
+ oAuthConfig: {
+ //Other props..
+ impersonation: {
+ userImpersonation: true,
+ tenantImpersonation: true,
+ },
+ },
+```
+
+See https://abp.io/docs/latest/modules/account/impersonation#angular
+
## PRO
> Please check the **Open-Source (Framework)** section before reading this section. The listed topics might affect your application and you might need to take care of them.
@@ -65,4 +87,4 @@ ABP provides a [URL Forwarding System](../../modules/cms-kit-pro/url-forwarding.
Since a new property has been added to the `CmsShortenedUrl` entity, you should create a new migration and apply it to your database.
-> After creating a new migration and applying it to your database, typically you don't need to make any changes, however, if you have overridden a page/method or class related to the URL Forwarding System, you might need to update it accordingly. For this purpose, you can get the source code of the [CMS Kit Module's](../../modules/cms-kit-pro/index.md) and update the related parts in your application.
\ No newline at end of file
+> After creating a new migration and applying it to your database, typically you don't need to make any changes, however, if you have overridden a page/method or class related to the URL Forwarding System, you might need to update it accordingly. For this purpose, you can get the source code of the [CMS Kit Module's](../../modules/cms-kit-pro/index.md) and update the related parts in your application.
diff --git a/docs/en/release-info/migration-guides/abp-9-0.md b/docs/en/release-info/migration-guides/abp-9-0.md
new file mode 100644
index 0000000000..5158b1722d
--- /dev/null
+++ b/docs/en/release-info/migration-guides/abp-9-0.md
@@ -0,0 +1,100 @@
+# ABP Version 9.0 Migration Guide
+
+This document is a guide for upgrading ABP v8.x solutions to ABP v9.0. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
+
+> ABP upgraded to .NET 9.0, so you need to move your solutions to .NET 9.0 if you want to use the ABP 9.0. You can check the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation.
+
+## Open-Source (Framework)
+
+### Upgraded to .NET 9.0
+
+We've upgraded ABP to .NET 9.0, so you need to move your solutions to .NET 9.0 if you want to use ABP 9.0. You can check Microsoft’s [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation, to see how to update an existing ASP.NET Core 8.0 project to ASP.NET Core 9.0.
+
+After updating your solution to .NET 9.0, you should apply the following steps:
+
+* Change the `app.UseStaticFiles()` to `app.MapAbpStaticAssets()` in the module classes of your host applications.
+ * Some JavaScript/CSS/Images files exist in the Virtual File System, but ASP NET Core 9's `MapStaticAssets` can't handle them. This is why we created the **MapAbpStaticAssets**.
+* Upgrade the Microsoft packages (also other packages) for .NET 9.0. You can check the [Directory.Packages.props](https://github.com/abpframework/abp/blob/rel-9.0/Directory.Packages.props) file for package versions and update the necessary ones.
+
+### Made the IdentitySession Entity Extensible & Updated the MaxIpAddressesLength
+
+In this version, we made the `IdentitySession` entity extensible and as a result of that, you should be aware of the changes explained below:
+
+* `IdentitySession` entity inherits from **AggregateRoot** instead of **BasicAggregateRoot**. Here is the PR for the related change: [#20771](https://github.com/abpframework/abp/pull/20771)
+* `IdentitySession` entity's **MaxIpAddress** property now allows up to 2048 characters. You can check the related PR, [here](https://github.com/abpframework/abp/pull/20819).
+
+You should create a new migration and apply it to your database for the changes explained above.
+
+### Removed Auditing Properties From the `OpenIddictAuthorization` and `OpenIddictToken` Entities
+
+In this version, we removed the auditing properties from the `OpenIddictAuthorization` and `OpenIddictToken` entities. Now, these entities are inherited from `AggregateRoot` instead of `FullAuditedAggregateRoot`.
+
+> See the PR, if you need further information: https://github.com/abpframework/abp/pull/20671
+
+Since the auditing properties are removed, you should create a new migration and apply it to your database.
+
+### Updated Method Signature of `AbpCrudPageBase`
+
+The method signature of [framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs](https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs) has been changed as follows:
+
+```diff
+- IEnumerable GetExtensionTableColumns(string moduleName, string entityType)
++ Task> GetExtensionTableColumnsAsync(string moduleName, string entityType)
+```
+
+### Removed React Native Mobile Option From Open Source Templates
+
+In this version, we removed the **React Native** mobile option from the open source templates due to maintaining reasons. We updated the related documents and the ABP CLI (both old & new CLI) for this change, and with v9.0, you will not be able to create a free template with react-native as the mobile option.
+
+> **Note:** Pro templates still provide the **React Native** as the mobile option and we will continue supporting it.
+
+If you want to access the open-source React-Native template, you can visit the **abp-archive** repository: https://github.com/abpframework/abp-archive
+
+## PRO
+
+> Please check the **Open-Source (Framework)** section before reading this section. The listed topics might affect your application and you might need to take care of them.
+
+If you are a paid-license owner and using the ABP's paid version, then please follow the following sections to get informed about the breaking changes and apply the necessary ones:
+
+### ABP Suite: Better Naming For Multiple Navigation Properties
+
+> **Note:** As a developer, you don't need to make any changes in your solution regarding this change. We just wanted to highlight this change and let you know.
+
+Prior to this version, when you defined multiple (same) navigation properties to same entity, then ABP Suite was renaming them with a duplicate number.
+
+Consider the following scenario for an example: If you have a book with an author and coauthor, prior to this version ABP Suite was creating a DTO class as below:
+
+```csharp
+public class BookWithNavigationPropertiesDto
+{
+ public BookDto Book { get; set; }
+
+ public AuthorDto Author { get; set; }
+
+ public AuthorDto Author1 { get; set; }
+}
+```
+
+Notice, that since the book entity has two same navigation properties, ABP Suite renamed them with a duplicate number. In this version, ABP Suite will ask you to define a propertyName for the **navigation properties** and you'll be able to specify a meaningful name such as:
+
+```csharp
+public class BookWithNavigationPropertiesDto
+{
+ public BookDto Book { get; set; }
+
+ public AuthorDto Author { get; set; }
+
+ //used the specified property name
+ public AuthorDto CoAuthor { get; set; }
+}
+```
+
+### CMS Kit Pro: Feedback Feature Improvements
+
+In this version, we revised the **CMS Kit's Feedback Feature** and as a result, we made the following changes:
+
+* `CmsKitProSettingGroupViewComponent` doesn't inject any service anymore and the design of the component has been updated. (no need for a change in your code, if you did not override the component)
+* `Default.cshtml` and `Default.js` files (under the **Pages/Public/Shared/Components/PageFeedbacks/** directory) have been updated. (no need for a change in your code, if you did not override the files)
+* `FeedbackUserId` property has been added to the `PageFeedback` entity, and that means you should create a new migration and apply it to your database.
+* `PageFeedbackManager.CreateAsync` method now expecting an additional parameter: ***Guid feedbackUserId***. (no need for a change in your code, if you did not override or use this file)
+* `PageFeedbackPublicAppService` has been updated due to saving the feedback user id. (no need for a change in your code, if you did not override or use this file)
diff --git a/docs/en/release-info/migration-guides/index.md b/docs/en/release-info/migration-guides/index.md
index 804b17b376..27c6752338 100644
--- a/docs/en/release-info/migration-guides/index.md
+++ b/docs/en/release-info/migration-guides/index.md
@@ -2,6 +2,7 @@
The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../upgrading.md).
+- [8.x to 9.0](abp-9-0.md)
- [8.x to 8.3](abp-8-3.md)
- [8.1 to 8.2](abp-8-2.md)
- [8.0 to 8.1](abp-8-1.md)
diff --git a/docs/en/release-info/release-notes.md b/docs/en/release-info/release-notes.md
index b10282bba7..e94086e14f 100644
--- a/docs/en/release-info/release-notes.md
+++ b/docs/en/release-info/release-notes.md
@@ -4,6 +4,19 @@ This document contains **brief release notes** for each release. Release notes o
> If you want to read the release notes for each ABP Studio release, check it out from [here](../studio/release-notes.md).
+## 9.0 (2024-10-22)
+
+> This version is currently in preview. The final release date is planned for November, 2024.
+
+See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-9-0-release-candidate)** for the v9.0 release.
+
+* Upgraded to .NET 9.0
+* Introducing the `Extension Property Policy`
+* Google Cloud Storage BLOB Provider
+* Removed React Native mobile option from free templates
+* ABP Suite: Better naming for multiple navigation properties to the same entity
+* CMS Kit Pro: Feedback feature improvements
+
## 8.3 (2024-09-05)
See the detailed **[blog post / announcement](https://abp.io/blog/announcing-abp-8-3-stable-release)** for the v8.3 release.
diff --git a/docs/en/release-info/road-map.md b/docs/en/release-info/road-map.md
index 82da0a0b8e..cc9caca124 100644
--- a/docs/en/release-info/road-map.md
+++ b/docs/en/release-info/road-map.md
@@ -4,43 +4,39 @@ This document provides a road map, release schedule, and planned features for th
## Next Versions
-### v9.0
+### v9.1
-The next version will be 9.0 and planned to release the stable 9.0 version in November 2024. We will be mostly working on the following topics:
+The next version will be 9.1 and planned to release the stable 9.1 version in January 2025. We will be mostly working on the following topics:
* Framework
- * Upgrading to .NET 9.0
- * Google Cloud Storage BLOB Provider
- * Better handling localization resources in a microservice scenario
+ * Lazy expandable feature for documentation
+ * Unify the bundling system of Blazor and MVC
* SSR support for the Angular UI
* Upgrading 3rd-party dependencies
* ABP Suite
- * Multiple navigation properties to the same target entity
* Define navigation properties without target string property dependency
* Improvements one-to-many scenarios
* Access to default code generation templates for customized templates
+ * File Upload Modal enhancements
* ABP Studio
- * Blazor WebApp UI option for the new startup templates
- * Execution order (dependency management) for Solution Runner
* Automate more details on new service creation for a microservice solution
* Support multiple concurrent Kubernetes deployment/integration scenarios
- * Show the README file when you create a new solution or open an existing solution
- * Improve ABP Suite code-generation possibilities for microservice solutions
- * Improve the module installation experience
+ * Improve the module installation experience / installation guides
* Auto-install 3rd-party dependencies
* Better handle long log files
* Allow to directly create new solutions with ABP's RC (Release Candidate) versions
* Support Intel processors for Mac computers, support ARM chipset for Windows and support Linux OS
* Improve client proxy generation experience
+ * Modular Monolith Application Startup Template
* Application modules
* Account module: Support mixed social/local login scenarios
+ * Idle session warning
* UI/UX improvements on existing application modules
* New tutorials
- * Modular monolith development
* Microservice development
## Backlog Items
@@ -83,7 +79,6 @@ Here, are some of the important planned features for next ABP Studio versions:
* Theme builder for the LeptonX theme
* Analyze user solutions to explore entities, domain services, application services, pages and other fundamental objects.
-* Add status bar to the built-in browser to easily see errors
* Swagger authentication support for the built-in browser
* Show related requests/events (traces) together in the solution runner panel
* Integrate common tool dashboards into ABP Studio (such a Garana, Redis, RabbitMQ, Kibana, etc)
@@ -94,8 +89,8 @@ Here, are some of the important planned features for next ABP Studio versions:
* Downloading samples in ABP studio
* Built-in ABP documentation experience
* Auto-execute terminal commands in markdown files
-* Compare changed on the startup templates when a new ABP version is published
-* Remove unused projects while downloading source code of an existing module
+* Compare changes on the startup templates when a new ABP version is published
+* Remove unused projects while downloading the source code of an existing module
* Testing/hosting applications for module templates
* Easily explore all module and package dependencies of a large solution
* Built-in deployment options
@@ -106,7 +101,7 @@ Here, are some of the important planned features for next ABP Studio versions:
[ABP Suite](../suite/index.md) is a GUI application that is mainly used to generate CRUD style pages in your application. You define your entity and it can generate all the code from the database layer to the UI layer. The generated code is clean and a perfect starting point to implement your custom requirements on top of it.
-Here, are some of the important planned features for next ABP Suite versions:
+Here, are some of the important planned features for the next ABP Suite versions:
* Handle image properties for entities
* Allow to define extra properties for DTOs those are not a part of the entity
diff --git a/docs/en/samples/index.md b/docs/en/samples/index.md
index 619eb81484..793a777ad1 100644
--- a/docs/en/samples/index.md
+++ b/docs/en/samples/index.md
@@ -1,22 +1,34 @@
-# Sample Applications
+# ABP Samples
Here, a list of official samples built with ABP.
+## Event Hub
+
+A reference application built with ABP. It implements the Domain Driven Design with multiple application layers.
+
+* [Live demo](https://www.openeventhub.com/)
+* [Source code](https://github.com/abpframework/eventhub)
+
## eShopOnAbp
Reference microservice solution built with ABP and .NET.
+* [Live demo](https://www.eshoponabp.com/)
* [Source code](https://github.com/abpframework/eShopOnAbp)
-## Event Hub
+## CMS Kit Demo
-A reference application built with ABP. It implements the Domain Driven Design with multiple application layers.
+A minimal example website built with the [CMS Kit module](../modules/cms-kit/index.md).
-* [Source code](https://github.com/abpframework/eventhub)
+* [Live demo](https://cms-kit-demo.abpdemo.com/)
+* [Source code](https://github.com/abpframework/cms-kit-demo)
## Easy CRM
-A middle-size CRM application built with ABP. [Click here](easy-crm.md) to see the details.
+A middle-size CRM application built with ABP.
+
+* [Live demo](http://easycrm.abp.io/)
+* [Click here](easy-crm.md) to see the details and download the source code.
## Book Store
diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md
new file mode 100644
index 0000000000..49d3750da2
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md
@@ -0,0 +1,36 @@
+# Azure Deployment using Application Service
+
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference on top of this document.
+
+## Prerequisites
+
+- An active Azure account. If you don't have one, you can sign up for a [free account](https://azure.microsoft.com/en-us/free/)
+
+- Your ABP **{{ UI_Value }}** project must be ready at a GitHub repository because we will use GitHub Actions to deploy the ABP application to the Azure Web App Service.
+
+- **{{ DB_Value }}** database must be ready to use with your project. If you don't have a database, you can create a new Azure SQL database or Cosmos DB by following the instructions below:
+
+ - [Create a new Azure SQL Database](https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?tabs=azure-portal)
+
+ - [Create a new Azure Cosmos DB](https://docs.microsoft.com/en-us/azure/cosmos-db/create-cosmosdb-resources-portal)
+
+
+### Description of the process in three steps:
+
+1. [Creating an Azure Web App Service Environment ](step1-create-azure-resources)
+2. [Customizing the Configuration of Your ABP Application](step2-configuration-application)
+3. [Deploying Your Application to Azure Web App Service](step3-deployment-github-action)
+
+
+## What's next?
+
+- [Creating an Azure Web App Service Environment](step1-create-azure-resources)
diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md
new file mode 100644
index 0000000000..4a4601486c
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md
@@ -0,0 +1,174 @@
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+## Step 1: Creating an Azure Web App Service Environment
+
+To create a new Azure Web App Service, choose one of the following options:
+
+- [Create a new Azure Web App Service using the Azure Portal](#create-a-new-azure-web-app-service-using-the-azure-portal) (Recommended)
+
+- [Create a new Azure Web App Service using the Terraform Template](terraform-web-app-service.md) (If you have experience with Terraform)
+
+{{ if UI == "MVC" && Tiered == "No" }}
+
+### Create a new Azure Web App service using the Azure Portal
+
+1. Log in to the [Azure Portal](https://portal.azure.com/).
+
+2. Click the **Create a resource** button.
+
+3. Search for **Web App** and select **Web App** from the results.
+
+ 
+
+4. Click the **Create** button.
+
+5. Fill in the required fields and click the **Review + create** button.
+
+6. Click the **Create** button.
+
+ 
+
+7. Wait for the deployment to complete.
+
+ 
+
+{{else}}
+
+{{ if UI == "BlazorServer" || UI == "MVC" }}
+
+### Create a new Azure Web App service using the Azure Portal
+
+1. Log in to the [Azure Portal](https://portal.azure.com/).
+
+2. Click the **Create a resource** button.
+
+3. Search for **Web App** and select **Web App** from the results.
+
+ 
+
+4. Click the **Create** button.
+
+5. Fill in the required fields and click the **Review + create** button.
+
+6. Click the **Create** button.
+
+ 
+
+7. Wait for the deployment to complete.
+
+ 
+
+{{ else if UI == 'NG' }}
+
+### Create a new Azure Static Web App for Angular using the Azure Portal
+
+1. Log in to the [Azure Portal](https://portal.azure.com/).
+
+2. Click the **Create a resource** button.
+
+3. Search for **Static Web App** and select **Static Web App** from the results.
+
+ 
+
+4. Click the **Create** button.
+
+5. Fill in the required fields and click the **Review + create** button.
+
+6. Click the **Create** button.
+
+ 
+
+7. Wait for the deployment to complete.
+
+ 
+
+{{else}}
+
+### Create a new Azure Static Web App for Blazor using the Azure Portal
+
+1. Log in to the [Azure Portal](https://portal.azure.com/).
+
+2. Click the **Create a resource** button.
+
+3. Search for **Static Web App** and select **Static Web App** from the results.
+
+ 
+
+4. Click the **Create** button.
+
+5. Fill in the required fields and click the **Review + create** button.
+
+6. Click the **Create** button.
+
+ 
+
+7. Wait for the deployment to complete.
+
+ 
+
+{{end}}
+
+### Create a new Azure Web App Service for API application
+
+1. You can create a new Azure Web App Service for an API application in the same resource group.
+
+2. Click the **Create** button on the top of the resource group page.
+
+3. Search for **Web App** and select **Web App** from the results.
+
+ 
+
+4. Click the **Create** button.
+
+5. Fill in the required fields and click the **Review + create** button.
+
+6. Click the **Create** button.
+
+ 
+
+7. Wait for the deployment to complete.
+
+ 
+
+{{ if Tiered == "Yes" && (UI == "MVC" || UI == "BlazorServer")}}
+
+### Create a new Azure Web App Service for AuthServer application
+
+Similar to the API application, you can create a new Azure Web App Service for an AuthServer application in the same resource group.
+
+Same as above, but you only need to modify the name of the web app service to **authserver-yourapp** in step 5.
+
+### Create Azure Cache for Redis
+
+1. Click the **Create** button on the top of the resource group page.
+
+2. Search for **Redis Cache** and select **Redis Cache** from the results.
+
+ 
+
+3. Click the **Create** button.
+
+4. Fill in the required fields and click the **Review + create** button.
+
+5. Click the **Create** button.
+
+ 
+
+6. Wait for the deployment to complete.
+
+ 
+
+{{ end }}
+
+{{ end }}
+
+## What's next?
+
+- [Customizing the Azure Web App Service](step2-configuration-application.md)
diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md
new file mode 100644
index 0000000000..5f1ba5aafe
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md
@@ -0,0 +1,231 @@
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+## Step 2: Customizing the Configuration of the ABP Application
+
+- To customize the configuration of your ABP application, modify the `ConnectionString` values in every location throughout your project. The `ConnectionString` values are stored in the `appsettings.json` files.
+
+ This includes the following files:
+{{ if UI == "MVC" && Tiered == "No" }}
+ **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.Web/appsettings.json**
+{{else}}
+ **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+{{end}}
+{{if Tiered == "Yes"}}
+ **./src/yourapp.AuthServer/appsettings.json**
+{{end}}
+
+```json
+"ConnectionStrings": {
+ "Default": "Server=tcp:yourserver.database.windows.net,1433;Initial Catalog=yourdatabase;Persist Security Info=False;User ID=yourusername;Password=yourpassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
+}
+```
+
+{{ if UI == "MVC" }}
+
+{{if Tiered == "No"}}
+
+- Modify the **yourapp.Web** URL in every location throughout your project, especially within the **./src/yourapp.Web/appsettings.json** and **./src/yourapp.DbMigrator/appsettings.json** files, to match your Azure Web App Service URL.
+
+```json
+ "App": {
+ "SelfUrl": "https://yourapp.azurewebsites.net"
+ }
+```
+
+{{else}}
+
+- Modify the **yourapp.Web** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Web/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** , **./src/yourapp.HttpApi.Host/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp.azurewebsites.net"
+}
+```
+
+- Modify the **yourapp.ApiHost** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Web/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp-apihost.azurewebsites.net"
+}
+```
+
+- Modify the **yourapp.AuthServer** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Web/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp-authserver.azurewebsites.net"
+}
+```
+
+- Modify the **Redis__Configuration** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Web/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+"Redis": {
+ "Configuration": "redis-abpdemo.redis.cache.windows.net:6380,password={yourpassword},ssl=true,abortConnect=False"
+ },
+```
+
+{{end}}
+
+{{ else if UI == "NG" }}
+
+- Modify the **`localhost:4200`** in every location throughout your project.
+
+ This includes the following files:
+
+ **./angular/src/environments/environment.prod.ts** , **./aspnet-core/src/yourapp.DbMigrator/appsettings.json** and **./aspnet-core/src/yourapp.HttpApi.Host/appsettings.json**
+
+```typescript
+ application: {
+ baseUrl: 'https://yourapp.azurestaticapps.net'
+ }
+```
+
+- Modify the **yourapp.HttpApi.Host** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./angular/src/environments/environment.prod.ts** , **./aspnet-core/src/yourapp.DbMigrator/appsettings.json** and **./aspnet-core/src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+ "App": {
+ "SelfUrl": "https://yourApiHost.azurewebsites.net"
+ }
+```
+
+{{ else if UI == "Blazor" }}
+
+- Modify the **yourapp.Blazor** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+ "App": {
+ "SelfUrl": "https://yourapp.azurewebsites.net"
+ }
+```
+
+- Modify the **yourapp.HttpApi.Host** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+ "App": {
+ "SelfUrl": "https://yourApiHost.azurewebsites.net"
+ }
+```
+
+{{ else }}
+
+{{if Tiered == "No"}}
+
+- Modify the **yourapp.Web** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp.azurewebsites.net"
+}
+```
+
+- Modify the **yourapp.ApiHost** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Blazor/appsettings.json** and **./src/yourapp.DbMigrator/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp-apihost.azurewebsites.net"
+}
+```
+
+{{else}}
+
+- Modify the **yourapp.Web** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** , **./src/yourapp.HttpApi.Host/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp.azurewebsites.net"
+}
+```
+
+- Modify the **yourapp.ApiHost** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp-apihost.azurewebsites.net"
+}
+```
+
+- Modify the **yourapp.AuthServer** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+"App": {
+ "SelfUrl": "https://yourapp-authserver.azurewebsites.net"
+}
+```
+
+- Modify the **Redis__Configuration** URL in every location throughout your project.
+
+ This includes the following files:
+
+ **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
+
+```json
+"Redis": {
+ "Configuration": "redis-abpdemo.redis.cache.windows.net:6380,password={yourpassword},ssl=true,abortConnect=False"
+ },
+```
+
+{{end}}
+
+{{end}}
+
+
+## What's next?
+
+- [Deploying Your ABP Application to Azure](step3-deployment-github-action.md)
diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md
new file mode 100644
index 0000000000..9aa9e5df83
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md
@@ -0,0 +1,735 @@
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+## Step 3: Deploying the ABP Application to Azure Web App Service
+
+### Deploying the ABP Application to Azure Web App Service using GitHub Actions
+
+1. Create a new GitHub repository for your project if you don't have one.
+
+2. Push your project to the new GitHub repository.
+
+3. Navigate to the **Actions** tab of your GitHub repository.
+
+4. Click the **set up a workflow yourself** button.
+
+ 
+
+5. Copy this content to the opened file and commit it.
+
+{{if UI == "NG"}}
+
+{%{
+
+```yaml
+# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
+# More GitHub Actions for Azure: https://github.com/Azure/actions
+
+name: Build and deploy ASP.Net Core with Angular app to Azure Web App
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ build-backend:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up .NET Core
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.x'
+ include-prerelease: true
+
+ - name: Install ABP CLI
+ run: |
+ dotnet tool install -g Volo.Abp.Cli
+ abp install-libs
+ shell: bash
+
+ - name: Build with dotnet
+ run: dotnet build --configuration Release
+ working-directory: ./aspnet-core
+
+ - name: Run migrations
+ run: dotnet run -- "${{ secrets.CONNECTION_STRING }}"
+ working-directory: ./aspnet-core/src/Demo.AzureAppsAngular.DbMigrator # Replace with your project name
+
+ - name: dotnet publish apihost
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
+ working-directory: ./aspnet-core/src/Demo.AzureAppsAngular.HttpApi.Host # Replace with your project name
+
+ - name: Generate authserver.pfx
+ run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
+
+ - name: Upload artifact for apihost
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-apihost
+ path: ${{env.DOTNET_ROOT}}/apihost
+
+ deploy-backend:
+ runs-on: ubuntu-latest
+ needs: build-backend
+ environment:
+ name: 'Production'
+ url: ${{ steps.deploy-to-webapp-1.outputs.webapp-url }}
+
+ steps:
+ - name: Download artifact from apihost
+ uses: actions/download-artifact@v1
+ with:
+ name: .net-apihost
+ path: ./apihost
+
+ - name: Deploy apihost
+ id: deploy-to-webapp-1
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'apihost-angular' # Replace with your app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.apihostangularPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
+ path: ./apihost
+
+ build-deploy-frontend:
+ runs-on: ubuntu-latest
+ needs: deploy-backend
+ name: Build and Deploy Angular App
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - name: Build And Deploy
+ id: builddeploy
+ uses: Azure/static-web-apps-deploy@v1
+ with:
+ azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_PROUD_STONE }} # Set your Azure Static Web App API token as a secret in your repository settings
+ repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for GitHub integrations (eg: PR comments)
+ action: "upload"
+ app_location: "angular" # App source code path
+ api_location: "" # Api source code path - optional
+ output_location: "dist/AzureAppsAngular" # Built app content directory - optional
+```
+
+}%}
+
+{{ else if UI == "Blazor" }}
+
+{%{
+
+```yaml
+# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
+# More GitHub Actions for Azure: https://github.com/Azure/actions
+
+name: Build and deploy ASP.Net Core with Blazor to Azure Web App
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ build-apihost:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up .NET Core
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.x'
+ include-prerelease: true
+
+ - name: Install ABP CLI
+ run: |
+ dotnet tool install -g Volo.Abp.Cli
+ abp install-libs
+ shell: bash
+
+ - name: Build with dotnet
+ run: dotnet build --configuration Release
+
+ - name: Run migrations
+ run: dotnet run -- "${{ secrets.CONNECTION_STRING }}"
+ working-directory: ./src/demo.BlazorNonTierEfCore.DbMigrator # Replace with your project name
+
+ - name: dotnet publish apihost
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
+ working-directory: ./src/demo.BlazorNonTierEfCore.HttpApi.Host # Replace with your project name
+
+ - name: Generate authserver.pfx
+ run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
+
+ - name: Upload artifact for apihost
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-apihost
+ path: ${{env.DOTNET_ROOT}}/apihost
+
+ deploy-apihost:
+ runs-on: ubuntu-latest
+ needs: build-apihost
+ environment:
+ name: 'Production'
+
+ steps:
+ - name: Download artifact from apihost
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-apihost
+ path: ./apihost
+
+ - name: Deploy apihost
+ id: deploy-to-webapp-2
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'apihost-blazor' # Replace with your app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.apihostblazorPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
+
+ build-deploy-frontend:
+ runs-on: ubuntu-latest
+ needs: deploy-apihost
+ name: Build and Deploy Job
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - name: Build And Deploy
+ id: builddeploy
+ uses: Azure/static-web-apps-deploy@v1
+ with:
+ azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS }} # Set your Azure Static Web App API token as a secret in your repository settings
+ repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for GitHub integrations (eg: PR comments)
+ action: "upload"
+ app_location: "src/demo.BlazorNonTierEfCore.Blazor" # App source code path
+ api_location: "" # Api source code path - optional
+ output_location: "wwwroot" # Built app content directory - optional
+```
+
+}%}
+
+{{ else if UI == "BlazorServer" }}
+
+{{ if Tiered == "No" }}
+
+{%{
+
+```yaml
+# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
+# More GitHub Actions for Azure: https://github.com/Azure/actions
+
+name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up .NET Core
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.x'
+ include-prerelease: true
+
+ - name: Install ABP CLI
+ run: |
+ dotnet tool install -g Volo.Abp.Cli
+ abp install-libs
+ shell: bash
+
+ - name: Build with dotnet
+ run: dotnet build --configuration Release
+
+ - name: Run migrations
+ run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings
+ working-directory: ./src/blazorservertierdemo.DbMigrator # Replace with your project name
+
+ - name: dotnet publish apihost
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
+ working-directory: ./src/blazorservertierdemo.HttpApi.Host # Replace with your project name
+
+ - name: Generate authserver.pfx
+ run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
+
+ - name: dotnet publish webapp
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp
+ working-directory: ./src/blazorservertierdemo.Blazor # Replace with your project name
+
+ - name: Upload artifact for apihost
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-apihost
+ path: ${{env.DOTNET_ROOT}}/apihost
+
+ - name: Upload artifact for webapp
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-webapp
+ path: ${{env.DOTNET_ROOT}}/webapp
+
+ deploy:
+ runs-on: ubuntu-latest
+ needs: build
+ environment:
+ name: 'Production'
+ url: ${{ steps.deploy-to-webapp-3.outputs.webapp-url }}
+
+ - name: Download artifact from apihost
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-apihost
+ path: ./apihost
+
+ - name: Deploy apihost
+ id: deploy-to-webapp-2
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'apihost-blazorserver' # Replace with your app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.apihostblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
+ package: ./apihost
+
+ - name: Download artifact from webapp
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-webapp
+ path: ./webapp
+
+ - name: Deploy webapp
+ id: deploy-to-webapp-3
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'webapp-blazorserver' # Replace with your app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
+ package: ./webapp
+```
+
+}%}
+
+{{ else }}
+
+{%{
+
+```yaml
+# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
+# More GitHub Actions for Azure: https://github.com/Azure/actions
+
+name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up .NET Core
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.x'
+ include-prerelease: true
+
+ - name: Install ABP CLI
+ run: |
+ dotnet tool install -g Volo.Abp.Cli
+ abp install-libs
+ shell: bash
+
+ - name: Build with dotnet
+ run: dotnet build --configuration Release
+
+ - name: Run migrations
+ run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings
+ working-directory: ./src/blazorservertierdemo.DbMigrator # Replace with your project name
+
+ - name: dotnet publish authserver
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver
+ working-directory: ./src/blazorservertierdemo.AuthServer # Replace with your project name
+
+ - name: Generate authserver.pfx
+ run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
+
+ - name: dotnet publish apihost
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
+ working-directory: ./src/blazorservertierdemo.HttpApi.Host # Replace with your project name
+
+ - name: dotnet publish webapp
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp
+ working-directory: ./src/blazorservertierdemo.Blazor # Replace with your project name
+
+ - name: Upload artifact for authserver
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-authserver
+ path: ${{env.DOTNET_ROOT}}/authserver
+
+ - name: Upload artifact for apihost
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-apihost
+ path: ${{env.DOTNET_ROOT}}/apihost
+
+ - name: Upload artifact for webapp
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-webapp
+ path: ${{env.DOTNET_ROOT}}/webapp
+
+ deploy:
+ runs-on: ubuntu-latest
+ needs: build
+ environment:
+ name: 'Production'
+ url: ${{ steps.deploy-to-webapp-3.outputs.webapp-url }}
+
+ steps:
+ - name: Download artifact from authserver
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-authserver
+ path: ./authserver
+
+ - name: Deploy authserver
+ id: deploy-to-webapp
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'authserver-blazorserver' # Replace with your app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.authserverblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
+ package: ./authserver
+
+ - name: Download artifact from apihost
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-apihost
+ path: ./apihost
+
+ - name: Deploy apihost
+ id: deploy-to-webapp-2
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'apihost-blazorserver' # Replace with your app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.apihostblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
+ package: ./apihost
+
+ - name: Download artifact from webapp
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-webapp
+ path: ./webapp
+
+ - name: Deploy webapp
+ id: deploy-to-webapp-3
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'webapp-blazorserver' # Replace with your app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings
+```
+
+}%}
+
+{{end}}
+
+{{ else if UI == "MVC" }}
+
+{{ if Tiered == "No" }}
+
+{%{
+
+```yaml
+# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
+# More GitHub Actions for Azure: https://github.com/Azure/actions
+
+name: Build and deploy ASP.Net Core with MVC to Azure Web App
+
+on:
+push:
+ branches:
+ - main
+workflow_dispatch:
+
+jobs:
+build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up .NET Core
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.x'
+ include-prerelease: true
+
+ - name: Install ABP CLI
+ run: |
+ dotnet tool install -g Volo.Abp.Cli
+ abp install-libs
+ shell: bash
+
+ - name: Build with dotnet
+ run: dotnet build --configuration Release
+
+ - name: Run migrations
+ run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings
+ working-directory: ./src/yourapp.DbMigrator # Replace with your project name
+
+ - name: dotnet publish
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp
+ working-directory: ./src/yourapp.Web # Replace with your project name
+
+ - name: Generate authserver.pfx
+ run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
+
+ - name: Upload artifact for deployment job
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-app
+ path: ${{env.DOTNET_ROOT}}/myapp
+
+deploy:
+ runs-on: ubuntu-latest
+ needs: build
+ environment:
+ name: 'Production'
+ url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
+
+ steps:
+ - name: Download artifact from build job
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-app
+
+ - name: Deploy to Azure Web App
+ id: deploy-to-webapp
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'yourapp' # Replace with your azure web app name
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE }} # Set your Azure Web App publish your profile as a secret in your repository settings
+ package: .
+```
+
+}%}
+
+{{ else }}
+
+{%{
+
+```yaml
+# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
+# More GitHub Actions for Azure: https://github.com/Azure/actions
+
+name: Build and deploy ASP.Net Core with MVC to Azure Web App
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up .NET Core
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.x'
+ include-prerelease: true
+
+ - name: Install ABP CLI
+ run: |
+ dotnet tool install -g Volo.Abp.Cli
+ abp install-libs
+ shell: bash
+
+ - name: Build with dotnet
+ run: dotnet build --configuration Release
+
+ - name: Run migrations
+ run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings
+ working-directory: ./src/mvctierdemo.DbMigrator # Replace with your project name
+
+ - name: dotnet publish authserver
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver
+ working-directory: ./src/mvctierdemo.AuthServer # Replace with your project name
+
+ - name: Generate authserver.pfx
+ run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
+
+ - name: dotnet publish apihost
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
+ working-directory: ./src/mvctierdemo.HttpApi.Host # Replace with your project name
+
+ - name: dotnet publish webapp
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp
+ working-directory: ./src/mvctierdemo.Web # Replace with your project name
+
+ - name: Upload artifact for authserver
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-authserver
+ path: ${{env.DOTNET_ROOT}}/authserver
+
+ - name: Upload artifact for apihost
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-apihost
+ path: ${{env.DOTNET_ROOT}}/apihost
+
+ - name: Upload artifact for webapp
+ uses: actions/upload-artifact@v4
+ with:
+ name: .net-webapp
+ path: ${{env.DOTNET_ROOT}}/webapp
+
+ deploy:
+ runs-on: ubuntu-latest
+ needs: build
+ environment:
+ name: 'Production'
+ url: ${{ steps.deploy-to-webapp-3.outputs.webapp-url }}
+
+ steps:
+ - name: Download artifact from apihost
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-apihost
+ path: ./apihost
+
+ - name: Deploy apihost
+ id: deploy-to-webapp-2
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'apihost-prodemo'
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.apihostprodemoPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings
+ package: ./apihost
+
+ - name: Download artifact from authserver
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-authserver
+ path: ./authserver
+
+ - name: Deploy authserver
+ id: deploy-to-webapp
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'authserver-prodemo'
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.authserverprodemoPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings
+ package: ./authserver
+
+ - name: Download artifact from webapp
+ uses: actions/download-artifact@v4
+ with:
+ name: .net-webapp
+ path: ./webapp
+
+ - name: Deploy webapp
+ id: deploy-to-webapp-3
+ uses: azure/webapps-deploy@v3
+ with:
+ app-name: 'webapp-prodemo'
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.webappprodemoPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings
+ package: ./webapp
+```
+
+}%}
+
+{{end}}
+
+{{end}}
+
+
+7. Navigate to the **Settings** tab of your GitHub repository.
+
+8. Click the **Secrets** button.
+
+9. Click the **New repository secret** button.
+
+ 
+
+10. Add the following secrets:
+
+ - **CONNECTION_STRING**: The connection string of your database.
+
+ Example of Azure SQL connection string:
+
+ 
+
+ - **AZUREAPPSERVICE_PUBLISHPROFILE**: The publish the profile of your Azure Web App Service. You can download it from the **Overview** tab of your Azure Web App Service.
+
+ 
+
+{{ if UI == "NG" || UI == "Blazor"}}
+
+ - **AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS**: The API token of your Azure Static Web App. You can get it from the **Overview** tab of your Azure Static Web App.
+
+ 
+
+{{end}}
+
+11. Navigate to the **Actions** tab of your GitHub repository.
+
+12. Click the **Deploy to Azure Web App** workflow.
+
+ 
+
+13. Click the **Run workflow** button.
+
+ 
+
+14. Navigate to the web app URL to see the deployed application.
+
+ 
+
+> If deploying your application was unsuccessful, you can check the logs of the deployment by clicking the **Deploy to Azure Web App** workflow and then clicking the **deploy-to-webapp** job.
+
+> If deployment is successful, but you get an error when you navigate to the web app url, you can check the logs of the web app by clicking the **Logs** button on the **Overview** tab of your Azure Web App Service.
+
+> Finally, you have the CI/CD pipeline for your application. Every time you push your code to the main branch, your application will be deployed to Azure Web App Service automatically.
+
+
+## What's next?
+
+- [Docker Deployment using Docker Compose](../deployment-docker-compose.md)
+
+- [IIS Deployment](../deployment-iis.md)
diff --git a/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md
new file mode 100644
index 0000000000..c1678c4961
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md
@@ -0,0 +1,572 @@
+# Provisioning an Azure Web App using Terraform
+
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+In this tutorial, we'll walk through the steps to provision an Azure Web App using Terraform. Terraform is an open-source infrastructure as a code tool that allows you to define and manage your infrastructure in a declarative way.
+
+## Prerequisites
+
+Before you begin, you'll need the following:
+
+- [Azure account](https://azure.microsoft.com/en-us/free/)
+- [Terraform installed](https://developer.hashicorp.com/terraform/downloads) on your local machine
+- [Azure CLI installed](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) on your local machine
+
+## Creating a Service Principal for Terraform in Azure
+
+When working with Terraform on Azure, you'll need a "Service Principal" for authentication. A "Service Principal" is an identity created to be used with applications, hosted services, and automated tools to access Azure resources.
+
+[To create a service principal](https://learn.microsoft.com/en-us/azure/developer/terraform/authenticate-to-azure?tabs=bash#create-a-service-principal), run the following command in the Azure CLI:
+
+1. Login to Azure CLI
+
+ Before you begin, make sure you are logged into your Azure account with the Azure CLI:
+ ```bash
+ az login
+ ```
+
+2. Set your Subscription:
+
+ If you have multiple Azure subscriptions, specify the one you intend to use:
+ ```bash
+ az account set --subscription="YOUR_SUBSCRIPTION_ID"
+ ```
+
+3. Create the Service Principal:
+
+ The following command will create a service principal. Replace YOUR_APP_NAME with a suitable name for your application:
+ ```bash
+ az ad sp create-for-rbac --name "YOUR_APP_NAME" --role contributor --scopes /subscriptions/YOUR_SUBSCRIPTION_ID
+ ```
+ > Replace `YOUR_SUBSCRIPTION_ID` with your subscription id.
+
+ The output of this command will provide the **appId**, **displayName**, **name**, **password**, and **tenant**. It's crucial to note these values, especially **appId (Client ID)** and **password (Client Secret)**, as you'll need them for Terraform authentication.
+
+4. Specify the service principal credentials in environment variables
+
+ bash:
+ ```bash
+ export ARM_SUBSCRIPTION_ID=""
+ export ARM_TENANT_ID=""
+ export ARM_CLIENT_ID=""
+ export ARM_CLIENT_SECRET=""
+ ```
+ To execute the ~/.bashrc script, run source ~/.bashrc (or its abbreviated equivalent . ~/.bashrc). You can also exit and reopen Cloud Shell for the script to run automatically.
+ Run the following bash command to verify the Azure environment variables:
+ ```bash
+ . ~/.bashrc
+ ```
+ powershell:
+ ```powershell
+ $env:ARM_SUBSCRIPTION_ID=""
+ $env:ARM_TENANT_ID=""
+ $env:ARM_CLIENT_ID=""
+ $env:ARM_CLIENT_SECRET=""
+ ```
+ Run the following PowerShell command to verify the Azure environment variables:
+ ```powershell
+ gci env:ARM_*
+ ```
+ > Replace the values with your own.
+
+## Creating a Terraform Configuration
+
+1. Create a new directory for your Terraform configuration files.
+
+2. Create a new file named `main.tf` in the directory and add the following code:
+
+{{if UI == "NG"}}
+
+```terraform
+# Configure the Azure provider
+terraform {
+ required_providers {
+ azurerm = {
+ source = "hashicorp/azurerm"
+ version = "~> 3.0.0"
+ }
+ }
+ required_version = ">= 0.14.9"
+}
+provider "azurerm" {
+ features {}
+}
+
+# Create the resource group
+resource "azurerm_resource_group" "rg" {
+ name = "demo-angular-web-app-rg"
+ location = "westeurope"
+}
+
+# Create the Linux App Service Plan
+resource "azurerm_service_plan" "appserviceplan" {
+ name = "demo-angular-web-app-plan"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ os_type = "Linux"
+ sku_name = "B3"
+}
+
+
+resource "azurerm_linux_web_app" "apihost" {
+ name = "apihost-angular"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+}
+
+resource "azurerm_static_site" "angularweb" {
+ name = "angularweb"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+}
+```
+
+{{ else if UI == "Blazor" }}
+
+```terraform
+# Configure the Azure provider
+terraform {
+ required_providers {
+ azurerm = {
+ source = "hashicorp/azurerm"
+ version = "~> 3.0.0"
+ }
+ }
+ required_version = ">= 0.14.9"
+}
+provider "azurerm" {
+ features {}
+}
+
+# Create the resource group
+resource "azurerm_resource_group" "rg" {
+ name = "blazor-app-nontier-rg"
+ location = "westeurope"
+}
+
+# Create the Linux App Service Plan
+resource "azurerm_service_plan" "appserviceplan" {
+ name = "blazor-app-nontier-plan"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ os_type = "Linux"
+ sku_name = "B3"
+}
+
+# Create the web app, pass in the App Service Plan ID
+
+resource "azurerm_linux_web_app" "apihost" {
+ name = "apihost-blazor"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+}
+resource "azurerm_static_site" "blazorweb" {
+ name = "blazorweb"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+}
+```
+
+{{ else if UI == "BlazorServer" }}
+
+ {{if Tiered == "No"}}
+
+```terraform
+# Configure the Azure provider
+terraform {
+ required_providers {
+ azurerm = {
+ source = "hashicorp/azurerm"
+ version = "~> 3.0.0"
+ }
+ }
+ required_version = ">= 0.14.9"
+}
+provider "azurerm" {
+ features {}
+}
+
+# Create the resource group
+resource "azurerm_resource_group" "rg" {
+ name = "blazorserver-app-nontier-rg"
+ location = "westeurope"
+}
+
+# Create the Linux App Service Plan
+resource "azurerm_service_plan" "appserviceplan" {
+ name = "blazorserver-app-nontier-plan"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ os_type = "Linux"
+ sku_name = "B3"
+}
+
+# Create the web app, pass in the App Service Plan ID
+resource "azurerm_linux_web_app" "authserver" {
+ name = "authserver-blazorserver"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+}
+resource "azurerm_linux_web_app" "apihost" {
+ name = "apihost-blazorserver"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+}
+resource "azurerm_linux_web_app" "webapp" {
+ name = "webapp-blazorserver"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+}
+```
+
+ {{ else }}
+
+```terraform
+# Configure the Azure provider
+terraform {
+ required_providers {
+ azurerm = {
+ source = "hashicorp/azurerm"
+ version = "~> 3.0.0"
+ }
+ }
+ required_version = ">= 0.14.9"
+}
+provider "azurerm" {
+ features {}
+}
+
+# Create the resource group
+resource "azurerm_resource_group" "rg" {
+ name = "blazorserver-app-tier-rg"
+ location = "westeurope"
+}
+
+# Create the Linux App Service Plan
+resource "azurerm_service_plan" "appserviceplan" {
+ name = "blazorserver-app-tier-plan"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ os_type = "Linux"
+ sku_name = "B3"
+}
+
+# Create the web app, pass in the App Service Plan ID
+resource "azurerm_linux_web_app" "authserver" {
+ name = "authserver-blazorserver"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+ app_settings = {
+ "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
+ }
+}
+resource "azurerm_linux_web_app" "apihost" {
+ name = "apihost-blazorserver"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+ app_settings = {
+ "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
+ }
+}
+resource "azurerm_linux_web_app" "webapp" {
+ name = "webapp-blazorserver"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+ app_settings = {
+ "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
+ }
+}
+
+resource "azurerm_redis_cache" "redis" {
+ name = "redis-blazorserver"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ capacity = 0
+ family = "C"
+ sku_name = "Basic"
+ enable_non_ssl_port = false
+ minimum_tls_version = "1.2"
+
+ redis_configuration {
+ maxmemory_reserved = 2
+ maxmemory_delta = 2
+ maxmemory_policy = "volatile-lru"
+ }
+}
+```
+
+ {{end}}
+
+{{ else if UI == "MVC" }}
+
+ {{ if Tiered == "No" }}
+
+```terraform
+# Configure the Azure provider
+terraform {
+ required_providers {
+ azurerm = {
+ source = "hashicorp/azurerm"
+ version = "~> 3.0.0"
+ }
+ }
+ required_version = ">= 0.14.9"
+}
+provider "azurerm" {
+ features {}
+}
+
+# Create the resource group
+resource "azurerm_resource_group" "rg" {
+ name = "demo-abp-web-app"
+ location = "westeurope"
+}
+
+# Create the Linux App Service Plan
+resource "azurerm_service_plan" "appserviceplan" {
+ name = "demo-abp-web-app-plan"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ os_type = "Linux"
+ sku_name = "B3"
+}
+
+# Create the web app, pass in the App Service Plan ID
+resource "azurerm_linux_web_app" "webapp" {
+ name = "demo-abp-web-app"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+}
+
+output "webappurl" {
+
+ value = "${azurerm_linux_web_app.webapp.name}.azurewebsites.net"
+}
+```
+
+ {{ else }}
+
+```terraform
+# Configure the Azure provider
+terraform {
+ required_providers {
+ azurerm = {
+ source = "hashicorp/azurerm"
+ version = "~> 3.0.0"
+ }
+ }
+ required_version = ">= 0.14.9"
+}
+provider "azurerm" {
+ features {}
+}
+
+# Create the resource group
+resource "azurerm_resource_group" "rg" {
+ name = "demo-abp-web-app-tier-rg"
+ location = "westeurope"
+}
+
+# Create the Linux App Service Plan
+resource "azurerm_service_plan" "appserviceplan" {
+ name = "demo-abp-web-app-tier-plan"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ os_type = "Linux"
+ sku_name = "B3"
+}
+
+# Create the web app, pass in the App Service Plan ID
+resource "azurerm_linux_web_app" "authserver" {
+ name = "authserver-prodemo"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+ app_settings = {
+ "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
+ }
+}
+resource "azurerm_linux_web_app" "apihost" {
+ name = "apihost-prodemo"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+ app_settings = {
+ "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
+ }
+}
+resource "azurerm_linux_web_app" "webapp" {
+ name = "webapp-prodemo"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ service_plan_id = azurerm_service_plan.appserviceplan.id
+ https_only = true
+ site_config {
+ application_stack {
+ dotnet_version = "6.0"
+ }
+ minimum_tls_version = "1.2"
+ }
+ app_settings = {
+ "Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
+ }
+}
+
+resource "azurerm_redis_cache" "redis" {
+ name = "redis-prodemo"
+ location = azurerm_resource_group.rg.location
+ resource_group_name = azurerm_resource_group.rg.name
+ capacity = 0
+ family = "C"
+ sku_name = "Basic"
+ enable_non_ssl_port = false
+ minimum_tls_version = "1.2"
+
+ redis_configuration {
+ maxmemory_reserved = 2
+ maxmemory_delta = 2
+ maxmemory_policy = "volatile-lru"
+ }
+}
+
+output "authserver" {
+
+ value = "${azurerm_linux_web_app.authserver.name}.azurewebsites.net"
+}
+
+output "apihost" {
+
+ value = "${azurerm_linux_web_app.apihost.name}.azurewebsites.net"
+}
+
+output "webapp" {
+
+ value = "${azurerm_linux_web_app.webapp.name}.azurewebsites.net"
+}
+
+output "redis_hostname" {
+ value = azurerm_redis_cache.redis.hostname
+ description = "The hostname for the Redis instance."
+}
+```
+
+ {{end}}
+
+{{end}}
+
+
+3. Run `terraform init` to initialize the directory.
+
+4. Run `terraform plan` to see the execution plan.
+
+5. Run `terraform apply` to apply the changes. Write `yes` when prompted to confirm the deployment.
+
+6. Wait for the deployment to complete.
+
+7. Navigate to the web app URL to see the deployed application.
+
+> You can also see the web app URL in the output of the `terraform apply` command.
+
+> You have to change the **dotnet version** of the runtime stack according to your application. For example, if you are using .NET 7, you should change `dotnet_version = "6.0"` to `dotnet_version = "7.0"`.
+
+
+
+## Destroying the Terraform Configuration
+
+1. Run `terraform destroy` to destroy the created resources.
+
+2. Type `yes` when prompted to confirm the destruction.
+
diff --git a/docs/en/solution-templates/layered-web-application/deployment/deployment-docker-compose.md b/docs/en/solution-templates/layered-web-application/deployment/deployment-docker-compose.md
new file mode 100644
index 0000000000..a9e106221b
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/deployment-docker-compose.md
@@ -0,0 +1,1933 @@
+# Docker Deployment using Docker Compose
+
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference at the top of this document.
+
+This guide will guide you through how to build docker images for your application and run on localhost using `docker compose`. You will learn the provided build scripts and docker compose files in detail and how to modify them for the production environment.
+
+## Building Docker Images
+
+Each application contains a dockerfile called `Dockerfile.local` for building the docker image. As the naming implies, these Dockerfiles are not multi-stage Dockerfiles and require the project to be built in `Release` mode to create the image. Currently, if you are building your images using CI & CD pipeline, you either need to include the SDK to your pipeline before building the images or add your own [multi-stage dockerfiles](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-7.0).
+
+Since they are not multi-staged Dockerfiles, if you want to build the images individually, you can navigate to the related to-be-hosted application folder and run the following command:
+
+``````powershell
+dotnet publish -c Release
+``````
+
+To populate the **Release** folder first, which will be used to build the docker images. Afterward, you can run the following command:
+
+```powershell
+docker build -f Dockerfile.local -t mycompanyname/myappname:version .
+```
+
+To manually build your application image.
+
+To ease the process, application templates provide a build script to build all the images with a single script under `etc/build` folder named `build-images-locally.ps1`.
+Based on your application name, UI and type, a build image script will be generated.
+
+{{ if UI == "MVC"}}
+
+```powershell
+param ($version='latest')
+
+$currentFolder = $PSScriptRoot
+$slnFolder = Join-Path $currentFolder "../../"
+
+Write-Host "********* BUILDING DbMigrator *********" -ForegroundColor Green
+$dbMigratorFolder = Join-Path $slnFolder "src/Acme.BookStore.DbMigrator"
+Set-Location $dbMigratorFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-db-migrator:$version .
+
+Write-Host "********* BUILDING Web Application *********" -ForegroundColor Green
+$webFolder = Join-Path $slnFolder "src/Acme.BookStore.Web"
+Set-Location $webFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-web:$version .
+
+ {{ if Tiered == "Yes"}}
+Write-Host "********* BUILDING Api.Host Application *********" -ForegroundColor Green
+$hostFolder = Join-Path $slnFolder "src/Acme.BookStore.HttpApi.Host"
+Set-Location $hostFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-api:$version .
+
+Write-Host "********* BUILDING AuthServer Application *********" -ForegroundColor Green
+$authServerAppFolder = Join-Path $slnFolder "src/Acme.BookStore.AuthServer"
+Set-Location $authServerAppFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-authserver:$version .
+ {{ end }}
+
+### ALL COMPLETED
+Write-Host "COMPLETED" -ForegroundColor Green
+Set-Location $currentFolder
+```
+
+{{ end }}
+
+{{ if UI == "NG"}}
+
+```powershell
+param ($version='latest')
+
+$currentFolder = $PSScriptRoot
+$slnFolder = Join-Path $currentFolder "../../"
+
+Write-Host "********* BUILDING DbMigrator *********" -ForegroundColor Green
+$dbMigratorFolder = Join-Path $slnFolder "src/Acme.BookStore.DbMigrator"
+Set-Location $dbMigratorFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-db-migrator:$version .
+
+Write-Host "********* BUILDING Angular Application *********" -ForegroundColor Green
+$angularAppFolder = Join-Path $slnFolder "../angular"
+Set-Location $angularAppFolder
+yarn
+npm run build:prod
+docker build -f Dockerfile.local -t acme/bookstore-angular:$version .
+
+Write-Host "********* BUILDING Api.Host Application *********" -ForegroundColor Green
+$hostFolder = Join-Path $slnFolder "src/Acme.BookStore.HttpApi.Host"
+Set-Location $hostFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-api:$version .
+
+ {{ if Tiered == "Yes"}}
+$authServerAppFolder = Join-Path $slnFolder "src/Acme.BookStore.AuthServer"
+Set-Location $authServerAppFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-authserver:$version .
+ {{ end }}
+
+### ALL COMPLETED
+Write-Host "COMPLETED" -ForegroundColor Green
+Set-Location $currentFolder
+```
+
+{{ end }}
+
+{{ if UI == "Blazor" }}
+
+```powershell
+param ($version='latest')
+
+$currentFolder = $PSScriptRoot
+$slnFolder = Join-Path $currentFolder "../../"
+
+Write-Host "********* BUILDING DbMigrator *********" -ForegroundColor Green
+$dbMigratorFolder = Join-Path $slnFolder "src/Acme.BookStore.DbMigrator"
+Set-Location $dbMigratorFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-db-migrator:$version .
+
+Write-Host "********* BUILDING Blazor Application *********" -ForegroundColor Green
+$blazorFolder = Join-Path $slnFolder "src/Acme.BookStore.Blazor"
+Set-Location $blazorFolder
+dotnet publish -c Release -p:PublishTrimmed=false
+docker build -f Dockerfile.local -t acme/bookstore-blazor:$version .
+
+Write-Host "********* BUILDING Api.Host Application *********" -ForegroundColor Green
+$hostFolder = Join-Path $slnFolder "src/Acme.BookStore.HttpApi.Host"
+Set-Location $hostFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-api:$version .
+ {{ if Tiered == "Yes"}}
+$authServerAppFolder = Join-Path $slnFolder "src/Acme.BookStore.AuthServer"
+Set-Location $authServerAppFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-authserver:$version .
+ {{ end }}
+### ALL COMPLETED
+Write-Host "COMPLETED" -ForegroundColor Green
+Set-Location $currentFolder
+```
+
+{{ end }}
+
+{{ if UI == "BlazorServer" }}
+
+```powershell
+param ($version='latest')
+
+$currentFolder = $PSScriptRoot
+$slnFolder = Join-Path $currentFolder "../../"
+
+Write-Host "********* BUILDING DbMigrator *********" -ForegroundColor Green
+$dbMigratorFolder = Join-Path $slnFolder "src/Acme.BookStore.DbMigrator"
+Set-Location $dbMigratorFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-db-migrator:$version .
+
+Write-Host "********* BUILDING Blazor Application *********" -ForegroundColor Green
+$blazorFolder = Join-Path $slnFolder "src/Acme.BookStore.Blazor"
+Set-Location $blazorFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-blazor:$version .
+
+ {{ if Tiered == "Yes"}}
+$authServerAppFolder = Join-Path $slnFolder "src/Acme.BookStore.AuthServer"
+Set-Location $authServerAppFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-authserver:$version .
+
+Write-Host "********* BUILDING Api.Host Application *********" -ForegroundColor Green
+$hostFolder = Join-Path $slnFolder "src/Acme.BookStore.HttpApi.Host"
+Set-Location $hostFolder
+dotnet publish -c Release
+docker build -f Dockerfile.local -t acme/bookstore-api:$version .
+ {{ end }}
+### ALL COMPLETED
+Write-Host "COMPLETED" -ForegroundColor Green
+Set-Location $currentFolder
+```
+
+{{ end }}
+
+The **image tag** is set to `latest` by default. You can update the `param $version` at the first line to set it as a tag for your images.
+
+You can examine all the provided Dockerfiles required to publish your application below;
+
+### DBMigrator
+
+DbMigrator is a console application that is used to migrate the database of your application and seed the initial important data to run your application. Such as pre-defined languages, admin user and role, OpenIddict applications and scopes.
+
+`Dockerfile.local` is provided under this project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+ENTRYPOINT ["dotnet", "BookStore.DbMigrator.dll"]
+```
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to **DbMigrator** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-db-migrator:latest . #Builds the image with "latest" tag
+```
+
+{{ if UI == "MVC" }}
+
+### MVC/Razor Pages
+
+ {{ if Tiered == "Yes" }}MVC/Razor Pages application is a server-side rendering application that uses Cookie authentication as the default scheme and OpenIdConnect as the default challenge scheme.
+
+In the **WebModule** under authentication configuration, there is an extra configuration for containerized environment support:
+
+```csharp
+if (Convert.ToBoolean(configuration["AuthServer:IsContainerizedOnLocalhost"]))
+{
+ context.Services.Configure("oidc", options =>
+ {
+ options.TokenValidationParameters.ValidIssuers = new[]
+ {
+ configuration["AuthServer:MetaAddress"].EnsureEndsWith('/'),
+ configuration["AuthServer:Authority"].EnsureEndsWith('/')
+ };
+
+ options.MetadataAddress = configuration["AuthServer:MetaAddress"].EnsureEndsWith('/') +
+ ".well-known/openid-configuration";
+
+ var previousOnRedirectToIdentityProvider = options.Events.OnRedirectToIdentityProvider;
+ options.Events.OnRedirectToIdentityProvider = async ctx =>
+ {
+ // Intercept the redirection so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/authorize";
+
+ if (previousOnRedirectToIdentityProvider != null)
+ {
+ await previousOnRedirectToIdentityProvider(ctx);
+ }
+ };
+ var previousOnRedirectToIdentityProviderForSignOut = options.Events.OnRedirectToIdentityProviderForSignOut;
+ options.Events.OnRedirectToIdentityProviderForSignOut = async ctx =>
+ {
+ // Intercept the redirection for signout so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/logout";
+
+ if (previousOnRedirectToIdentityProviderForSignOut != null)
+ {
+ await previousOnRedirectToIdentityProviderForSignOut(ctx);
+ }
+ };
+ });
+
+}
+```
+
+This is used when the **AuthServer is running on docker containers(or pods)** to configure the redirection URLs for the internal network and the web. The application must be redirected to real DNS (localhost in this case) when the `/authorize` and `/logout` requests over the browser but handle the token validation inside the isolated network without going out to the internet. `"AuthServer:MetaAddress"` appsetting should indicate the container/pod service name while the `AuthServer:Authority` should be pointing to real DNS for the browser to redirect.
+
+The `appsettings.json` file does not contain `AuthServer:IsContainerizedOnLocalhost` and `AuthServer:MetaAddress` settings since they are used for orchestrated deployment scenarios, you can see these settings are overridden by the `docker-compose.yml` file.
+
+`Dockerfile.local` is provided under this project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+ENTRYPOINT ["dotnet", "Acme.BookStore.Web.dll"]
+```
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to the **Web** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-web:latest . #Builds the image with "latest" tag
+```
+
+ {{ end }} {{ if Tiered == "No" }}MVC/Razor Pages application is a server-side rendering application that contains both the OpenID-provider and the Http.Api endpoints within self; it will be a single application to deploy. `Dockerfile.local` is provided under this project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+
+FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+WORKDIR /src
+RUN dotnet dev-certs https -v -ep authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED
+
+FROM base AS final
+WORKDIR /app
+COPY --from=build /src .
+
+ENTRYPOINT ["dotnet", "Acme.BookStore.Web.dll"]
+```
+
+You can come across an error when the image is being built. This occurs because of `dotnet dev-certs` command trying to list the existing certificates **inside the container** and unavailable to. This error is not important since we aim to generate the **authserver.pfx** file and discard the container it is built in.
+
+
+
+Since it contains the openid-provider within, it also uses multi-stages to generate `authserver.pfx` file which is **used by OpenIddict as signing and encryption certificate**. This configuration is found under the `PreConfigureServices` method of the **WebModule**:
+
+```csharp
+if (!hostingEnvironment.IsDevelopment())
+{
+ PreConfigure(options =>
+ {
+ options.AddDevelopmentEncryptionAndSigningCertificate = false;
+ });
+
+ PreConfigure(builder =>
+ {
+ builder.AddSigningCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.AddEncryptionCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.SetIssuer(new Uri(configuration["AuthServer:Authority"]));
+ });
+}
+```
+
+This configuration disables the *DevelopmentEncryptionAndSigningCertificate* and uses a self-signed certificate called `authserver.pfx`. for **signing and encrypting the tokens**. This certificate is created when the docker image is built using the `dotnet dev-certs` tooling. It is a sample-generated certificate, and it is **recommended** to update it for the production environment. You can check the [OpenIddict Encryption and signing credentials documentation](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html) for different options and customization.
+
+The `GetSigningCertificate` method is a private method located under the same **WebModule**:
+
+```csharp
+private X509Certificate2 GetSigningCertificate(IWebHostEnvironment hostingEnv, IConfiguration configuration)
+{
+ var fileName = "authserver.pfx";
+ var passPhrase = "2D7AA457-5D33-48D6-936F-C48E5EF468ED";
+ var file = Path.Combine(hostingEnv.ContentRootPath, fileName);
+
+ if (!File.Exists(file))
+ {
+ throw new FileNotFoundException($"Signing Certificate couldn't found: {file}");
+ }
+
+ return new X509Certificate2(file, passPhrase);
+}
+```
+
+> You can always create any self-signed certificate using any other tooling outside the Dockerfile. You need to remember to set them as **embedded resource** since the `GetSigningCertificate` method will be checking this file physically.
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to the **Web** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-web:latest . #Builds the image with "latest" tag
+```
+
+ {{ end }}
+
+{{ end }}
+
+{{ if UI == "BlazorServer" }}
+
+### Blazor Server
+
+ {{ if Tiered == "Yes" }}Blazor Server application is a server-side rendering application that uses Cookie authentication as the default scheme and OpenIdConnect as the default challenge scheme.
+
+In the **BlazorModule** under authentication configuration, there is an extra configuration for containerized environment support:
+
+```csharp
+if (Convert.ToBoolean(configuration["AuthServer:IsContainerizedOnLocalhost"]))
+{
+ context.Services.Configure("oidc", options =>
+ {
+ options.TokenValidationParameters.ValidIssuers = new[]
+ {
+ configuration["AuthServer:MetaAddress"].EnsureEndsWith('/'),
+ configuration["AuthServer:Authority"].EnsureEndsWith('/')
+ };
+
+ options.MetadataAddress = configuration["AuthServer:MetaAddress"].EnsureEndsWith('/') +
+ ".well-known/openid-configuration";
+
+ var previousOnRedirectToIdentityProvider = options.Events.OnRedirectToIdentityProvider;
+ options.Events.OnRedirectToIdentityProvider = async ctx =>
+ {
+ // Intercept the redirection so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/authorize";
+
+ if (previousOnRedirectToIdentityProvider != null)
+ {
+ await previousOnRedirectToIdentityProvider(ctx);
+ }
+ };
+ var previousOnRedirectToIdentityProviderForSignOut = options.Events.OnRedirectToIdentityProviderForSignOut;
+ options.Events.OnRedirectToIdentityProviderForSignOut = async ctx =>
+ {
+ // Intercept the redirection for signout so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/logout";
+
+ if (previousOnRedirectToIdentityProviderForSignOut != null)
+ {
+ await previousOnRedirectToIdentityProviderForSignOut(ctx);
+ }
+ };
+ });
+
+}
+```
+
+This is used when the **AuthServer is running on docker containers(or pods)** to configure the redirection URLs for the internal network and the web. The application must be redirected to real DNS (localhost in this case) when the `/authorize` and `/logout` requests over the browser but handle the token validation inside the isolated network without going out to the internet. `"AuthServer:MetaAddress"` appsetting should indicate the container/pod service name while the `AuthServer:Authority` should be pointing to real DNS for the browser to redirect.
+
+The `appsettings.json` file does not contain `AuthServer:IsContainerizedOnLocalhost` and `AuthServer:MetaAddress` settings since they are used for orchestrated deployment scenarios, you can see these settings are overridden by the `docker-compose.yml` file.
+
+`Dockerfile.local` is provided under this project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+ENTRYPOINT ["dotnet", "Acme.BookStore.Blazor.dll"]
+```
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to **Blazor** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-blazor:latest . #Builds the image with "latest" tag
+```
+
+ {{ end }} {{ if Tiered == "No" }}Blazor Server application is a server-side rendering application that contains both the OpenID-provider and the Http.Api endpoints within self; it will be a single application to deploy. `Dockerfile.local` is provided under this project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+
+FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+WORKDIR /src
+RUN dotnet dev-certs https -v -ep authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED
+
+FROM base AS final
+WORKDIR /app
+COPY --from=build /src .
+
+ENTRYPOINT ["dotnet", "Acme.BookStore.Blazor.dll"]
+```
+
+You can come across an error when the image is being built. This occurs because of `dotnet dev-certs` command trying to list the existing certificates **inside the container** and unavailable to. This error is not important since we aim to generate the **authserver.pfx** file and discard the container it is built in.
+
+
+
+Since it contains the OpenID-provider within, it also uses multi-stages to generate `authserver.pfx` file which is **used by OpenIddict as a signing and encryption certificate**. This configuration is found under the `PreConfigureServices` method of the **BlazorModule**:
+
+```csharp
+if (!hostingEnvironment.IsDevelopment())
+{
+ PreConfigure(options =>
+ {
+ options.AddDevelopmentEncryptionAndSigningCertificate = false;
+ });
+
+ PreConfigure(builder =>
+ {
+ builder.AddSigningCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.AddEncryptionCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.SetIssuer(new Uri(configuration["AuthServer:Authority"]));
+ });
+}
+```
+
+This configuration disables the *DevelopmentEncryptionAndSigningCertificate* and uses a self-signed certificate called `authserver.pfx`. for **signing and encrypting the tokens**. This certificate is created when the docker image is built using the `dotnet dev-certs` tooling. It is a sample-generated certificate, and it is **recommended** to update it for the production environment. You can check the [OpenIddict Encryption and signing credentials documentation](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html) for different options and customization.
+
+The `GetSigningCertificate` method is a private method located under the same **BlazorModule**:
+
+```csharp
+private X509Certificate2 GetSigningCertificate(IWebHostEnvironment hostingEnv, IConfiguration configuration)
+{
+ var fileName = "authserver.pfx";
+ var passPhrase = "2D7AA457-5D33-48D6-936F-C48E5EF468ED";
+ var file = Path.Combine(hostingEnv.ContentRootPath, fileName);
+
+ if (!File.Exists(file))
+ {
+ throw new FileNotFoundException($"Signing Certificate couldn't found: {file}");
+ }
+
+ return new X509Certificate2(file, passPhrase);
+}
+```
+
+> You can always create any self-signed certificate using any other tooling outside the dockerfile. You need to remember to set them as **embedded resource** since the `GetSigningCertificate` method will be checking this file physically.
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to the **BlazorModule** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-blazor:blazor . #Builds the image with "latest" tag
+```
+
+ {{ end }}
+
+{{ end }}
+
+{{ if UI == "NG" }}
+
+### Angular
+
+The angular application uses [nginx:alpine-slim](https://hub.docker.com/layers/library/nginx/alpine-slim/images/sha256-0f859db466fda2c52f62b48d0602fb26867d98edbd62c26ae21414b3dea8d8f4?context=explore) base image to host the angular application. You can modify the base image based on your preference in the `Dockerfile.local`, which is provided under the angular folder of your solution as below;
+
+```dockerfile
+FROM nginx:alpine-slim
+WORKDIR /app
+COPY dist/BookStore /usr/share/nginx/html
+COPY dynamic-env.json /usr/share/nginx/html
+COPY /nginx.conf /etc/nginx/conf.d/default.conf
+```
+
+You can notice that two more files are copied into the application image beside the built Angular application.
+
+The `dynamic-env.json` file is an empty JSON file representing the angular application's environment variables. The environment variable on image runtime will override this file. If you examine the `environment.prod.ts` file under the `angular/src/environments` folder, **there is a remote environment configuration for production**:
+
+```json
+remoteEnv: {
+ url: '/getEnvConfig',
+ mergeStrategy: 'deepmerge'
+ }
+```
+
+[This configuration is used to get the environment variables from a remote service](https://docs.abp.io/en/abp/latest/UI/Angular/Environment#remoteenvironment). This configuration is used to **override environment variables without rebuilding the image.** The URL `/getEnvConfig` is defined in the `nginx.conf` file:
+
+```nginx
+server {
+ listen 80;
+ listen [::]:80;
+ server_name _;
+
+ #listen 443 ssl;
+ #server_name www.myapp.com;
+ #ssl_certificate www.myapp.com.crt;
+ #ssl_certificate_key www.myapp.com.key;
+
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ try_files $uri $uri/ /index.html =404;
+ }
+
+ location /getEnvConfig {
+ default_type 'application/json';
+ add_header 'Access-Control-Allow-Origin' '*' always;
+ add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
+ add_header 'Content-Type' 'application/json';
+ try_files $uri /dynamic-env.json;
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+}
+```
+
+This configuration allows returning the `dynamic-env.json` file as a static file, which ABP Angular application uses for environment variables in one of the first initial requests when rendering the page. **The `dynamic-env.json` file you need to override is located under `aspnet-core/etc/docker`** folder.
+
+ {{ if Tiered == "No" }}
+
+```json
+{
+ "production": true,
+ "application": {
+ "baseUrl":"http://localhost:4200", // https://myapp.com
+ "name": "BookStore",
+ "logoUrl": ""
+ },
+ "oAuthConfig": {
+ "issuer": "https://localhost:44354/", // https://myapi.com/
+ "redirectUri": "http://localhost:4200", // https://myapp.com
+ "clientId": "BookStore_App",
+ "responseType": "code",
+ "scope": "offline_access openid profile email phone BookStore"
+ },
+ "apis": {
+ "default": {
+ "url": "https://localhost:44354", // https://myapi.com
+ "rootNamespace": "BookStore"
+ },
+ "AbpAccountPublic": {
+ "url": "https://localhost:44354", // https://myapi.com
+ "rootNamespace": "AbpAccountPublic"
+ }
+ }
+}
+```
+
+ {{ end }}
+
+ {{ if Tiered == "Yes" }}
+
+```json
+{
+ "production": true,
+ "application": {
+ "baseUrl":"http://localhost:4200", // https://myapp.com
+ "name": "BookStore",
+ "logoUrl": ""
+ },
+ "oAuthConfig": {
+ "issuer": "https://localhost:44334/", // https://myauthserver.com/
+ "redirectUri": "http://localhost:4200", // https://myapp.com
+ "clientId": "BookStore_App",
+ "responseType": "code",
+ "scope": "offline_access openid profile email phone BookStore"
+ },
+ "apis": {
+ "default": {
+ "url": "https://localhost:44354", // https://myapi.com
+ "rootNamespace": "BookStore"
+ },
+ "AbpAccountPublic": {
+ "url": "https://localhost:44334", // https://myauthserver.com
+ "rootNamespace": "AbpAccountPublic"
+ }
+ }
+}
+```
+
+ {{ end }}
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to the **angular** folder and run:
+
+```powershell
+yarn #Restores the project
+npm run build:prod #Builds on production environment. You can also use "ng build --prod" if you have the angular CLI
+docker build -f Dockerfile.local -t acme/bookstore-angular:latest . #Builds the image with "latest" tag
+```
+
+{{ end }}
+
+{{ if UI == "Blazor" }}
+
+### Blazor
+
+The Blazor application uses [nginx:alpine-slim](https://hub.docker.com/layers/library/nginx/alpine-slim/images/sha256-0f859db466fda2c52f62b48d0602fb26867d98edbd62c26ae21414b3dea8d8f4?context=explore) base image to host the blazor application. You can modify the base image based on your preference in the `Dockerfile.local` which provided under the Blazor folder of your solution as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS build
+COPY bin/Release/net7.0/publish/ app/
+
+FROM nginx:alpine-slim AS final
+WORKDIR /usr/share/nginx/html
+COPY --from=build /app/wwwroot .
+COPY /nginx.conf /etc/nginx/conf.d/default.conf
+```
+
+Other than the built Blazor application, there is also `nginx.conf` file is copied into the application image. The `nginx.conf` file:
+
+```nginx
+server {
+ listen 80;
+ listen [::]:80;
+ server_name _;
+
+ #listen 443 ssl;
+ #server_name www.myapp.com;
+ #ssl_certificate www.myapp.com.crt;
+ #ssl_certificate_key www.myapp.com.key;
+
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ try_files $uri $uri/ /index.html =404;
+ }
+ #error_page 404 /404.html;
+
+ # redirect server error pages to the static page /50x.html
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+}
+```
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to **Blazor** folder and run:
+
+```powershell
+##Builds the projects in Release mode with the Trimming option disabled. You can enable or configure it as you like
+dotnet publish -c Release -p:PublishTrimmed=false
+docker build -f Dockerfile.local -t acme/bookstore-blazor:latest . #Builds the image with "latest" tag
+```
+
+{{ end }}
+
+{{ if Tiered == "No" }}
+
+ {{ if UI == "NG" }}
+
+### Http.Api.Host
+
+This is the backend application that contains the openid-provider functionality as well. The `dockerfile.local` is located under the `Http.Api.Host` project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+
+FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+WORKDIR /src
+RUN dotnet dev-certs https -v -ep authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED
+
+FROM base AS final
+WORKDIR /app
+COPY --from=build /src .
+
+ENTRYPOINT ["dotnet", "Acme.BookStore.HttpApi.Host.dll"]
+```
+
+You can come across an error when the image is being built. This occurs because of `dotnet dev-certs` command trying to list the existing certificates **inside the container** and unavailable to. This error is not important since we aim to generate the **authserver.pfx** file and discard the container it is built in.
+
+
+
+Since it contains the OpenID-provider within, it also uses multi-stages to generate `authserver.pfx` file, which is **used by OpenIddict as a signing and encryption certificate**. This configuration is found under the `PreConfigureServices` method of the **HttpApiHostModule**:
+
+```csharp
+if (!hostingEnvironment.IsDevelopment())
+{
+ PreConfigure(options =>
+ {
+ options.AddDevelopmentEncryptionAndSigningCertificate = false;
+ });
+
+ PreConfigure(builder =>
+ {
+ builder.AddSigningCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.AddEncryptionCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.SetIssuer(new Uri(configuration["AuthServer:Authority"]));
+ });
+}
+```
+
+This configuration disables the *DevelopmentEncryptionAndSigningCertificate* and uses a self-signed certificate called `authserver.pfx`. for **signing and encrypting the tokens**. This certificate is created when the docker image is built using the `dotnet dev-certs` tooling. It is a sample-generated certificate, and it is **recommended** to update it for the production environment. You can check the [OpenIddict Encryption and signing credentials documentation](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html) for different options and customization.
+
+The `GetSigningCertificate` method is a private method located under the same **HttpApiHostModule**:
+
+```csharp
+private X509Certificate2 GetSigningCertificate(IWebHostEnvironment hostingEnv, IConfiguration configuration)
+{
+ var fileName = "authserver.pfx";
+ var passPhrase = "2D7AA457-5D33-48D6-936F-C48E5EF468ED";
+ var file = Path.Combine(hostingEnv.ContentRootPath, fileName);
+
+ if (!File.Exists(file))
+ {
+ throw new FileNotFoundException($"Signing Certificate couldn't found: {file}");
+ }
+
+ return new X509Certificate2(file, passPhrase);
+}
+```
+
+> You can always create any self-signed certificate using any other tooling outside of the dockerfile. You need to keep in mind to set them as **embedded resource** since the `GetSigningCertificate` method will be checking this file physically.
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to **Http.Api.Host** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-api:latest . #Builds the image with "latest" tag
+```
+
+ {{ end }}
+
+ {{ if UI == "Blazor" }}
+
+### Http.Api.Host
+
+This is the backend application that contains the OpenID-provider functionality as well. The `dockerfile.local` is located under the `Http.Api.Host` project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+
+FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+WORKDIR /src
+RUN dotnet dev-certs https -v -ep authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED
+
+FROM base AS final
+WORKDIR /app
+COPY --from=build /src .
+
+ENTRYPOINT ["dotnet", "Acme.BookStore.HttpApi.Host.dll"]
+```
+
+You can come across an error when the image is being built. This occurs because of `dotnet dev-certs` command trying to list the existing certificates **inside the container** and unavailable to. This error is not important since we aim to generate the **authserver.pfx** file and discard the container it is built in.
+
+
+
+Since it contains the openid-provider within, it also uses multi-stages to generate `authserver.pfx` file which is **used by OpenIddict as a signing and encryption certificate**. This configuration is found under the `PreConfigureServices` method of the **HttpApiHostModule**:
+
+```csharp
+if (!hostingEnvironment.IsDevelopment())
+{
+ PreConfigure(options =>
+ {
+ options.AddDevelopmentEncryptionAndSigningCertificate = false;
+ });
+
+ PreConfigure(builder =>
+ {
+ builder.AddSigningCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.AddEncryptionCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.SetIssuer(new Uri(configuration["AuthServer:Authority"]));
+ });
+}
+```
+
+This configuration disables the *DevelopmentEncryptionAndSigningCertificate* and uses a self-signed certificate called `authserver.pfx`. for **signing and encrypting the tokens**. This certificate is created when the docker image is built using the `dotnet dev-certs` tooling. It is a sample-generated certificate, and it is **recommended** to update it for the production environment. You can check the [OpenIddict Encryption and signing credentials documentation](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html) for different customization options.
+
+The `GetSigningCertificate` method is a private method located under the same **HttpApiHostModule**:
+
+```csharp
+private X509Certificate2 GetSigningCertificate(IWebHostEnvironment hostingEnv, IConfiguration configuration)
+{
+ var fileName = "authserver.pfx";
+ var passPhrase = "2D7AA457-5D33-48D6-936F-C48E5EF468ED";
+ var file = Path.Combine(hostingEnv.ContentRootPath, fileName);
+
+ if (!File.Exists(file))
+ {
+ throw new FileNotFoundException($"Signing Certificate couldn't found: {file}");
+ }
+
+ return new X509Certificate2(file, passPhrase);
+}
+```
+
+> You can always create any self-signed certificate using any other tooling outside the dockerfile. You need to remember to set them as **embedded resource** since the `GetSigningCertificate` method will be checking this file physically.
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to **Http.Api.Host** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-api:latest . #Builds the image with "latest" tag
+```
+
+ {{ end }}
+
+{{ end }}
+
+{{ if Tiered == "Yes" }}
+
+### AuthServer
+
+This is the openid-provider application, the authentication server, which should be individually hosted compared to non-tiered application templates. The `dockerfile.local` is located under the `AuthServer` project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+
+FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+WORKDIR /src
+RUN dotnet dev-certs https -v -ep authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED
+
+FROM base AS final
+WORKDIR /app
+COPY --from=build /src .
+
+ENTRYPOINT ["dotnet", "Acme.BookStore.AuthServer.dll"]
+```
+
+You can come across an error when the image is being built. This occurs because of `dotnet dev-certs` command trying to list the existing certificates **inside the container** and unavailable to. This is not an important error since we aim to generate the **authserver.pfx** file and discard the container it is built in.
+
+
+
+The AuthServer docker image building process contains multi-stages to generate `authserver.pfx` file, which is **used by OpenIddict as a signing and encryption certificate**. This configuration is found under the `PreConfigureServices` method of the **AuthServerModule**:
+
+```csharp
+if (!hostingEnvironment.IsDevelopment())
+{
+ PreConfigure(options =>
+ {
+ options.AddDevelopmentEncryptionAndSigningCertificate = false;
+ });
+
+ PreConfigure(builder =>
+ {
+ builder.AddSigningCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.AddEncryptionCertificate(GetSigningCertificate(hostingEnvironment, configuration));
+ builder.SetIssuer(new Uri(configuration["AuthServer:Authority"]));
+ });
+}
+```
+
+This configuration disables the *DevelopmentEncryptionAndSigningCertificate* and uses a self-signed certificate called `authserver.pfx`. for **signing and encrypting the tokens**. This certificate is created when the docker image is built using the `dotnet dev-certs` tooling. It is a sample-generated certificate, and it is **recommended** to update it for the production environment. You can check the [OpenIddict Encryption and signing credentials documentation](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html) for different options and customization.
+
+The `GetSigningCertificate` method is a private method located under the same **AuthServerModule**:
+
+```csharp
+private X509Certificate2 GetSigningCertificate(IWebHostEnvironment hostingEnv, IConfiguration configuration)
+{
+ var fileName = "authserver.pfx";
+ var passPhrase = "2D7AA457-5D33-48D6-936F-C48E5EF468ED";
+ var file = Path.Combine(hostingEnv.ContentRootPath, fileName);
+
+ if (!File.Exists(file))
+ {
+ throw new FileNotFoundException($"Signing Certificate couldn't found: {file}");
+ }
+
+ return new X509Certificate2(file, passPhrase);
+}
+```
+
+> You can always create any self-signed certificate using any other tooling outside the dockerfile. You need to remember to set them as **embedded resource** since the `GetSigningCertificate` method will be checking this file physically.
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to the **AuthServer** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-authserver:latest . #Builds the image with "latest" tag
+```
+
+### Http.Api.Host
+
+This is the backend application that exposes the endpoints and swagger UI. It is not a multi-stage dockerfile; hence you need to have already built this application in **Release mode** to use this dockerfile. The `dockerfile.local` is located under the `Http.Api.Host` project as below;
+
+```dockerfile
+FROM mcr.microsoft.com/dotnet/aspnet:7.0
+COPY bin/Release/net7.0/publish/ app/
+WORKDIR /app
+ENTRYPOINT ["dotnet", "Acme.BookStore.HttpApi.Host.dll"]
+```
+
+If you don't want to use the `build-images-locally.ps1` to build the images or to build this image individually and manually, navigate to **Http.Api.Host** folder and run:
+
+```powershell
+dotnet publish -c Release #Builds the projects in Release mode
+docker build -f Dockerfile.local -t acme/bookstore-api:latest . #Builds the image with "latest" tag
+```
+
+{{ end }}
+
+## Running Docker-Compose on Localhost
+
+Under the `etc/docker` folder, you can find the `docker-compose.yml` to run your application. To ease the running process, the template provides `run-docker.ps1` (and `run-docker.sh`) scripts that handle the HTTPS certificate creation, which is used in environment variables;
+
+```powershell
+$currentFolder = $PSScriptRoot
+
+$slnFolder = Join-Path $currentFolder "../"
+$certsFolder = Join-Path $currentFolder "certs"
+
+If(!(Test-Path -Path $certsFolder))
+{
+ New-Item -ItemType Directory -Force -Path $certsFolder
+ if(!(Test-Path -Path (Join-Path $certsFolder "localhost.pfx") -PathType Leaf)){
+ Set-Location $certsFolder
+ dotnet dev-certs https -v -ep localhost.pfx -p 91f91912-5ab0-49df-8166-23377efaf3cc -t
+ }
+}
+
+Set-Location $currentFolder
+docker-compose up -d
+```
+
+`run-docker.ps1` (or `run-docker.sh`) script will check if there is an existing dev-cert already under the `etc/certs` folder and generate a `localhost.pfx` file if it doesn't exist. **Kestrel will use this file as an HTTPS certificate**.
+
+You can also manually create the **localhost.pfx** file in a different path with different name and a different password by using `dotnet dev-certs https -v -ep myCert.pfx -p YOUR_PASSWORD_FOR_HTTPS_CERT -t` or with using any other self-signed certificate generation tool.
+
+You need to update the service environment variables `Kestrel__Certificates__Default__Path` with the path and filename you have created and the `Kestrel__Certificates__Default__Password` with your new password in the `docker-compose.yml` file.
+
+Now lets break down each docker compose service under the `docker-compose.yml` file:
+
+{{ if UI == "Blazor" }}
+
+### bookstore-blazor
+
+```yaml
+services:
+ bookstore-blazor:
+ image: acme/bookstore-blazor:latest
+ container_name: bookstore-blazor
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.Blazor/Dockerfile.local
+ ports:
+ - "44307:80"
+ depends_on:
+ - bookstore-api
+ restart: on-failure
+ volumes:
+ - ./appsettings.json:/usr/share/nginx/html/appsettings.json
+ networks:
+ - abp-network
+```
+
+This is the Blazor application we deploy on http://localhost:44307 by default using the `acme/bookstore-blazor:latest` image that we have built using the `build-images-locally.ps1` script. **It is not running on HTTPS** using the `localhost.pfx` since it is running on **Nginx** and it doesn't accept `pfx` files for SSL. You can check [Nginx Configuring HTTPS Servers documentation](http://nginx.org/en/docs/http/configuring_https_servers.html) for more information and apply the necessary configurations to `nginx.conf` file under the `Blazor` folder.
+
+> Don't forget to rebuild the `acme/bookstore-blazor:latest` image after updating the `nginx.conf` file.
+
+ On **volumes**, it mounts the **appsettings.json** file under the `docker` folder to achieve **changing the environment variables without re-building the image**. The overriding `docker/appsettings.json` file is as below:
+
+```json
+{
+ "App": {
+ "SelfUrl": "http://localhost:44307"
+ },
+ "AuthServer": { {{ if Tiered == "Yes" }}
+ "Authority": "https://localhost:44334", {{ end }} {{ if Tiered == "No" }}
+ "Authority": "https://localhost:44354", {{ end }}
+ "ClientId": "BookStore_Blazor",
+ "ResponseType": "code"
+ },
+ "RemoteServices": {
+ "Default": {
+ "BaseUrl": "https://localhost:44354"
+ },
+ "AbpAccountPublic": { {{ if Tiered == "Yes" }}
+ "BaseUrl": "https://localhost:44334" {{ end }} {{ if Tiered == "No" }}
+ "BaseUrl": "https://localhost:44354" {{ end }}
+ }
+ },
+ "AbpCli": {
+ "Bundle": {
+ "Mode": "BundleAndMinify",
+ "Name": "global",
+ "Parameters": {
+ "LeptonXTheme.Layout": "side-menu"
+ }
+ }
+ }
+}
+
+```
+
+> This service runs in Docker network called `abp-network`, awaits for the the `bookstore-api` to start up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+### bookstore-api
+
+```yaml
+bookstore-api:
+ image: acme/bookstore-api:latest
+ container_name: bookstore-api
+ hostname: bookstore-api
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.HttpApi.Host/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44354
+ - App__CorsOrigins=http://localhost:44307
+ - App__HealthCheckUrl=http://bookstore-api/health-status {{ if Tiered == "Yes" }}
+ - AuthServer__Authority=http://bookstore-authserver {{ end }} {{ if Tiered == "No" }}
+ - AuthServer__Authority=http://bookstore-api {{ end }}
+ - AuthServer__RequireHttpsMetadata=false {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }} {{ if Tiered == "Yes" }}
+ - Redis__Configuration=redis {{ end }}
+ ports:
+ - "44354:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }} {{ if Tiered == "Yes" }}
+ redis:
+ condition: service_healthy
+ restart: on-failure {{ end }}
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This service is the **backend** application of the Blazor application that uses the `acme/bookstore-api:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44354` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44354`. It must point to a **real DNS when deploying to production**.
+
+- `App__CorsOrigins` is the override configuration for CORS. We add the angular application URL here `http://localhost:44307`. It must point to a **real DNS when deploying to production**.
+
+- `App__HealthCheckUrl` is the override configuration for the health check URL. Since this request will be done **internally**, it points to the **service name** in containerized environment `http://bookstore-api/health-status`
+
+- `AuthServer__Authority` is the issuer URL. {{ if Tiered == "Yes" }} `http://bookstore-authserver` {{ end }}{{ if Tiered == "No" }} `http://bookstore-api` {{ end }} is the containerized issuer. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. {{ if Tiered == "Yes" }}Docker-compose is using an isolated internal docker network called `abp-network`. We want to use HTTP in the internal network communication without SSL overhead. Therefore, it is set to `false` by default. {{ end }}{{ if Tiered == "No" }} Since the backend itself is the OpenID-provider, we set it `true` by default.{{ end }}
+
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.{{ if Tiered == "Yes" }}
+
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+ {{ end }}
+
+> This service runs in a Docker network called `abp-network`, awaits for {{ if Tiered == "Yes" }}the redis service and {{ end }}the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+{{ if Tiered == "Yes" }}
+
+### bookstore-authserver
+
+```yaml
+bookstore-authserver:
+ image: acme/bookstore-authserver:latest
+ container_name: bookstore-authserver
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.AuthServer/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44334
+ - App__CorsOrigins=http://localhost:44307
+ - AuthServer__Authority=http://bookstore-authserver
+ - AuthServer__RequireHttpsMetadata=false {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ - Redis__Configuration=redis
+ ports:
+ - "44334:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This is the authentication server application that handles the authentication between applications using the OpenIddict library. It uses the `acme/bookstore-authserver:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44334` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44334`. It must point to a **real DNS when deploying to production**.
+
+- `App__CorsOrigins` is the override configuration for CORS. We add the angular and the Blazor application URLs here by default. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__Authority` is the issuer URL. `http://bookstore-authserver` is the endpoint for the authserver by default. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Docker-compose uses using isolated internal docker network called `abp-network`. We want to use HTTP in the internal network communication without SSL overhead. Therefore, it is set to `false` by default.
+
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+> This service runs in Docker network called `abp-network`, awaits for the Redis service and the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+{{ end }}
+
+### db-migrator
+
+```yaml
+db-migrator:
+ image: acme/bookstore-db-migrator:latest
+ container_name: db-migrator
+ build:
+ context: ../../
+ dockerfile: src/BookStore.DbMigrator/Dockerfile.local
+ environment:
+ - OpenIddict__Applications__BookStore_Blazor__RootUrl=http://localhost:44307 {{ if Tiered == "Yes" }}
+ - OpenIddict__Applications__BookStore_Swagger__RootUrl=https://localhost:44354 {{ end }} {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ networks:
+ - abp-network
+```
+
+The database migrator service migrates the database and seeds the initial data. **OpenIddict data** is one of your application's most important seeded data. On **production environment,** you need to override the root URL of your application (http://localhost:44307) {{ if Tiered == "Yes" }} and the swagger-ui client URL (https://localhost:44354){{ end }} so that the authentication can work properly.
+
+{{ end }}
+
+{{ if UI == "NG" }}
+
+### bookstore-angular
+
+```yaml
+services:
+ bookstore-angular:
+ image: acme/bookstore-angular:latest
+ container_name: bookstore-angular
+ build:
+ context: ../../../
+ dockerfile: angular/Dockerfile.local
+ ports:
+ - "4200:80"
+ depends_on:
+ - bookstore-api
+ volumes:
+ - ./dynamic-env.json://usr/share/nginx/html/dynamic-env.json
+ networks:
+ - abp-network
+```
+
+This is the angular application we deploy on http://localhost:4200 by default using the image that we have built using the `build-images-locally.ps1` script. **It is not running on HTTPS** using the `localhost.pfx` since it is running on **Nginx** and it doesn't accept `pfx` files for SSL. You can check [Nginx Configuring HTTPS Servers documentation](http://nginx.org/en/docs/http/configuring_https_servers.html) for more information and apply the necessary configurations to `nginx.conf` file under the `angular` folder.
+
+> Don't forget to rebuild the `acme/bookstore-angular:latest` image after updating the `nginx.conf` file.
+
+The bookstore-angular service mounts the `etc/docker/dynamic-env.json` file to change the existing dynamic-env.json file, which is copied during image creation, to change the environment variables on deployment time instead of re-creating the docker image after each environmental variable change. **Do not forget to override the `dynamic-env.json` located under the `aspnet-core/etc/docker`** folder.
+
+> If you are not using Docker with WSL, you may have problems with the volume mount permissions. You need to grant docker to be able to use the local file system. See this [SO answer](https://stackoverflow.com/a/20652410) for more information.
+
+ {{ if Tiered == "No" }}
+
+```json
+{
+ "production": true,
+ "application": {
+ "baseUrl":"http://localhost:4200", // https://myapp.com
+ "name": "BookStore",
+ "logoUrl": ""
+ },
+ "oAuthConfig": {
+ "issuer": "https://localhost:44354/", // https://myapi.com/
+ "redirectUri": "http://localhost:4200", // https://myapp.com
+ "clientId": "BookStore_App",
+ "responseType": "code",
+ "scope": "offline_access openid profile email phone BookStore"
+ },
+ "apis": {
+ "default": {
+ "url": "https://localhost:44354", // https://myapi.com
+ "rootNamespace": "BookStore"
+ },
+ "AbpAccountPublic": {
+ "url": "https://localhost:44354", // https://myapi.com
+ "rootNamespace": "AbpAccountPublic"
+ }
+ }
+}
+```
+
+ {{ end }}
+
+ {{ if Tiered == "Yes" }}
+
+```json
+{
+ "production": true,
+ "application": {
+ "baseUrl":"http://localhost:4200", // https://myapp.com
+ "name": "BookStore",
+ "logoUrl": ""
+ },
+ "oAuthConfig": {
+ "issuer": "https://localhost:44334/", // https://myauthserver.com/
+ "redirectUri": "http://localhost:4200", // https://myapp.com
+ "clientId": "BookStore_App",
+ "responseType": "code",
+ "scope": "offline_access openid profile email phone BookStore"
+ },
+ "apis": {
+ "default": {
+ "url": "https://localhost:44354", // https://myapi.com
+ "rootNamespace": "BookStore"
+ },
+ "AbpAccountPublic": {
+ "url": "https://localhost:44334", // https://myauthserver.com
+ "rootNamespace": "AbpAccountPublic"
+ }
+ }
+}
+```
+
+ {{ end }}
+
+### bookstore-api
+
+```yaml
+bookstore-api:
+ image: acme/bookstore-api:latest
+ container_name: bookstore-api
+ hostname: bookstore-api
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.HttpApi.Host/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44354
+ - App__AngularUrl=http://localhost:4200
+ - App__CorsOrigins=http://localhost:4200
+ - App__HealthCheckUrl=http://bookstore-api/health-status {{ if Tiered == "Yes" }}
+ - AuthServer__Authority=http://bookstore-authserver
+ - AuthServer__RequireHttpsMetadata=false {{ end }} {{ if Tiered == "No" }}
+ - App__RedirectAllowedUrls=http://localhost:4200
+ - AuthServer__Authority=https://localhost:44354
+ - AuthServer__RequireHttpsMetadata=true {{ end }} {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ - Redis__Configuration=redis
+ ports:
+ - "44354:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ redis:
+ condition: service_healthy
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This service is the **backend** application of the angular application that uses the `acme/bookstore-api:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44354` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44354`. It must point to a **real DNS when deploying to production**.
+
+- `App__AngularUrl` is the override configuration of URLs for account-related endpoints. It is `http://localhost:4200` by default. It must point to a **real DNS when deploying to production**.
+
+ {{ if Tiered == "No" }}
+
+- `App__RedirectAllowedUrls` is the override configuration of redirect URLs for the angular application. It is `http://localhost:4200` by default. It must point to a **real DNS when deploying to production**.
+
+ {{ end }}
+
+- `App__CorsOrigins` is the override configuration for CORS. It is `http://localhost:4200` by default. It must point to a **real DNS when deploying to production**.
+
+- `App__HealthCheckUrl` is the override configuration for the health check URL. Since this request will be done **internally**, it points to the **service name** in the containerized environment `http://bookstore-api/health-status`.
+
+- `AuthServer__Authority` is the issuer URL. {{ if Tiered == "Yes" }} `http://bookstore-authserver` {{ end }}{{ if Tiered == "No" }} `http://bookstore-api` {{ end }} is the containerized issuer. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. {{ if Tiered == "Yes" }}Docker-compose is using an isolated internal docker network called `abp-network`. We want to use HTTP in the internal network communication without SSL overhead; therefore it is set to `false` by default. {{ end }}{{ if Tiered == "No" }} Since the backend itself is the openid-provider, we set it `true` by default.{{ end }}
+
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+> This service runs in a docker network called `abp-network`, and awaits the Redis service and the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+{{ if Tiered == "Yes" }}
+
+### bookstore-authserver
+
+```yaml
+bookstore-authserver:
+ image: acme/bookstore-authserver:latest
+ container_name: bookstore-authserver
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.AuthServer/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44334
+ - App__CorsOrigins=http://localhost:4200
+ - App__RedirectAllowedUrls=http://localhost:4200
+ - AuthServer__Authority=https://localhost:44334/
+ - AuthServer__RequireHttpsMetadata=false {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ - Redis__Configuration=redis
+ ports:
+ - "44334:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy
+ {{ end }}
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This is the authentication server application that handles the authentication between applications using the OpenIddict library. It uses the `acme/bookstore-authserver:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44334` by default, by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44334`. It must point to a **real DNS when deploying to production**.
+- `App__CorsOrigins` is the override configuration for CORS. It is `http://localhost:4200` by default. It must point to a **real DNS when deploying to production**.
+- `App__RedirectAllowedUrls` is the override configuration of redirect URLs for the angular application. It is `http://localhost:4200` by default. It must point to a **real DNS when deploying to production**.
+- `AuthServer__Authority` is the issuer URL. `https://localhost:44334/` is the endpoint for the authserver by default. It must point to a **real DNS when deploying to production**.
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Docker-compose uses using isolated internal docker network called `abp-network`. It is set to `false` by default.
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+> This service runs in Docker network called `abp-network`, awaits for the Redis service and the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+{{ end }}
+
+### db-migrator
+
+```yaml
+db-migrator:
+ image: acme/bookstore-db-migrator:latest
+ container_name: db-migrator
+ build:
+ context: ../../
+ dockerfile: src/BookStore.DbMigrator/Dockerfile.local
+ environment:
+ - OpenIddict__Applications__BookStore_App__RootUrl=http://localhost:4200 {{ if Tiered == "Yes" }}
+ - OpenIddict__Applications__BookStore_Swagger__RootUrl=https://localhost:44354 {{ end }} {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ networks:
+ - abp-network
+```
+
+This is the database migrator service that migrates the database and seeds the initial data. **OpenIddict data** is one of the most important seeded data for your application to run. On **production environment,** you need to override the root URL of your application (http://localhost:4200) and the swagger-ui client URL (https://localhost:44354) so that the authentication can work properly.
+
+> This service runs in Docker network called `abp-network`, awaits for the database container to start up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+{{ end }}
+
+{{ if UI == "MVC" }}
+
+### bookstore-web
+
+```yaml
+bookstore-web:
+ image: acme/bookstore-web:latest
+ container_name: bookstore-web
+ hostname: bookstore-web
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.Web/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44353
+ - AuthServer__RequireHttpsMetadata=false {{ if Tiered == "Yes" }}
+ - AuthServer__IsContainerizedOnLocalhost=true
+ - AuthServer__Authority=https://localhost:44334/
+ - RemoteServices__Default__BaseUrl=http://bookstore-api
+ - RemoteServices__AbpAccountPublic__BaseUrl=http://bookstore-authserver
+ - AuthServer__MetaAddress=http://bookstore-authserver {{ end }} {{ if Tiered == "No" }}
+ - AuthServer__Authority=http://bookstore-web {{ end }}
+ - App__HealthCheckUrl=http://bookstore-web/health-status {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }} {{ if Tiered == "Yes" }}
+ - Redis__Configuration=redis {{ end }}
+ ports:
+ - "44353:443"
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This is the MVC/Razor Page application docker service is using the `acme/bookstore-web:latest` image that we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44353` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+ {{ if Tiered == "Yes" }}
+
+The MVC/Razor Page is a server-side rendering application that uses the **hybrid flow**. This flow uses **browser** to login/logout process to the OpenID-provider but issues the **access_token from the back-channel** (server-side). To achieve this functionality, the module class has extra `OpenIdConnectOptions` to override some of the events:
+
+```csharp
+if (Convert.ToBoolean(configuration["AuthServer:IsContainerizedOnLocalhost"]))
+{
+ context.Services.Configure("oidc", options =>
+ {
+ options.TokenValidationParameters.ValidIssuers = new[]
+ {
+ configuration["AuthServer:MetaAddress"].EnsureEndsWith('/'),
+ configuration["AuthServer:Authority"].EnsureEndsWith('/')
+ };
+
+ options.MetadataAddress = configuration["AuthServer:MetaAddress"].EnsureEndsWith('/') +
+ ".well-known/openid-configuration";
+
+ var previousOnRedirectToIdentityProvider = options.Events.OnRedirectToIdentityProvider;
+ options.Events.OnRedirectToIdentityProvider = async ctx =>
+ {
+ // Intercept the redirection so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/authorize";
+
+ if (previousOnRedirectToIdentityProvider != null)
+ {
+ await previousOnRedirectToIdentityProvider(ctx);
+ }
+ };
+ var previousOnRedirectToIdentityProviderForSignOut = options.Events.OnRedirectToIdentityProviderForSignOut;
+ options.Events.OnRedirectToIdentityProviderForSignOut = async ctx =>
+ {
+ // Intercept the redirection for signout so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/logout";
+
+ if (previousOnRedirectToIdentityProviderForSignOut != null)
+ {
+ await previousOnRedirectToIdentityProviderForSignOut(ctx);
+ }
+ };
+ });
+}
+```
+
+ {{ end }}
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44353`. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Since we are using an isolated internal docker network. We want to use HTTP in the internal network communication without SSL overhead; therefore it is set to `false` by default.
+
+ {{ if Tiered == "Yes" }}
+
+- `AuthServer__IsContainerizedOnLocalhost` is the configuration to enable the **OpenIdConnectOptions** to provide a different endpoint for the MetaAddress of the OpenID-provider and intercepting the URLS for *authorization* and *logout* endpoints.
+
+- `AuthServer__MetaAddress` is the `.well-known/openid-configuration` endpoint for issuing access_token and internal token validation. It is the containerized `http://bookstore-authserver` by default.
+
+- `AuthServer__Authority` is the issuer URL. `https://localhost:44334/` is the issuer that the application redirects to on `authorization` and `logout` process. It must point to a **real DNS when deploying to production**.
+
+- `RemoteServices__Default__BaseUrl` is the backend; API endpoint application uses the access_token to get the resources. It is the containerized `http://bookstore-api` by default.
+
+- `RemoteServices__AbpAccountPublic__BaseUrl` is the account URL used to get the profile picture of the user. Since account-related information is located in the authserver, it is the containerized `http://bookstore-authserver` by default.
+
+ {{ end }}
+
+ {{ if Tiered == "No" }}
+
+- `App__HealthCheckUrl` is the health check url. Since this request will be done **internally**, it points to the **service name** in the containerized environment `http://bookstore-api/health-status`.
+
+- `AuthServer__Authority` is the issuer URL. `http://bookstore-web` is the containerized issuer. It must point to a **real DNS when deploying to production**.
+
+ {{ end }}
+
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+
+ {{ if Tiered == "Yes" }}
+
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+ {{ end }}
+
+> This service runs in Docker network called `abp-network`, awaits for {{ if Tiered == "Yes" }}the redis service and{{ end }} the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+ {{ if Tiered == "Yes" }}
+
+### bookstore-api
+
+```yaml
+bookstore-api:
+ image: acme/bookstore-api:latest
+ container_name: bookstore-api
+ hostname: bookstore-api
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.HttpApi.Host/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44354
+ - App__HealthCheckUrl=http://bookstore-api/health-status
+ - AuthServer__Authority=http://bookstore-authserver
+ - AuthServer__RequireHttpsMetadata=false {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ - Redis__Configuration=redis
+ ports:
+ - "44354:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ redis:
+ condition: service_healthy
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This service is the **backend** application of the MVC/Razor Page application that uses the `acme/bookstore-api:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44354` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44354`. It must point to a **real DNS when deploying to production**.
+
+- `App__HealthCheckUrl` is the health check url. Since this request will be done **internally**, it points to the **service name** in containerized environment `http://bookstore-api/health-status`
+
+- `AuthServer__Authority` is the issuer URL. `http://bookstore-authserver` is the containerized issuer. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Since we are using an isolated internal docker network. We want to use HTTP in the internal network communication without SSL overhead, therefore, it is set to `false` by default.
+
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+> This service runs in Docker network called `abp-network`, awaits the Redis service and the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+### bookstore-authserver
+
+```yaml
+bookstore-authserver:
+ image: acme/bookstore-authserver:latest
+ container_name: bookstore-authserver
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.AuthServer/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44334
+ - App__CorsOrigins=https://localhost:44353,https://localhost:44354
+ - AuthServer__Authority=http://bookstore-authserver
+ - AuthServer__RequireHttpsMetadata=false {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ - Redis__Configuration=redis
+ ports:
+ - "44334:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ redis:
+ condition: service_healthy
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This is the authentication server application that handles the authentication between applications using the OpenIddict library. It uses the `acme/bookstore-authserver:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44334` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44334`. It must point to a **real DNS when deploying to production**.
+- `App__CorsOrigins` is the override configuration for CORS. It is `https://localhost:44353,https://localhost:44354` by default. It must point to a **real DNS when deploying to production**.
+- `AuthServer__Authority` is the issuer URL. `http://bookstore-authserver` is the endpoint for the authserver by default.
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Docker-compose uses using isolated internal docker network called `abp-network`. It is set to `false` by default.
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+> This service runs in Docker network called `abp-network`, awaits the Redis service and the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+ {{ end }}
+
+### db-migrator
+
+```yaml
+db-migrator:
+ image: acme/bookstore-db-migrator:latest
+ container_name: db-migrator
+ build:
+ context: ../../
+ dockerfile: src/BookStore.DbMigrator/Dockerfile.local
+ environment:
+ - OpenIddict__Applications__BookStore_Web__RootUrl=https://localhost:44353 {{ if Tiered == "Yes" }}
+ - OpenIddict__Applications__BookStore_Swagger__RootUrl=https://localhost:44354 {{ end }} {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ networks:
+ - abp-network
+```
+
+This is the database migrator service that migrates the database and seeds the initial data. **OpenIddict data** is one of the most important seeded data for your application to run. On **production environment,** you need to override the root URL of your application (https://localhost:44353) and the swagger-ui client URL (https://localhost:44354) so that the authentication can work properly.
+
+> This service runs in Docker network called `abp-network`, awaits for the database container to start up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+{{ end }}
+
+{{ if UI == "BlazorServer" }}
+
+### bookstore-blazor
+
+```yaml
+bookstore-blazor:
+ image: acme/bookstore-blazor:latest
+ container_name: bookstore-blazor
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.Blazor/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44314
+ - AuthServer__RequireHttpsMetadata=false {{ if Tiered == "Yes" }}
+ - AuthServer__IsContainerizedOnLocalhost=true
+ - AuthServer__Authority=https://localhost:44334/
+ - AuthServer__MetaAddress=http://bookstore-authserver
+ - RemoteServices__Default__BaseUrl=http://bookstore-api
+ - RemoteServices__AbpAccountPublic__BaseUrl=http://bookstore-authserver {{ end }} {{ if Tiered == "No" }}
+ - AuthServer__Authority=http://bookstore-blazor {{ end }} {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }} {{ if Tiered == "Yes" }}
+ - Redis__Configuration=redis {{ end }}
+ ports:
+ - "44353:443" {{ if Tiered == "Yes" }}
+ depends_on:
+ - bookstore-api {{ end }}
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This is the Blazor Server application Docker service is using the `acme/bookstore-blazor:latest` image that we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44314` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+{{ if Tiered == "Yes" }}
+
+The Blazor Server is a server-side rendering application that uses the **hybrid flow**. This flow uses **browser** to login/logout process to the OpenID-provider but issues the **access_token from the back-channel** (server-side). To achieve this functionality, the module class has extra `OpenIdConnectOptions` to override some of the events:
+
+```csharp
+if (Convert.ToBoolean(configuration["AuthServer:IsContainerizedOnLocalhost"]))
+{
+ context.Services.Configure("oidc", options =>
+ {
+ options.TokenValidationParameters.ValidIssuers = new[]
+ {
+ configuration["AuthServer:MetaAddress"].EnsureEndsWith('/'),
+ configuration["AuthServer:Authority"].EnsureEndsWith('/')
+ };
+
+ options.MetadataAddress = configuration["AuthServer:MetaAddress"].EnsureEndsWith('/') +
+ ".well-known/openid-configuration";
+
+ var previousOnRedirectToIdentityProvider = options.Events.OnRedirectToIdentityProvider;
+ options.Events.OnRedirectToIdentityProvider = async ctx =>
+ {
+ // Intercept the redirection so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/authorize";
+
+ if (previousOnRedirectToIdentityProvider != null)
+ {
+ await previousOnRedirectToIdentityProvider(ctx);
+ }
+ };
+ var previousOnRedirectToIdentityProviderForSignOut = options.Events.OnRedirectToIdentityProviderForSignOut;
+ options.Events.OnRedirectToIdentityProviderForSignOut = async ctx =>
+ {
+ // Intercept the redirection for signout so the browser navigates to the right URL in your host
+ ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"].EnsureEndsWith('/') + "connect/logout";
+
+ if (previousOnRedirectToIdentityProviderForSignOut != null)
+ {
+ await previousOnRedirectToIdentityProviderForSignOut(ctx);
+ }
+ };
+ });
+}
+```
+
+{{ end }}
+
+- `App__SelfUrl` points to the localhost with the port we expose, `https://localhost:44314`. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Since we are using an isolated internal docker network. We want to use HTTP in the internal network communication without SSL overhead, therefore, it is set to `false` by default.
+
+ {{ if Tiered == "Yes" }}
+
+- `AuthServer__IsContainerizedOnLocalhost` is the configuration to enable the **OpenIdConnectOptions** to provide a different endpoint for the MetaAddress of the OpenID-provider and intercept the URLS for *authorization* and *logout* endpoints.
+
+- `AuthServer__MetaAddress` is the `.well-known/openid-configuration` endpoint for issuing the access_token and internal token validation. It is the containerized `http://bookstore-authserver` by default.
+
+- `AuthServer__Authority` is the issuer URL. `https://localhost:44334/` is the issuer that the application redirects to on `authorization` and `logout` process. It must point to a **real DNS when deploying to production**.
+
+- `RemoteServices__Default__BaseUrl` is the backend; API endpoint application uses the access_token to get the resources. It is the containerized `http://bookstore-api` by default.
+
+- `RemoteServices__AbpAccountPublic__BaseUrl` is the account URL used to get the profile picture of the user. Since account-related information is located in the authserver, it is the containerized `http://bookstore-authserver` by default.
+
+ {{ end }}
+
+ {{ if Tiered == "No" }}
+
+- `AuthServer__Authority` is the issuer URL. `http://bookstore-blazor` is the containerized issuer. It must point to a **real DNS when deploying to production**.
+
+ {{ end }}
+
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+
+ {{ if Tiered == "Yes" }}
+
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+ {{ end }}
+
+> This service runs in docker network called `abp-network`. {{ if Tiered == "Yes" }}It awaits the Redis service and the bookstore-api containers for starting up.{{ end }} It also restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+ {{ if Tiered == "Yes" }}
+
+### bookstore-api
+
+```yaml
+bookstore-api:
+ image: acme/bookstore-api:latest
+ container_name: bookstore-api
+ hostname: bookstore-api
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.HttpApi.Host/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44354
+ - App__HealthCheckUrl=http://bookstore-api/health-status
+ - AuthServer__Authority=http://bookstore-authserver
+ - AuthServer__RequireHttpsMetadata=false {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ - Redis__Configuration=redis
+ ports:
+ - "44354:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ redis:
+ condition: service_healthy
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This service is the **backend** application of the MVC/Razor Page application that uses the `acme/bookstore-api:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44354` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44354`. It must point to a **real DNS when deploying to production**.
+
+- `App__HealthCheckUrl` is the health check url. Since this request will be done **internally**, it points to the **service name** in containerized environment `http://bookstore-api/health-status`
+
+- `AuthServer__Authority` is the issuer URL. `http://bookstore-authserver` is the containerized issuer. It must point to a **real DNS when deploying to production**.
+
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Since we are using an isolated internal docker network. We want to use HTTP in the internal network communication without SSL overhead, therefore, it is set to `false` by default.
+
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+> This service runs in Docker network called `abp-network`, awaits the Redis service and the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+### bookstore-authserver
+
+```yaml
+bookstore-authserver:
+ image: acme/bookstore-authserver:latest
+ container_name: bookstore-authserver
+ build:
+ context: ../../
+ dockerfile: src/Acme.BookStore.AuthServer/Dockerfile.local
+ environment:
+ - ASPNETCORE_URLS=https://+:443;http://+:80;
+ - Kestrel__Certificates__Default__Path=/root/certificate/localhost.pfx
+ - Kestrel__Certificates__Default__Password=91f91912-5ab0-49df-8166-23377efaf3cc
+ - App__SelfUrl=https://localhost:44334
+ - AuthServer__Authority=http://bookstore-authserver
+ - AuthServer__RequireHttpsMetadata=false {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ - Redis__Configuration=redis
+ ports:
+ - "44334:443"
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ redis:
+ condition: service_healthy
+ restart: on-failure
+ volumes:
+ - ./certs:/root/certificate
+ networks:
+ - abp-network
+```
+
+This is the authentication server application that handles the authentication between applications using the OpenIddict library. It is using the `acme/bookstore-authserver:latest` image we have built using the `build-images-locally.ps1` script. It runs on `https://localhost:44334` by default by mounting the self-signed certificate we've generated under the `etc/certs` folder.
+
+- `App__SelfUrl` points to the localhost with the port we expose `https://localhost:44334`. It must point to a **real DNS when deploying to production**.
+- `AuthServer__Authority` is the issuer URL. `http://bookstore-authserver` is the endpoint for the authserver by default.
+- `AuthServer__RequireHttpsMetadata` is the option for the **openid-provider** to enforce HTTPS. Docker-compose uses using isolated internal docker network called `abp-network`. It is set to `false` by default.
+- `ConnectionStrings__Default` is the overridden default connection string. It uses {{ if DB == "Mongo" }}the containerized mongodb service {{ end }}{{ if DB == "EF" }}the containerized sql-server with the **sa** user {{ end }} by default.
+- `Redis__Configuration` is the overridden Redis configuration. It uses the containerized **redis** service. If you are not using containerized Redis, update your Redis URL.
+
+> This service runs in Docker network called `abp-network`, awaits the Redis service and the database container for starting up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+ {{ end }}
+
+### db-migrator
+
+```yaml
+db-migrator:
+ image: acme/bookstore-db-migrator:latest
+ container_name: db-migrator
+ build:
+ context: ../../
+ dockerfile: src/BookStore.DbMigrator/Dockerfile.local
+ environment:
+ - OpenIddict__Applications__BookStore_BlazorServerTiered__RootUrl=https://localhost:44314 {{ if Tiered == "Yes" }}
+ - OpenIddict__Applications__BookStore_Swagger__RootUrl=https://localhost:44354 {{ end }} {{ if DB == "EF" }}
+ - ConnectionStrings__Default=Data Source=sql-server;Initial Catalog=BookStore;User Id=sa;Password=myPassw0rd;MultipleActiveResultSets=true;TrustServerCertificate=True; {{ end }} {{ if DB == "Mongo" }}
+ - ConnectionStrings__Default=mongodb://mongodb/BookStore {{ end }}
+ depends_on: {{ if DB == "EF" }}
+ sql-server:
+ condition: service_healthy {{ end }} {{ if DB == "Mongo" }}
+ mongo-db:
+ condition: service_healthy {{ end }}
+ networks:
+ - abp-network
+```
+
+The database migrator service migrates the database and seeds the initial data. **OpenIddict data** is one of the most important seeded data for your application. On **production environment,** you need to override the root URL of your application (https://localhost:44353) and the swagger-ui client URL (https://localhost:44354) so that the authentication can work properly.
+
+> This service runs in Docker network called `abp-network`, awaits for the database container to start up and restarts when it fails. You can customize these orchestration behaviors as you prefer.
+
+{{ end }}
+
+
+
+## What's next?
+
+- [Azure Deployment using Application Service](deployment-azure-application-service.md)
+
+- [IIS Deployment](deployment-iis.md)
diff --git a/docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md b/docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md
new file mode 100644
index 0000000000..79382f1b0a
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md
@@ -0,0 +1,292 @@
+# IIS Deployment
+
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference on top of this document.
+
+## Prerequisites
+
+- An IIS Server that is ready for deployment.
+
+- Install the [hosting bundle](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/hosting-bundle).
+
+- **{{ DB_Value }}** database must be ready to use with your project.
+
+- If you want to publish in a local environment, this guide will use mkcert to create self-signed certificates. Follow the [installation guide](https://github.com/FiloSottile/mkcert#installation) to install mkcert.
+
+{{ if Tiered == "Yes" }}
+
+- A Redis instance prepared for caching.
+
+{{end}}
+
+## Generate an Authentication Certificate
+
+If you're using OpenIddict, you need to generate an authentication certificate. You can execute this command in {{ if Tiered == "Yes" }}AuthServer{{ else if UI == "NG" || UI == "Blazor" }}HttpApi.Host{{ else if UI == "BlazorServer" }}Blazor{{ else }}Web{{ end }} folder.
+
+````bash
+dotnet dev-certs https -v -ep authserver.pfx -p 00000000-0000-0000-0000-000000000000
+````
+
+> `00000000-0000-0000-0000-000000000000` is the password of the certificate, you can change it to any password you want.
+
+## Creating the Publish Files
+
+You can execute this commands in your project root folder.
+
+````bash
+dotnet publish ./src/Volo.Sample.DbMigrator/Volo.Sample.DbMigrator.csproj -c Release -o ./publish/dbmigrator # Replace with your project name
+````
+
+{{ if UI == "NG" }}
+
+````bash
+cd angular && yarn build:prod --output-path ../publish/angular && cd ..
+dotnet publish ./aspnet-core/src/Volo.Sample.HttpApi.Host/Volo.Sample.HttpApi.Host.csproj -c Release -o ./publish/apihost # Replace with your project name
+{{ if Tiered == "Yes" }}
+dotnet publish ./aspnet-core/src/Volo.Sample.AuthServer/Volo.Sample.AuthServer.csproj -c Release -o ./publish/authserver # Replace with your project name
+{{ end }}
+````
+
+{{ else if UI == "Blazor" }}
+
+````bash
+dotnet publish ./src/Volo.Sample.Blazor/Volo.Sample.Blazor.csproj -c Release -o ./publish/blazor # Replace with your project name
+dotnet publish ./src/Volo.Sample.HttpApi.Host/Volo.Sample.HttpApi.Host.csproj -c Release -o ./publish/apihost # Replace with your project name
+{{ if Tiered == "Yes" }}
+dotnet publish ./src/Volo.Sample.AuthServer/Volo.Sample.AuthServer.csproj -c Release -o ./publish/authserver # Replace with your project name
+{{ end }}
+````
+
+{{ else if UI == "BlazorServer" }}
+
+````bash
+dotnet publish ./src/Volo.Sample.Blazor/Volo.Sample.Blazor.csproj -c Release -o ./publish/blazor # Replace with your project name
+{{ if Tiered == "Yes" }}
+dotnet publish ./src/Volo.Sample.HttpApi.Host/Volo.Sample.HttpApi.Host.csproj -c Release -o ./publish/apihost # Replace with your project name
+dotnet publish ./src/Volo.Sample.AuthServer/Volo.Sample.AuthServer.csproj -c Release -o ./publish/authserver # Replace with your project name
+{{ end }}
+````
+
+{{ else }}
+
+````bash
+dotnet publish ./src/Volo.Sample.Web/Volo.Sample.Web.csproj -c Release -o ./publish/web # Replace with your project name
+{{ if Tiered == "Yes" }}
+dotnet publish ./src/Volo.Sample.HttpApi.Host/Volo.Sample.HttpApi.Host.csproj -c Release -o ./publish/apihost # Replace with your project name
+dotnet publish ./src/Volo.Sample.AuthServer/Volo.Sample.AuthServer.csproj -c Release -o ./publish/authserver # Replace with your project name
+{{ end }}
+````
+
+{{ end }}
+
+## Run the DbMigrator With Your Custom Settings
+
+Update the connection string and OpenIddict section with your domain names. Run the DbMigrator app.
+
+> For example, in a tiered MVC project.
+
+````json
+{
+ "ConnectionStrings": {
+ "Default": "Server=volo.sample;Database=Sample;User Id=sa;Password=1q2w3E**;TrustServerCertificate=true"
+ },
+ "Redis": {
+ "Configuration": "volo.sample"
+ },
+ "OpenIddict": {
+ "Applications": {
+ "Sample_Web": {
+ "ClientId": "Sample_Web",
+ "ClientSecret": "1q2w3e*",
+ "RootUrl": "https://web.sample"
+ },
+ "Sample_Swagger": {
+ "ClientId": "Sample_Swagger",
+ "RootUrl": "https://api.sample"
+ }
+ }
+ }
+}
+````
+
+## Preparing for Local Deployment
+
+You can skip this part if you're going to deploy on a server with real domain names.
+
+### Creating a Self-Signed Certificate with mkcert
+
+You can execute this command in your command prompt.
+
+````bash
+cd Desktop # or another path
+mkcert -pkcs12 auth.sample api.sample web.sample # Replace with your domain names
+````
+
+Rename the created file extension to ".pfx"
+
+Import the certificate to IIS
+
+
+
+### Add domain names to hosts file
+
+Add domain names to hosts file(in Windows: `C:\Windows\System32\drivers\etc\hosts`, in Linux and macOS: `/etc/hosts`).
+
+> For example, in a tiered MVC project.
+````json
+127.0.0.1 auth.sample
+127.0.0.1 api.sample
+127.0.0.1 web.sample
+````
+
+## Publish the Application(s) On IIS
+
+### Update the appsettings
+
+Update the appsettings according to your project type and domain names.
+
+> For example, in a tiered MVC project.
+
+````json
+//AuthServer
+{
+ "App": {
+ "SelfUrl": "https://auth.sample",
+ "CorsOrigins": "https://api.sample,https://web.sample",
+ "RedirectAllowedUrls": "https://api.sample,https://web.sample",
+ "DisablePII": "false"
+ },
+ "ConnectionStrings": {
+ "Default": "Server=volo.sample;Database=Sample;User Id=sa;Password=1q2w3E**;TrustServerCertificate=true"
+ },
+ "AuthServer": {
+ "Authority": "https://auth.sample",
+ "RequireHttpsMetadata": "true"
+ },
+ "StringEncryption": {
+ "DefaultPassPhrase": "f9uRkTLdtAZLmlh3"
+ },
+ "Redis": {
+ "Configuration": "volo.sample"
+ }
+}
+//HttpApi.Host
+{
+ "App": {
+ "SelfUrl": "https://api.sample",
+ "CorsOrigins": "https://web.sample",
+ "DisablePII": "false",
+ "HealthCheckUrl": "/health-status"
+ },
+ "ConnectionStrings": {
+ "Default": "Server=volo.sample;Database=Sample;User Id=sa;Password=1q2w3E**;TrustServerCertificate=true"
+ },
+ "Redis": {
+ "Configuration": "volo.sample"
+ },
+ "AuthServer": {
+ "Authority": "https://auth.sample",
+ "RequireHttpsMetadata": "true",
+ "SwaggerClientId": "Sample_Swagger"
+ },
+ "StringEncryption": {
+ "DefaultPassPhrase": "f9uRkTLdtAZLmlh3"
+ }
+}
+//Web
+{
+ "App": {
+ "SelfUrl": "https://web.sample",
+ "DisablePII": "false"
+ },
+ "RemoteServices": {
+ "Default": {
+ "BaseUrl": "https://api.sample/"
+ },
+ "AbpAccountPublic": {
+ "BaseUrl": "https://auth.sample/"
+ }
+ },
+ "Redis": {
+ "Configuration": "volo.sample"
+ },
+ "AuthServer": {
+ "Authority": "https://auth.sample",
+ "RequireHttpsMetadata": "true",
+ "ClientId": "Sample_Web",
+ "ClientSecret": "1q2w3e*"
+ },
+ "StringEncryption": {
+ "DefaultPassPhrase": "f9uRkTLdtAZLmlh3"
+ }
+}
+````
+
+### Copy the .pfx file
+
+You need to copy pfx file from ./src/{{ if Tiered == "Yes" }}AuthServer{{ else if UI == "NG" || UI == "Blazor" }}HttpApi.Host{{ else if UI == "BlazorServer" }}Blazor{{ else }}Web{{ end }} to ./publish/{{ if Tiered == "Yes" }}authserver{{ else if UI == "NG" || UI == "Blazor" }}apihost{{ else if UI == "BlazorServer" }}blazor{{ else }}web{{ end }} folder.
+
+### Publish the Applications(s)
+
+You can add as website from IIS.
+
+> For {{ if Tiered == "Yes" }}authserver{{ else if UI == "NG" || UI == "Blazor" }}apihost{{ else if UI == "BlazorServer" }}blazor{{ else }}web{{ end }} we need to enable load user profile to true from application pool for created web site.
+
+
+
+> For local deployment select the SSL certificate when you add the web site.
+
+
+
+The final result should look like this (depending on your project type).
+
+
+
+We can visit the websites from a browser.
+
+
+
+## How to get stdout-log
+
+If your application is running on IIS and getting errors like `502.5, 500.3x`, you can enable stdout logs to see the error details.
+
+To enable and view stdout logs:
+
+1. Navigate to the site's deployment folder on the hosting system.
+2. If the logs folder isn't present, create the folder. For instructions on how to enable MSBuild to create the logs folder in the deployment automatically, see the [Directory structure topic](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/directory-structure?view=aspnetcore-8.0).
+3. Edit the `web.config` file. Set `stdoutLogEnabled` to `true` and change the `stdoutLogFile` path to point to the logs folder (for example, `.\logs\stdout`). stdout in the path is the log file name prefix. A timestamp, process id, and file extension are added automatically when the log is created. Using stdout as the file name prefix, a typical log file is named `stdout_20180205184032_5412.log`.
+4. Ensure your application pool's identity has write permissions to the logs folder.
+5. Save the updated `web.config` file.
+6. Make a request to the app.
+7. Navigate to the logs folder. Find and open the most recent stdout log.
+
+> The following sample aspNetCore element configures stdout logging at the relative path `.\log\.` Confirm that the AppPool user identity has permission to write to the path provided.
+
+```xml
+
+
+```
+
+Reference:
+
+[IIS log creation and redirection](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/logging-and-diagnostics)
+
+[Troubleshoot ASP.NET Core on Azure App Service and IIS](https://learn.microsoft.com/en-us/aspnet/core/test/troubleshoot-azure-iis)
+
+## What's next?
+
+- [Docker Deployment using Docker Compose](deployment-docker-compose.md)
+
+- [Azure Deployment using Application Service](deployment-azure-application-service.md)
diff --git a/docs/en/solution-templates/layered-web-application/deployment/identityserver-deployment.md b/docs/en/solution-templates/layered-web-application/deployment/identityserver-deployment.md
new file mode 100644
index 0000000000..8cb9438576
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/identityserver-deployment.md
@@ -0,0 +1,111 @@
+# IdentityServer Deployment
+
+IdentityServer configuration may be different based on deployment configurations. Basically, you need update identityserver client related data and update your hosting preferences based on your deployment environment.
+
+## Update Cors Origins
+
+Cors origins configuration for **gateways**, **microservices** swagger authorization and **Angular/Blazor** (web assembly) must be updated for deployment. This can be found under **App** configuration in *appsettings.json*
+
+```json
+"CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,https://localhost:44307,https://localhost:44325,https://localhost:44353,https://localhost:44367,https://localhost:44388,https://localhost:44381,https://localhost:44361",
+```
+
+## Update Redirect Allowed Urls
+
+This configuration must be done if **Angular** or **Blazor** (web assembly) is used as back-office web application. It is found under **App** configuration in appsettings.json
+
+```json
+"RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307"
+```
+
+## Update DbMigrator
+
+`IdentityServerDataSeedContributor` uses **IdentityServer.Clients** section of `appsettings.json` for `ClientId`, `RedirectUri`, `PostLogoutRedirectUri`, `CorsOrigins`.
+
+Update DbMigrator project `appsettings.json` **IdentityServer.Clients.RootUrls** with production values:
+
+
+
+Or, manually add production values to `IdentityServerClientRedirectUris`, `IdentityServerClientPostLogoutRedirectUris`, `IdentityServerClientCorsOrigins` tables in your database.
+
+> If you are using microservice template on-the-fly migration and not using dbmigrator project, update **IdentityService** appsettings.
+
+Eventually, you shouldn't have `localhost` related data.
+
+## Update IdentityServer
+
+You need to update token signing certificate and identityserver midware based on your hosting environment.
+
+### Signing Certificate
+
+Default development environment uses [developer signing certificates option](https://github.com/abpframework/abp/blob/dev/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerBuilderOptions.cs#L29). Using developer signing certificates may cause *IDX10501: Signature validation failed* error on production.
+
+Update **IdentityServerModule** with using real certificate on `IIdentityServerBuilder` pre-configuration.
+
+
+
+You can also [create self-signed certificate](https://docs.abp.io/en/commercial/5.0/startup-templates/microservice/tye-integration#create-developer-certificates) and use it.
+
+> If you are using self signed certificate, do not forget to set the certificate (.pfx file) as `EmbeddedResource` and set `CopyToOutputDirectory`. File needs to exist physically.
+
+### Use HTTPS
+
+Update **IdentityServerModule** to [enfcore https](https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-6.0&tabs=visual-studio). Add `UseHsts` to add hsts headers to clients, add `UseHttpsRedirection` to redirect http requests to https.
+
+
+
+### Behind Load Balancer
+
+To redirect http requests to https from load balancer, update `OnApplicationInitialization` method of the **IdentityServerModule** with the midware below:
+
+```csharp
+app.Use((httpContext, next) =>
+{
+ httpContext.Request.Scheme = "https";
+ return next();
+});
+```
+
+### Kubernetes
+
+A common scenario is running applications in kubernetes environment. While IdentityServer needs to face internet on https, internal requests can be done using http.
+
+
+
+**HttpApi.Host** and **Web** applications authority should be set to http since token validations will done using http request.
+
+
+
+> You can use different appsettings files like *appsettings.production.json* to override these values or directly override environment values from kubernetes.
+
+To isolate internal identityserver requests from external network (internet), append extra header instead of overwriting.
+For ingress, you can use `nginx.ingress.kubernetes.io/configuration-snippet`:
+
+```yaml
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: myidentityserver-ingress
+ annotations:
+ nginx.ingress.kubernetes.io/rewrite-target: /
+ nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
+ nginx.ingress.kubernetes.io/proxy-buffer-size: "32k"
+ nginx.ingress.kubernetes.io/proxy-buffers-number: "8"
+ nginx.ingress.kubernetes.io/configuration-snippet: |
+ more_set_input_headers "from-ingress: true";
+spec:
+```
+
+You need to set the IdentityServer origin based on header. Update `OnApplicationInitialization` method of the **IdentityServerModule** with the midware below:
+
+```csharp
+app.Use(async (ctx, next) =>
+{
+ if (ctx.Request.Headers.ContainsKey("from-ingress"))
+ {
+ ctx.SetIdentityServerOrigin("https://myidentityserver.com");
+ }
+
+ await next();
+});
+```
diff --git a/docs/en/solution-templates/layered-web-application/deployment/index.md b/docs/en/solution-templates/layered-web-application/deployment/index.md
new file mode 100644
index 0000000000..a81823a7f7
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/index.md
@@ -0,0 +1,20 @@
+# Deployment
+
+````json
+//[doc-params]
+{
+ "UI": ["MVC", "Blazor", "BlazorServer", "NG"],
+ "DB": ["EF", "Mongo"],
+ "Tiered": ["Yes", "No"]
+}
+````
+
+> This document assumes that you prefer to use **{{ UI_Value }}** as the UI framework and **{{ DB_Value }}** as the database provider. For other options, please change the preference on top of this document.
+
+This guide explains how to deploy your application in staging and production environments based on your application architecture;
+
+- [Docker Deployment using Docker Compose](deployment-docker-compose.md)
+
+- [Azure Deployment using Application Service](azure-deployment/azure-deployment.md)
+
+- [IIS Deployment](deployment-iis.md)
diff --git a/docs/en/solution-templates/layered-web-application/deployment/openiddict-deployment.md b/docs/en/solution-templates/layered-web-application/deployment/openiddict-deployment.md
new file mode 100644
index 0000000000..65ac72719c
--- /dev/null
+++ b/docs/en/solution-templates/layered-web-application/deployment/openiddict-deployment.md
@@ -0,0 +1,127 @@
+# OpenIddict Deployment
+
+[OpenIddict](https://github.com/openiddict/openiddict-core) is the default OpenId Provider library used by ABP templates through the [OpenIddict Module](https://docs.abp.io/en/abp/latest/Modules/OpenIddict). It is hosted by the **AuthServer** project in the tiered/seperate-authserver application templates. For non-tiered applications, it is hosted by the Web (MVC/Razor), BlazorServer or the **HttpApi.Host** project for Blazor and Angular applications.
+
+## Update Cors Origins
+
+Cors origins configuration for ***gateways***, ***microservices*** swagger authorization, and ***Angular/Blazor*** (web assembly) must be updated for deployment. This can be found under the ***App*** configuration in **appsettings.json**
+
+```json
+"CorsOrigins": "https://*.MyProjectName.com,http://localhost:4200,https://localhost:44307,https://localhost:44325,https://localhost:44353,https://localhost:44367,https://localhost:44388,https://localhost:44381,https://localhost:44361",
+```
+## Update Redirect Allowed URLs
+
+If **Angular** or **Blazor** (Web Assembly) is used as a back-office web application, this configuration must be done. It is found under **App** configuration in `appsettings.json`.
+
+```json
+"RedirectAllowedUrls": "http://localhost:4200,https://localhost:44307"
+```
+## Update DbMigrator
+
+`OpenIddictDataSeedContributor` uses **OpenIddict.Applications** section of `appsettings.json` for `ClientId`, `RedirectUri`, `PostLogoutRedirectUri` and `CorsOrigins`.
+
+Update DbMigrator project `appsettings.json` **OpenIddict.Applications.RootUrls** with production values or override them:
+
+
+
+
+> If you are using microservice template self-migration and not using DbMigrator project, update **IdentityService** appsettings.
+
+Eventually, you shouldn't have any `localhost` related data.
+
+## Update AuthServer
+
+In the development environment, OpenIddict uses a development encryption and signing certificate. In the production environment, this must be disabled. OpenIddict needs a real certificate for signing and encrypting the tokens.
+
+### Signing and Encryption Certificate
+
+The default development environment uses [developer signing certificates option](https://github.com/abpframework/abp/blob/bda231b319b62582dee4f8389494cd4442ac474f/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs#L104-L105). Using developer signing certificates may cause *IDX10501: Signature validation failed* error on production.
+
+Update **AuthServerModule** by using a real certificate on `OpenIddictBuilder` pre-configuration.
+
+
+
+When you create a new application from the application template, ABP CLI automatically generates a new self-signed certificate with the name `openiddict.pfx` and a random password. This file and the password are provided in the `GetSigningCertificate` method.
+
+> Note: If you are receiving errors about not being able to reach the `openiddict.pfx` file on the server, make sure you have the necessary permissions.
+
+The best place to store your certificates will depend on your host:
+
+- For IIS applications, [storing the certificates in the machine store](https://www.sonicwall.com/support/knowledge-base/how-can-i-import-certificates-into-the-ms-windows-local-machine-certificate-store/170504615105398/) is the recommended option.
+- On Azure, certificates can be uploaded and exposed to Azure App Service applications using the special `WEBSITE_LOAD_CERTIFICATES` flag. For more information, visit the [Use a TLS/SSL certificate in your code in Azure App Service](https://docs.microsoft.com/en-us/azure/app-service/configure-ssl-certificate-in-code) document.
+
+Please check [OpenIddict documentation](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios) for more information and using different types of signing/encryption keys.
+
+### Using or Disabling the HTTPS
+
+AuthServer that hosts the OpenIddict openid-provider library uses the SSL/TLS binding of the ASP.NET Core middleware. If you host it on `HTTPS`, the **Issuer** will be hosted on `HTTPS`.
+
+In some deployment scenarios, you may come across an error:
+
+```json
+error: invalid_request
+error_description: This server only accepts HTTPS requests.
+error_uri: https//documnentation.openiddict.com/errors/ID2083
+```
+
+You can easily disable the HTTPS requirement from the **appsettings.json**:
+```json
+"AuthServer": {
+ "Authority": "https://localhost:44369",
+ "RequireHttpsMetadata": "false"
+ },
+```
+
+This configuration can be found under the `ConfigureServices` method of the AuthServer project:
+```csharp
+if (!Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]))
+{
+ Configure(options =>
+ {
+ options.DisableTransportSecurityRequirement = true;
+ });
+}
+```
+
+### Behind Load Balancer
+
+You may need to forward the headers if you are using [Nginx](https://www.nginx.com/) or [Kubernetes Nginx Ingress](https://github.com/kubernetes/ingress-nginx).
+Configure the options in the **ConfigureServices** method of `AuthServerModule`:
+
+```csharp
+Configure(options =>
+{
+ options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
+});
+```
+And use the middleware in the **OnApplicationInitialization** method of `AuthServerModule`:
+```csharp
+if (env.IsDevelopment())
+{
+ app.UseDeveloperExceptionPage();
+}
+
+app.UseForwardedHeaders();
+...
+```
+
+Sometimes, including forwarded headers in requests proxied to the application may be impossible.
+If the proxy enforces that all public external requests are HTTPS, the scheme can be manually set before using any middleware.
+Configure it under the **OnApplicationInitialization** method of `AuthServerModule`:
+
+```csharp
+app.Use((httpContext, next) =>
+{
+ httpContext.Request.Scheme = "https";
+ return next();
+});
+```
+
+# FAQ
+
+- I see `Server Error 502!`
+ - Check your application logs under the *Logs* folder. A misconfiguration can prevent your application from starting up, and the easiest way is to pinpoint the problem by checking the logs.
+- `System.IO.FileNotFoundException: Signing Certificate couldn't found!:`
+ - Ensure you have the **.pfx** file in the related location. The **.pfx** file should be marked as an embedded resource, and it should be in the publish directory when you publish your application.
+- I can't see the login page! It shows an `HTTP 400` error.
+ - This is related to the generated URL from the application that tries to authenticate against the AuthServer. Check the AuthServer logs and make sure you have **valid redirect_uri** seeded from the *OpenIddictDataSeedContributor* and the application that redirects to AuthServer has the same configuration.
diff --git a/docs/en/solution-templates/microservice/how-to-use-with-abp-suite.md b/docs/en/solution-templates/microservice/how-to-use-with-abp-suite.md
index d5ffbf1b2c..8549032089 100644
--- a/docs/en/solution-templates/microservice/how-to-use-with-abp-suite.md
+++ b/docs/en/solution-templates/microservice/how-to-use-with-abp-suite.md
@@ -6,14 +6,54 @@ You can open ABP Suite from ABP Studio by using the **ABP Suite** -> **Open** to

-It opens the ABP Suite in a built-in browser window. You can also access the suite by visiting `http://localhost:3000` through your browser. From there, you can visually design your solution and generate code. In this example, we create a **Product** entity.
+It opens the ABP Suite in a built-in browser window. You can also access the suite by visiting `http://localhost:3000` through your browser. From there, you can visually design your solution and generate code.
+
+In the following example, we've defined the entity name as **Product** and provide other metadata for the related entity:

After clicking **Save and generate** for the entity in ABP Suite, use **Run** -> **Build & Restart** in the [Solution Runner](../../studio/running-applications.md#start) to apply the changes.
-To confirm, visit the Swagger UI to verify that the necessary API endpoints and services have been created.
+> ABP Suite requires you to stop all running instances in the related solution/project to be able to generate codes properly. Otherwise, it might not work effectively.
+
+Then, to confirm, you can visit the Swagger UI to verify that the necessary API endpoints and services have been created.

-> Currently, you can't generate UI code with ABP Suite for microservice solutions. This feature will be added in future releases.
\ No newline at end of file
+If you selected the *Create user interface* option for the entity, the related UI components (pages, styles, scripts etc.) will also be created. To be able to see the related pages in your host application/UI you should apply the following steps:
+
+1. Generate [*client-proxies*](../../framework/api-development/static-csharp-clients.md) with the following command:
+
+```bash
+abp generate-proxy -t csharp -url http://localhost:{your-service-port}/ -m {remote-service-name} --without-contracts
+```
+
+* You should run this command in the directory of your host application, and your microservices should be up and running.
+* The command will generate proxy classes for your microservice in the host application, which you can see under the **ClientProxies** folder.
+
+> **Note:** After each entity generation/modification in your services, then you should run this command to update client-proxies.
+
+2. Configure the application for the static client proxy:
+
+```csharp
+public class MyClientAppModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ // Prepare for static client proxy generation
+ context.Services.AddStaticHttpClientProxies(
+ typeof(MyServiceApplicationContractsModule).Assembly
+ );
+
+ // Include the generated app-generate-proxy.json in the virtual file system
+ Configure(options =>
+ {
+ options.FileSets.AddEmbedded();
+ });
+ }
+}
+```
+
+After you apply these steps, you're ready to go to run your microservices and see the generated CRUD pages:
+
+
diff --git a/docs/en/solution-templates/microservice/images/abp-suite-products-pages.png b/docs/en/solution-templates/microservice/images/abp-suite-products-pages.png
new file mode 100644
index 0000000000..01bee7ed5e
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/abp-suite-products-pages.png differ
diff --git a/docs/en/studio/images/solution-explorer/abp-solution.png b/docs/en/studio/images/solution-explorer/abp-solution.png
index b15e7f46f0..347ecdfbb4 100644
Binary files a/docs/en/studio/images/solution-explorer/abp-solution.png and b/docs/en/studio/images/solution-explorer/abp-solution.png differ
diff --git a/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-additional-options.png b/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-additional-options.png
new file mode 100644
index 0000000000..3d99055917
Binary files /dev/null and b/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-additional-options.png differ
diff --git a/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-enable-integration.png b/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-enable-integration.png
index a1aa31887f..86896e8ac4 100644
Binary files a/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-enable-integration.png and b/docs/en/studio/images/solution-explorer/create-new-microservice-nolayers-enable-integration.png differ
diff --git a/docs/en/studio/images/solution-explorer/create-new-module.png b/docs/en/studio/images/solution-explorer/create-new-module.png
index 320b9d9bb5..a489679877 100644
Binary files a/docs/en/studio/images/solution-explorer/create-new-module.png and b/docs/en/studio/images/solution-explorer/create-new-module.png differ
diff --git a/docs/en/studio/images/solution-explorer/folder-context-menu.png b/docs/en/studio/images/solution-explorer/folder-context-menu.png
index 3d98774bdc..8e53fd32ef 100644
Binary files a/docs/en/studio/images/solution-explorer/folder-context-menu.png and b/docs/en/studio/images/solution-explorer/folder-context-menu.png differ
diff --git a/docs/en/studio/images/solution-explorer/imported-module.png b/docs/en/studio/images/solution-explorer/imported-module.png
index a8f3054fe7..94c703b6ab 100644
Binary files a/docs/en/studio/images/solution-explorer/imported-module.png and b/docs/en/studio/images/solution-explorer/imported-module.png differ
diff --git a/docs/en/studio/images/solution-explorer/imports-context-menu.png b/docs/en/studio/images/solution-explorer/imports-context-menu.png
index 24ec244c4c..23a189d920 100644
Binary files a/docs/en/studio/images/solution-explorer/imports-context-menu.png and b/docs/en/studio/images/solution-explorer/imports-context-menu.png differ
diff --git a/docs/en/studio/images/solution-explorer/module-context-menu.png b/docs/en/studio/images/solution-explorer/module-context-menu.png
index 5f05f8026c..e58dc89b36 100644
Binary files a/docs/en/studio/images/solution-explorer/module-context-menu.png and b/docs/en/studio/images/solution-explorer/module-context-menu.png differ
diff --git a/docs/en/studio/images/solution-explorer/package-context-menu.png b/docs/en/studio/images/solution-explorer/package-context-menu.png
index 93279e37ef..0272b8e477 100644
Binary files a/docs/en/studio/images/solution-explorer/package-context-menu.png and b/docs/en/studio/images/solution-explorer/package-context-menu.png differ
diff --git a/docs/en/studio/release-notes.md b/docs/en/studio/release-notes.md
index 56a96c851f..21ca21454f 100644
--- a/docs/en/studio/release-notes.md
+++ b/docs/en/studio/release-notes.md
@@ -2,6 +2,34 @@
This document contains **brief release notes** for each ABP Studio release. Release notes only include **major features** and **visible enhancements**. Therefore, they don't include all the development done in the related version.
+## 0.9.4 (2024-10-31)
+
+* Made the `TopMenuLayout` as the default layout type for microservice public website
+* Fixed application crashing problem when the ABP Suite is opened
+
+## 0.9.3 (2024-10-30)
+
+* Added the **standard module template**
+* Made enhancements on the pre-integrated browser
+* Fixed Blazor WebAssembly UI being not run on kubernetes problem
+* Added a database migration after a module added to the solution
+
+## 0.9.2 (2024-10-22)
+
+* Added a status bar to the pre-integrated browser for showing errors
+* Added **Sample CRUD Page** option to pro templates
+* Added test projects optionally for all templates
+* Added **AutoMapper** configurations to microservice host projects
+* Disabled **transaction** for *MongoDB* & *SQLite* by default.
+
+## 0.9.1 (2024-10-10)
+
+* Fixed the ABP Studio CLI's Bundle Command
+* Fixed the Public Web project for the Microservice Template
+* Removed the React Native for the Community Edition (open-source)
+* Added multiple gateway and UI selection option during microservice creation
+* Added External Logins item to user menu for the Blazor templates
+
## 0.8.4 (2024-10-07)
* Fixed the ABP Suite does not open problem for macOS
diff --git a/docs/en/studio/solution-explorer.md b/docs/en/studio/solution-explorer.md
index 8aa0ea4404..df0ca04a4f 100644
--- a/docs/en/studio/solution-explorer.md
+++ b/docs/en/studio/solution-explorer.md
@@ -123,7 +123,7 @@ A [module](./concepts.md#module) is a sub-solution that can contains zero, one o
### Adding a New Empty Module
-Create a new module by clicking the *Add* -> *New Module* -> *Empty Module* button at the root of the solution or in the solution folder context menu. The *Microservice* solution template also includes *Microservice*, *Gateway*, and *Web* modules. Other solution templates, such as *Application (Layered)*, can only create *Empty*, and *DDD* modules.
+Create a new module by clicking the *Add* -> *New Module* -> *Empty Module* button at the root of the solution or in the solution folder context menu. The *Microservice* solution template also includes *Microservice*, *Gateway*, and *Web* modules. Other solution templates, such as *Application (Layered)*, can only create *Empty*, *DDD* and *Standard* modules.

@@ -149,6 +149,10 @@ When you create a microservice, you must edit some [configurations](../solution-

+You can uncheck the *Include Tests* option if you don't want to include test projects in your microservice module. Click the *Create* button to add the microservice module to the solution.
+
+
+
After creating the *Microservice (service-nolayers)* module, it will be added to the solution, and you should see the following structure in the solution explorer.

diff --git a/docs/en/studio/version-compatibility.md b/docs/en/studio/version-compatibility.md
index 3fe532e018..79797852c2 100644
--- a/docs/en/studio/version-compatibility.md
+++ b/docs/en/studio/version-compatibility.md
@@ -4,7 +4,8 @@ This document provides an overview of the compatibility between various versions
| **ABP Studio Version** | **ABP Version** |
|------------------------|---------------------------|
-| 0.8.4 | 8.3.1 |
+| 0.9.2 to 0.9.4 | 8.3.2 |
+| 0.8.4 - 0.9.1 | 8.3.1 |
| 0.8.1 to 0.8.3 | 8.3.0 |
| 0.8.0 | 8.2.3 |
| 0.7.8 - 0.7.9 | 8.2.2 |
diff --git a/docs/en/suite/generating-crud-page.md b/docs/en/suite/generating-crud-page.md
index 8d98bb7df9..e1461e3d0a 100644
--- a/docs/en/suite/generating-crud-page.md
+++ b/docs/en/suite/generating-crud-page.md
@@ -115,7 +115,7 @@ To create a new entity, make sure the *-New entity-* is selected in the **Entity
## Properties
-##### Define a property
+### Define a property
A property is a field in the entity which refers a column in the relational database table or a `JSON` field in `NoSQL` database collection. In the properties section, you can manage the properties your entity. To add a new property, click the "Add Property" button on the top-right of the page.
@@ -306,7 +306,7 @@ abp suite generate --entity D:\Projects\BookStore\.suite\entities\Book.json --so
In this example, `Book.json` was previously created via ABP Suite.
-##### Parameters
+### Parameters
* `--entity` or `-e`: Path of the entity's JSON file.
* `--solution` or `-s`: Path of the target solution file (***.sln**).
diff --git a/docs/en/suite/generating-entities-from-an-existing-database-table.md b/docs/en/suite/generating-entities-from-an-existing-database-table.md
index e877adf425..481bd32ff5 100644
--- a/docs/en/suite/generating-entities-from-an-existing-database-table.md
+++ b/docs/en/suite/generating-entities-from-an-existing-database-table.md
@@ -16,13 +16,13 @@
If you have an existing database table, you can generate the entities using ABP Suite and create a CRUD page based on those entities, let's get started.
-# Create/open your project
+## Create/open your project

Either create a new project or open an existing project that's based on an app or module template.
-# Generate the Entities
+## Generate the Entities
After opening the project in ABP Suite, scroll down to the bottom and click the **Load Entity From Database** button:
@@ -41,6 +41,6 @@ After that, make sure the primary key type is selected, then click **Save and ge
The following GIF is a summary of the previous steps: 
-# Run the Project!
+## Run the Project!
After that, run the project and watch the magic! An easy CRUD app using the entities from an existing database table!
diff --git a/docs/en/tutorials/book-store/part-09.md b/docs/en/tutorials/book-store/part-09.md
index c42dd22d8a..d1c446bc3f 100644
--- a/docs/en/tutorials/book-store/part-09.md
+++ b/docs/en/tutorials/book-store/part-09.md
@@ -677,6 +677,10 @@ export class AuthorComponent implements OnInit {
this.selectedAuthor.birthDate ? new Date(this.selectedAuthor.birthDate) : null,
Validators.required,
],
+ shortBio: [
+ this.selectedAuthor.shortBio ? this.selectedAuthor.shortBio : null,
+ Validators.required,
+ ],
});
}
@@ -768,6 +772,7 @@ Open the `/src/app/author/author.component.html` and replace the content as belo
{%{{{ row.birthDate | date }}}%}
+
@@ -795,6 +800,10 @@ Open the `/src/app/author/author.component.html` and replace the content as belo
(click)="datepicker.toggle()"
/>
+
+ *
+
+
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-ddd-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-ddd-module.png
index ed11a95f57..e4ef112a1c 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-ddd-module.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-ddd-module.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module-dialog.png
deleted file mode 100644
index 882323b4b6..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module-dialog.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module.png
deleted file mode 100644
index 53d453cd37..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-empty-module.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package-class-library.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package-class-library.png
deleted file mode 100644
index 247ee96ca0..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package-class-library.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package-mvc-ui.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package-mvc-ui.png
deleted file mode 100644
index 41214c0ddc..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package-mvc-ui.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package.png
deleted file mode 100644
index 7e28d708bf..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-package.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-additional-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-additional-dialog.png
new file mode 100644
index 0000000000..435e608626
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-additional-dialog.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-db-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-db-dialog.png
new file mode 100644
index 0000000000..19eae2a53c
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-db-dialog.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-dialog.png
new file mode 100644
index 0000000000..112491fc8a
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-dialog.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-ui-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-ui-dialog.png
new file mode 100644
index 0000000000..6e0152dfd7
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module-ui-dialog.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module.png
new file mode 100644
index 0000000000..0a2459296e
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-add-new-standard-module.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-nuget-package-reference.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-nuget-package-reference.png
deleted file mode 100644
index c52df6d559..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-nuget-package-reference.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-2.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-2.png
deleted file mode 100644
index 308d32c6ad..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-2.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-3.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-3.png
deleted file mode 100644
index dc51826734..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-3.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png
index b29850cce6..c9c3a36596 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-6.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-6.png
deleted file mode 100644
index 954ea41060..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-6.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-7.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-7.png
deleted file mode 100644
index 3dea701062..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-7.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-2.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-2.png
deleted file mode 100644
index 09682f0b6f..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-2.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-3.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-3.png
index 2d9d1e504b..91f0e9f948 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-3.png and b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-3.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-5.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-5.png
deleted file mode 100644
index ad78c4eee7..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-5.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-6.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-6.png
deleted file mode 100644
index bd1c968b03..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-6.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog.png
deleted file mode 100644
index 34342dad2e..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference.png b/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference.png
deleted file mode 100644
index a6870e4c0e..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-contracts-package.png b/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-contracts-package.png
deleted file mode 100644
index f451a550d8..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-contracts-package.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-domain-package.png b/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-domain-package.png
deleted file mode 100644
index ed03c6b3bb..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-added-ddd-domain-package.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-orders-with-product-name.png b/docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-orders-with-product-name.png
index ecbd5a7fbc..50cfc86eb4 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-orders-with-product-name.png and b/docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-orders-with-product-name.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item.png b/docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item.png
index cb3af02592..3e4d83fee1 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item.png and b/docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-create-new-module-dialog-step-additional-options.png b/docs/en/tutorials/modular-crm/images/abp-studio-create-new-module-dialog-step-additional-options.png
new file mode 100644
index 0000000000..60031dd61b
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-create-new-module-dialog-step-additional-options.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-create-new-module-dialog-step-db.png b/docs/en/tutorials/modular-crm/images/abp-studio-create-new-module-dialog-step-db.png
index 714eeac483..f173c08cff 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-create-new-module-dialog-step-db.png and b/docs/en/tutorials/modular-crm/images/abp-studio-create-new-module-dialog-step-db.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering.png b/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering.png
index 21af63a949..7ecb6b6262 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering.png and b/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog.png b/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog.png
index 17eb6d0ecc..5ea22e8e3e 100644
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog.png and b/docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-standard-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-standard-module.png
new file mode 100644
index 0000000000..02cec6ad68
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-standard-module.png differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-two-modules.png b/docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-two-modules.png
deleted file mode 100644
index 3e04717081..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-two-modules.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-new-package-under-the-module.png b/docs/en/tutorials/modular-crm/images/abp-studio-new-package-under-the-module.png
deleted file mode 100644
index 8ac9bb987e..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-new-package-under-the-module.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-project-reference-example.png b/docs/en/tutorials/modular-crm/images/abp-studio-project-reference-example.png
deleted file mode 100644
index 7694d8013b..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-project-reference-example.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-orders-page.png b/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-orders-page.png
deleted file mode 100644
index fbd419d145..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-orders-page.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/file-system-odering-module-initial-folder.png b/docs/en/tutorials/modular-crm/images/file-system-odering-module-initial-folder.png
deleted file mode 100644
index eb10f3e26e..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/file-system-odering-module-initial-folder.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/file-system-ordering-module-initial-folder.png b/docs/en/tutorials/modular-crm/images/file-system-ordering-module-initial-folder.png
new file mode 100644
index 0000000000..467236d60a
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/file-system-ordering-module-initial-folder.png differ
diff --git a/docs/en/tutorials/modular-crm/images/ordering-module-visual-studio.png b/docs/en/tutorials/modular-crm/images/ordering-module-visual-studio.png
new file mode 100644
index 0000000000..3a39951a6b
Binary files /dev/null and b/docs/en/tutorials/modular-crm/images/ordering-module-visual-studio.png differ
diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-order-entity.png b/docs/en/tutorials/modular-crm/images/visual-studio-order-entity.png
index 33ea2b9d24..112ee3d7d3 100644
Binary files a/docs/en/tutorials/modular-crm/images/visual-studio-order-entity.png and b/docs/en/tutorials/modular-crm/images/visual-studio-order-entity.png differ
diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-order-event.png b/docs/en/tutorials/modular-crm/images/visual-studio-order-event.png
index 21377ac3ee..5008c9b45c 100644
Binary files a/docs/en/tutorials/modular-crm/images/visual-studio-order-event.png and b/docs/en/tutorials/modular-crm/images/visual-studio-order-event.png differ
diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-ordering-module-initial.png b/docs/en/tutorials/modular-crm/images/visual-studio-ordering-module-initial.png
deleted file mode 100644
index 0b238370b1..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/visual-studio-ordering-module-initial.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-ordering-ui-package-dependency.png b/docs/en/tutorials/modular-crm/images/visual-studio-ordering-ui-package-dependency.png
deleted file mode 100644
index 4fe2d6f935..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/visual-studio-ordering-ui-package-dependency.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-pages-folder.png b/docs/en/tutorials/modular-crm/images/visual-studio-pages-folder.png
deleted file mode 100644
index f1b5742ce9..0000000000
Binary files a/docs/en/tutorials/modular-crm/images/visual-studio-pages-folder.png and /dev/null differ
diff --git a/docs/en/tutorials/modular-crm/part-02.md b/docs/en/tutorials/modular-crm/part-02.md
index de8fd69f92..6ebc22f20c 100644
--- a/docs/en/tutorials/modular-crm/part-02.md
+++ b/docs/en/tutorials/modular-crm/part-02.md
@@ -69,7 +69,11 @@ The next step is to select the database provider (or providers) you want to supp

-Since our main application is using Entity Framework Core and we will use the `ModularCrm.Products` module only for that main application, we can select the *Entity Framework Core* option and click the *Create* button.
+Since our main application is using Entity Framework Core and we will use the `ModularCrm.Products` module only for that main application, we can select the *Entity Framework Core* option and click the *Next* button.
+
+
+
+Lastly, you can uncheck the *Include Tests* option if you don't want to include test projects in your module. Click the *Create* button to create the new module.
### Exploring the New Module
diff --git a/docs/en/tutorials/modular-crm/part-04.md b/docs/en/tutorials/modular-crm/part-04.md
index ea7e66cc8b..1674ced6c6 100644
--- a/docs/en/tutorials/modular-crm/part-04.md
+++ b/docs/en/tutorials/modular-crm/part-04.md
@@ -16,76 +16,41 @@
In this part, you will build a new module for placing orders and install it in the main CRM application.
-## Creating an Empty Module
+## Creating a Standard Module
-In this part, we have used the *DDD Module* template for the Product module and will use the *Empty Module* template for the Ordering module.
+In this part, we have used the *DDD Module* template for the Product module and will use the *Standard Module* template for the Ordering module.
-Right-click the `modules` folder on the *Solution Explorer* panel, and select the *Add* -> *New Module* -> *Empty Module* command:
+Right-click the `modules` folder on the *Solution Explorer* panel, and select the *Add* -> *New Module* -> *Standard Module* command:
-
+
That command opens a dialog to define the properties of the new module:
-
+
-Set `ModularCrm.Ordering` as the *Module name*, leave the *Output folder* as is and click the *Create* button. It will create the new `ModularCrm.Ordering` module under the `modules` folder in the *Solution Explorer*:
+Set `ModularCrm.Ordering` as the *Module name*, leave the *Output folder* as is and click the *Next* button.
-
+
-Since we've created an empty module, it is really empty. If you open the `modules/modularcrm.ordering` in your file system, you can see the initial files:
+Similar to DDD module creation, you can choose the type of UI you want to support in your module or select *No UI* if you don't need a user interface. In this example, we'll select the *MVC* option and click *Next*. One difference is that, for a standard module, you can only choose one UI type.
-
+
-## Creating the Module Packages
+The same limitation applies to the database selection. You can only choose one database provider for a standard module. Select the *Entity Framework Core* option and click *Next*.
-In this section, we will create packages under the Ordering module. The Products module was well layered based on Domain Driven Design principles. This time, we will keep things very simple and will only create two packages for the Ordering module:
+
-* `ModularCrm.Ordering`: Contains all the module code without any layering. It will contain entities, database access code, services, controllers, UI pages and whatever we need to implement the *Ordering* module.
-* `ModularCrm.Ordering.Contracts`: Contains the services and objects we want to share with other modules. `ModularCrm.Ordering` uses (and implements) this package.
+You can uncheck the *Include Tests* option to keep the module simple. Click the *Create* button to create the module.
-> If your modules are relatively small and easy to maintain, they will only be used by your main application, and you don't care about layering, then you can create such simple module structures.
+
-We will create and configure everything from scratch. You have already learned the easy way in the previous parts, where we created the Products module. It is time to deepen your understanding of the details and learn how ABP Studio allows you to set up custom structures. Let's begin.
+Since we've created a standard module, it doesn't have multiple layers like the DDD module. If you open the `modules/modularcrm.ordering` in your file system, you can see the initial files:
-### Creating the `ModularCrm.Ordering.Contracts` Package
+
-Right-click the `ModularCrm.Ordering` module on the *Solution Explorer* and select the *Add* -> *Package* -> *New Package* command as shown in the following figure:
+Because only a single UI package can be chosen, the UI type doesn’t matter. This is why the package name is changed to *ModularCrm.Ordering.UI*. Additionally, there are no *Domain*, *EntityFrameworkCore*, or *Http* layers like in the DDD module. We're going to use the `ModularCrm.Ordering` package for the domain business logic. You can open `ModularCrm.Ordering.sln` in your favorite IDE (e.g. Visual Studio):
-
-
-That command opens a new dialog to create a new package:
-
-
-
-With that dialog, you can build your module or application layer by layer. There are templates for any package. However, here we will go with the simplest one: *ABP Class Library*. ABP Class Library is an empty C# class library with the [core ABP package](https://www.nuget.org/packages/Volo.Abp.Core) dependency and a [module class](../../framework/architecture/modularity/basics.md).
-
-Type `ModularCrm.Ordering.Contracts` as the *Package name* and click the *Create* button. It will add the package under the `ModularCrm.Ordering` module:
-
-
-
-### Creating the `ModularCrm.Ordering` Package
-
-Right-click the `ModularCrm.Ordering` module on the *Solution Explorer* again and select the *Add* -> *Package* -> *New Package* command to create a second package:
-
-
-
-This time, we select the MVC UI template and set the Package name to `ModularCrm.Ordering`. Then, click the Create button to add the new package.
-
-### Add Package Reference
-
-After the package has been added, right-click the `ModularCrm.Ordering` package and select the *Add Package Reference* command:
-
-
-
-That command opens a dialog to select the package:
-
-
-
-In that dialog, you can add package references from various sources. Here, we will add a reference for the package in the current module. So, select the `ModularCrm.Ordering.Contracts` package in the *This module* tab and click the *OK* button. You can see the package reference under the *Projects* dependencies on the *Solution Explorer* panel:
-
-
-
-The initial module creation has been completed. Now, we have a new module with two packages. However, it is not related to other modules and applications in the solution yet.
+
## Installing into the Main Application
@@ -105,8 +70,8 @@ Select the `ModularCrm.Ordering` module and check the *Install this module* opti

-Select the `ModuleCrm.Ordering` package in the left area and the `ModularCrm.Domain` package in the middle area, as shown in the preceding figure, and click the *OK* button.
+Select the `ModuleCrm.Ordering` package from the left area and the `ModularCrm.Domain` package from the middle area. Then, select the `ModularCrm.Ordering.UI` package from the left area and the `ModularCrm.Web` package from the middle area, as shown in the preceding figure. Finally, click *OK*.
> Since the Ordering module is not layered, we didn't install its packages to the layers of our main application. We are installing it only to `ModularCrm.Domain`. In this way, we can use the Ordering module from any layer of our application since `ModularCrm.Domain` is one of the core packages of our application. If you build your modules as non-layered and you don't have much code in the main application's .NET solution, you can also consider creating a non-layered main application that composes these modules.
-In this part of the tutorial, we've created an empty module and added packages. This allows you to create modules or applications with a custom structure. In the next part, we will add functionality to the Ordering module.
+In this part of the tutorial, we've created a standard module. This allows you to create modules or applications with a different structure. In the next part, we will add functionality to the Ordering module.
diff --git a/docs/en/tutorials/modular-crm/part-05.md b/docs/en/tutorials/modular-crm/part-05.md
index 69a9223882..91e8b2cb37 100644
--- a/docs/en/tutorials/modular-crm/part-05.md
+++ b/docs/en/tutorials/modular-crm/part-05.md
@@ -14,7 +14,7 @@
}
````
-In the previous part, we created a custom Ordering module and installed it into the main application. However, the Ordering module has no functionality now. In this part, we will create an `Order` entity and add functionality to create and list the orders.
+In the previous part, we created Ordering module and installed it into the main application. However, the Ordering module has no functionality now. In this part, we will create an `Order` entity and add functionality to create and list the orders.
## Creating an `Order` Entity
@@ -22,37 +22,9 @@ Open the `ModularCrm.Ordering` .NET solution in your IDE.
> Tip: You can open the folder of a module's .NET solution by right-clicking the related module in ABP Studio and selecting the *Open with* -> *Explorer* command.
-The following figure shows the `ModularCrm.Ordering` module in the *Solution Explorer* panel of Visual Studio:
-
-
-
-### Adding `Volo.Abp.Ddd.Domain` Package Reference
-
-As you see in the preceding figure, the solution structure is very minimal. It also has a minimal ABP dependency. ABP Framework has [hundreds of NuGet packages](https://abp.io/packages), but the `ModularCrm.Ordering` project only has the [`Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared`](https://abp.io/package-detail/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared) package reference:
-
-
-
-We will create an [entity class](../../framework/architecture/domain-driven-design/entities.md). ABP defines base entity classes and other related infrastructure in the [`Volo.Abp.Ddd.Domain`](https://abp.io/package-detail/Volo.Abp.Ddd.Domain) package. So, we need to add a reference to that NuGet package.
-
-You can add that package and manually arrange the [module](../../framework/architecture/modularity/basics.md) class dependency. However, we will use ABP Studio as a more practical option.
-
-Return to ABP Studio, right-click the `ModularCrm.Ordering` package in the *Solution Explorer* and select the *Add Package Reference* command:
-
-
-
-That command opens a dialog to add a new package reference:
-
-
-
-Select the *NuGet* tab, type `Volo.Abp.Ddd.Domain` as the *Package name* and write the version of the package you want to install. Please be sure that you are installing the same version as the other ABP packages you are already using. ABP Studio will provide an easier way to select the package and its version in future ABP versions.
-
-Click the *OK* button. Now you can check the *Packages* under the `ModularCrm.Ordering` module *Dependencies* to see the `Volo.Abp.Ddd.Domain` package is installed:
-
-
-
### Adding an `Order` Class
-Now, you can return your IDE and add an `Order` class to the `ModularCrm.Ordering` project (open an `Entities` folder and place the `Order.cs` into that folder):
+Create an `Order` class to the `ModularCrm.Ordering` project (open an `Entities` folder and place the `Order.cs` into that folder):
````csharp
using System;
@@ -77,7 +49,7 @@ We allow users to place only a single product within an order. The `Order` entit
We used an `OrderState` enumeration that has not yet been defined. Open an `Enums` folder in the `ModularCrm.Ordering.Contracts` project and create an `OrderState.cs` file inside it:
````csharp
-namespace ModularCrm.Ordering.Contracts.Enums;
+namespace ModularCrm.Ordering.Enums;
public enum OrderState : byte
{
@@ -93,48 +65,64 @@ The final structure of the Ordering module should be similar to the following fi
## Configuring the Database Mapping
-The `Order` entity has been created. Now, we need to configure the database mapping for that entity. We will first install the Entity Framework Core package, define the database table mapping, create a database migration and update the database.
-
-### Installing the Entity Framework Core Package
+The `Order` entity has been created. Now, we need to configure the database mapping for that entity. We will first define the database table mapping, create a database migration and update the database.
-> In this section, we will install the [`Volo.Abp.EntityFrameworkCore`](https://abp.io/package-detail/Volo.Abp.EntityFrameworkCore) package to the Ordering module. That package is DBMS-independent and leaves the DBMS selection to the final application. If you want, you can install a DBMS-specific package instead. For example, you can install the [`Volo.Abp.EntityFrameworkCore.SqlServer`](https://abp.io/package-detail/Volo.Abp.EntityFrameworkCore.SqlServer) package if you are using SQL Server and want to make SQL Server specific configuration for your module's database.
-> You can search for other packages on the [abp.io/packages](https://abp.io/packages) page.
-
-Stop the web application if it is still running. Return to ABP Studio, right-click the `ModularCrm.Ordering` package on the *Solution Explorer* panel and select the *Add Package Reference* command:
-
-
+### Defining the Database Mappings
-Select the *NuGet* tab, type `Volo.Abp.EntityFrameworkCore` as the *Package name* and specify a *Version* that is compatible with the ABP version used by your solution:
+Entity Framework Core requires defining a `DbContext` class as the main object for the database mapping. We want to use the main application's `DbContext` object. That way, we can control the database migrations at a single point, ensure database transactions on multi-module operations, and establish relations between database tables of different modules. However, the Ordering module can not use the main application's `DbContext` object because it doesn't depend on the main application, and we don't want to establish such a dependency.
-
+As a solution, we will use `DbContext` interface in the Ordering module which is then implemented by the main module's `DbContext`.
-Once you click the *OK* button, the NuGet package reference is added.
+Open your IDE, in `Data` folder under the `ModularCrm.Ordering` project, and edit `IOrderingDbContext` interface as shown:
-### Defining the Database Mappings
+````csharp
+using Microsoft.EntityFrameworkCore;
+using ModularCrm.Ordering.Entities;
+using Volo.Abp.Data;
+using Volo.Abp.EntityFrameworkCore;
-Entity Framework Core requires defining a `DbContext` class as the main object for the database mapping. We want to use the main application's `DbContext` object. That way, we can control the database migrations at a single point, ensure database transactions on multi-module operations, and establish relations between database tables of different modules. However, the Ordering module can not use the main application's `DbContext` object because it doesn't depend on the main application, and we don't want to establish such a dependency.
+namespace ModularCrm.Ordering.Data;
-As a solution, we will define a `DbContext` interface in the Ordering module which is then implemented by the main module's `DbContext`.
+[ConnectionStringName(OrderingDbProperties.ConnectionStringName)]
+public interface IOrderingDbContext : IEfCoreDbContext
+{
+ DbSet Orders { get; set; }
+}
+````
-Open your IDE, create a `Data` folder under the `ModularCrm.Ordering` project, and create an `IOrderingDbContext` interface under that folder:
+Afterwards, create *Orders* `DbSet` for the `OrderingDbContext` class in the `Data` folder under the `ModularCrm.Ordering` project.
````csharp
using Microsoft.EntityFrameworkCore;
using ModularCrm.Ordering.Entities;
+using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
-namespace ModularCrm.Ordering.Data
+namespace ModularCrm.Ordering.Data;
+
+[ConnectionStringName(OrderingDbProperties.ConnectionStringName)]
+public class OrderingDbContext : AbpDbContext, IOrderingDbContext
{
- public interface IOrderingDbContext : IEfCoreDbContext
+ public DbSet Orders { get; set; }
+
+ public OrderingDbContext(DbContextOptions options) : base(options)
{
- DbSet Orders { get; set; }
+
+ }
+
+ protected override void OnModelCreating(ModelBuilder builder)
+ {
+ base.OnModelCreating(builder);
+
+ builder.ConfigureOrdering();
}
}
````
+
We can inject and use the `IOrderingDbContext` in the Ordering module. However, we will not usually directly use that interface. Instead, we will use ABP's [repositories](../../framework/architecture/domain-driven-design/repositories.md), which internally uses that interface.
-It is best to configure the database table mapping for the `Order` entity in the Ordering module. We will create an extension method that will be called by the main application later. Create a class named `OrderingDbContextModelCreatingExtensions` in the same `Data` folder:
+It is best to configure the database table mapping for the `Order` entity in the Ordering module. We will use the `OrderingDbContextModelCreatingExtensions` in the same `Data` folder:
````csharp
using Microsoft.EntityFrameworkCore;
@@ -142,26 +130,26 @@ using ModularCrm.Ordering.Entities;
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore.Modeling;
-namespace ModularCrm.Ordering.Data
+namespace ModularCrm.Ordering.Data;
+
+public static class OrderingDbContextModelCreatingExtensions
{
- public static class OrderingDbContextModelCreatingExtensions
+ public static void ConfigureOrdering(
+ this ModelBuilder builder)
{
- public static void ConfigureOrdering(this ModelBuilder builder)
- {
- Check.NotNull(builder, nameof(builder));
+ Check.NotNull(builder, nameof(builder));
- builder.Entity(b =>
- {
- //Configure table name
- b.ToTable("Orders");
+ builder.Entity(b =>
+ {
+ //Configure table name
+ b.ToTable("Orders");
- //Always call this method to set base entity properties
- b.ConfigureByConvention();
+ //Always call this method to set base entity properties
+ b.ConfigureByConvention();
- //Properties of the entity
- b.Property(q => q.CustomerName).IsRequired().HasMaxLength(120);
- });
- }
+ //Properties of the entity
+ b.Property(q => q.CustomerName).IsRequired().HasMaxLength(120);
+ });
}
}
````
@@ -204,7 +192,7 @@ protected override void OnModelCreating(ModelBuilder builder)
}
````
-In this way, the Ordering module can use' ModularCrmDbContext' over the `IProductsDbContext` interface. This part is only needed once for a module. Next time, you can add a new database migration, as explained in the next section.
+In this way, the Ordering module can use 'ModularCrmDbContext' over the `IProductsDbContext` interface. This part is only needed once for a module. Next time, you can add a new database migration, as explained in the next section.
#### Add a Database Migration
@@ -238,30 +226,14 @@ We will create an application service to manage the `Order` entities.
### Defining the Application Service Contract
-We're gonna create the `IOrderAppService` interface under the `ModularCrm.Ordering.Contracts` project but first, we need to add `Volo.Abp.Ddd.Application.Contracts` package reference.
-
-Right-click the `ModularCrm.Ordering.Contracts` project in the *Solution Explorer* panel and select the *Add Package Reference* command:
-
-
-
-This command opens a dialog to add a new package reference:
-
-
-
-Select the *NuGet* tab, type `Volo.Abp.Ddd.Application.Contracts` as the *Package name* and write the version of the package you want to install. Please be sure that you are installing the same version as the other ABP packages you are already using.
-
-Click the *Ok* button. Now you can check the *Packages* under the `ModularCrm.Ordering.Contracts` project *Dependencies* to see the `Volo.Abp.Ddd.Application.Contracts` package is installed:
-
-
-
-Return to your IDE, open the `ModularCrm.Ordering` module's .NET solution and create an `IOrderAppService` interface under the `Services` folder for `ModularCrm.Ordering.Contracts` project:
+We're gonna create the `IOrderAppService` interface under the `ModularCrm.Ordering.Contracts` project. Return to your IDE, open the `ModularCrm.Ordering` module's .NET solution and create an `IOrderAppService` interface under the `Services` folder for `ModularCrm.Ordering.Contracts` project:
````csharp
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
-namespace ModularCrm.Ordering.Contracts.Services;
+namespace ModularCrm.Ordering.Services;
public interface IOrderAppService : IApplicationService
{
@@ -297,9 +269,9 @@ Create a `OrderDto` class under the `ModularCrm.Ordering.Contracts` project:
````csharp
using System;
-using ModularCrm.Ordering.Contracts.Enums;
+using ModularCrm.Ordering.Enums;
-namespace ModularCrm.Ordering.Contracts.Services;
+namespace ModularCrm.Ordering.Services;
public class OrderDto
{
@@ -316,72 +288,43 @@ The new files under the `ModularCrm.Ordering.Contracts` project should be like t
### Implementing the Application Service
-Before creating the `OrderAppService` class, we need to add the `Volo.Abp.Ddd.Application` and `Volo.Abp.AutoMapper` packages to the Ordering module.
-
-Right-click the `ModularCrm.Ordering` package in the *Solution Explorer* panel and select the *Add Package Reference* command:
-
-
-
-This command opens a dialog to add a new package reference:
-
-
-
-Select the *NuGet* tab, enter `Volo.Abp.Ddd.Application` as the *Package name*, and specify the version of the package you wish to install. Afterward, you can add the `Volo.Abp.AutoMapper` package in the same dialog. Ensure that you install the same version as the other ABP packages you are already using.
-
-Click the *OK* button. Now we should configure the *AutoMapper* object to map the `Order` entity to the `OrderDto` object. We will create a class named `OrderingApplicationAutoMapperProfile` under the `ModularCrm.Ordering` project:
+Now we should configure the *AutoMapper* object to map the `Order` entity to the `OrderDto` object. We will use the `OrderingAutoMapperProfile` under the `ModularCrm.Ordering` project:
````csharp
using AutoMapper;
-using ModularCrm.Ordering.Contracts.Services;
using ModularCrm.Ordering.Entities;
+using ModularCrm.Ordering.Services;
namespace ModularCrm.Ordering;
-public class OrderingApplicationAutoMapperProfile : Profile
+public class OrderingAutoMapperProfile : Profile
{
- public OrderingApplicationAutoMapperProfile()
+ public OrderingAutoMapperProfile()
{
CreateMap();
}
}
````
-And configure the `OrderingWebModule` class to use the `OrderingApplicationAutoMapperProfile`:
-
-````csharp
-public override void ConfigureServices(ServiceConfigurationContext context)
-{
- //Add these lines
- context.Services.AddAutoMapperObjectMapper();
- Configure(options =>
- {
- options.AddMaps(validate: true);
- });
-}
-````
-
Now, we can implement the `IOrderAppService` interface. Create an `OrderAppService` class under the `Services` folder of the `ModularCrm.Ordering` project:
````csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using ModularCrm.Ordering.Contracts.Enums;
-using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Enums;
using ModularCrm.Ordering.Entities;
-using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
namespace ModularCrm.Ordering.Services;
-public class OrderAppService : ApplicationService, IOrderAppService
+public class OrderAppService : OrderingAppService, IOrderAppService
{
private readonly IRepository _orderRepository;
public OrderAppService(IRepository orderRepository)
{
_orderRepository = orderRepository;
- ObjectMapperContext = typeof(OrderingWebModule);
}
public async Task> GetListAsync()
@@ -415,7 +358,7 @@ private void ConfigureAutoApiControllers()
options.ConventionalControllers.Create(typeof(ProductsApplicationModule).Assembly);
//ADD THE FOLLOWING LINE:
- options.ConventionalControllers.Create(typeof(OrderingWebModule).Assembly);
+ options.ConventionalControllers.Create(typeof(OrderingModule).Assembly);
});
}
````
@@ -442,32 +385,17 @@ If you check the database, you should see the entities created in the *Orders* t
## Creating the User Interface
-### Creating a `_ViewImports.cshtml` File
-
-Open the `ModularCrm.Ordering` .NET solution in your favorite IDE, locate the `ModularCrm.Ordering` project and create a `Pages` folder under that project. Then add a `_ViewImports.cshtml` file under that `Pages` folder with the following content:
-
-````csharp
-@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
-````
-
-That file imports some tag helpers from ASP.NET Core and ABP. The `Pages` folder should be like the following figure:
-
-
-
### Creating the Orders Page
-Create an `Orders` folder under the `Pages` folder and add an `Index.cshtml` Razor Page inside that new folder. Then replace the `Index.cshtml.cs` content with the following code block:
+Replace the `Index.cshtml.cs` content in the `Pages/Ordering` folder of the `ModularCrm.Ordering.UI` project with the following code block:
````csharp
-using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Collections.Generic;
using System.Threading.Tasks;
-using ModularCrm.Ordering.Contracts.Services;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using ModularCrm.Ordering.Services;
-namespace ModularCrm.Ordering.Pages.Orders
+namespace ModularCrm.Ordering.UI.Pages.Ordering
{
public class IndexModel : PageModel
{
@@ -488,11 +416,11 @@ namespace ModularCrm.Ordering.Pages.Orders
}
````
-Here, we are injecting a repository to query `Order` entities from the database to show on the page. Open the `Index.cshtml` file and replace the content with the following code block:
+Here, we are injecting `IOrderAppService` to query `Order` entities from the database to show on the page. Open the `Index.cshtml` file and replace the content with the following code block:
````html
@page
-@model ModularCrm.Ordering.Pages.Orders.IndexModel
+@model ModularCrm.Ordering.UI.Pages.Ordering.IndexModel
Orders
@@ -514,87 +442,65 @@ Here, we are injecting a repository to query `Order` entities from the database
This page shows a list of orders on the UI. We haven't created a UI to create new orders, and we will not do it to keep this tutorial simple. If you want to learn how to create advanced UIs with ABP, please follow the [Book Store tutorial](../book-store/index.md).
-### Building the Application
-
-Now, we will run the application to see the result. Please stop the application if it is already running. Then open the *Solution Runner* panel, right-click the `ModularCrm.Web` application, and select the *Build* -> *Graph Build* command:
-
-
-
-We've performed a graph build since we've made a change on a module, and more than building the main application is needed. *Graph Build* command also builds the depended modules if necessary. Alternatively, you could build the Ordering module first (on ABP Studio or your IDE), then right-click the `ModularCrm.Web` application and select the *Run* -> *Build & Start*. This approach can be faster if you have too many modules and you make a change in one of the modules.
-
-### Running the Application
-
-Run the main application on ABP Studio, manually type `/Orders` to the end of your application's URL to open the *Orders* page:
-
-
-
-Great! We can see the list of orders. However, there are two problems:
-
-1. The Order page has no menu item on the main menu. This is because we haven't configured the [navigation menu system](../../framework/ui/mvc-razor-pages/navigation-menu.md) yet.
-2. We see Product's GUID ID instead of its name. This is because the Ordering module has no integration with the Products module and doesn't have access to Product module's database to perform a JOIN query.
-
-We will solve the second problem in the [next part](part-06.md), but we can easily add a menu item for the Orders page now.
-
-### Adding a Menu Item
+### Editing the Menu Item
ABP provides a modular navigation [menu system](../../framework/ui/mvc-razor-pages/navigation-menu.md) where each module can contribute to the main menu dynamically.
-Open the `ModularCrm.Ordering` .NET solution in your IDE and add the following `OrderingMenuContributor` class into the `ModularCrm.Ordering` project:
+Edit the `OrderingMenuContributor` class into the `ModularCrm.Ordering.UI` project:
````csharp
using System.Threading.Tasks;
using Volo.Abp.UI.Navigation;
-namespace ModularCrm.Ordering
+namespace ModularCrm.Ordering.UI.Menus;
+
+public class OrderingMenuContributor : IMenuContributor
{
- public class OrderingMenuContributor : IMenuContributor
+ public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{
- public Task ConfigureMenuAsync(MenuConfigurationContext context)
+ if (context.Menu.Name == StandardMenus.Main)
{
- if (context.Menu.Name == StandardMenus.Main)
- {
- context.Menu.AddItem(
- new ApplicationMenuItem(
- "ModularCrm.Orders.Index", // Unique menu id
- "Orders", // Menu display text
- "~/Orders", // URL
- "fa-solid fa-basket-shopping" // Icon CSS class
- )
- );
- }
-
- return Task.CompletedTask;
+ await ConfigureMainMenuAsync(context);
}
}
+
+ private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
+ {
+ context.Menu.AddItem(
+ new ApplicationMenuItem(
+ OrderingMenus.Prefix, // Unique menu id
+ "Orders", // Menu display text
+ "~/Ordering", // URL
+ "fa-solid fa-basket-shopping" // Icon CSS class
+ )
+ );
+
+ return Task.CompletedTask;
+ }
}
+
````
`OrderingMenuContributor` implements the `IMenuContributor` interface, which forces us to implement the `ConfigureMenuAsync` method. In that method, we can manipulate the menu items (add new menu items, remove existing menu items or change the properties of existing menu items). The `ConfigureMenuAsync` method is executed whenever the menu is rendered on the UI, so you can dynamically decide how to manipulate the menu items.
-After creating such a class, we should configure the `AbpNavigationOptions` to add that contributor. Open the `OrderingWebModule` class in the `ModularCrm.Ordering` project and add the following configuration code into the `ConfigureServices` method:
+> You can check the [menu documentation](../../framework/ui/mvc-razor-pages/navigation-menu.md) to learn more about manipulating menu items.
-````csharp
-public override void ConfigureServices(ServiceConfigurationContext context)
-{
- //... other configurations
+### Building the Application
- Configure(options =>
- {
- options.MenuContributors.Add(new OrderingMenuContributor());
- });
-}
-````
+Now, we will run the application to see the result. Please stop the application if it is already running. Then open the *Solution Runner* panel, right-click the `ModularCrm.Web` application, and select the *Build* -> *Graph Build* command:
+
+
-That's all. You can stop the main application (if it is already working), make a graph build on the main application, run it again on ABP Studio's *Solution Runner* panel and *Browse* it to see the result:
+We've performed a graph build since we've made a change on a module, and more than building the main application is needed. *Graph Build* command also builds the depended modules if necessary. Alternatively, you could build the Ordering module first (on ABP Studio or your IDE), then right-click the `ModularCrm.Web` application and select the *Run* -> *Build & Start*. This approach can be faster if you have too many modules and you make a change in one of the modules. Now you can run the application by right-clicking the `ModularCrm.Web` application and selecting the *Run* -> *Start* command.

-The *Orders* menu item is added under the *Products* menu item.
+Great! We can see the list of orders. However, there is a problem:
-> You can check the [menu documentation](../../framework/ui/mvc-razor-pages/navigation-menu.md) to learn more about manipulating menu items.
+1. We see Product's GUID ID instead of its name. This is because the Ordering module has no integration with the Products module and doesn't have access to Product module's database to perform a JOIN query.
-## Summary
+We will solve this problem in the [next part](part-06.md).
-In this part of the *Modular CRM* tutorial, we've built the functionality inside the Ordering module we created in the [previous part](part-04.md). Since we've created the Ordering module from scratch (with the *Empty Module* template), we had to implement many aspects manually, add ABP packages, create some configuration classes, etc. It is good to do all these manually for one time to learn the things, but it is better to use the other module templates (that pre-configure the fundamentals for us) for a more comfortable development experience.
+## Summary
-In the next part, we will work on establishing communication between the Orders module and the Products module.
+In this part of the *Modular CRM* tutorial, we've built the functionality inside the Ordering module we created in the [previous part](part-04.md). In the next part, we will work on establishing communication between the Orders module and the Products module.
diff --git a/docs/en/tutorials/modular-crm/part-06.md b/docs/en/tutorials/modular-crm/part-06.md
index 55e04259bb..36e4f22a64 100644
--- a/docs/en/tutorials/modular-crm/part-06.md
+++ b/docs/en/tutorials/modular-crm/part-06.md
@@ -26,9 +26,9 @@ Let's begin from the first one: The Integration Services.
## The Need for the Integration Services
-Remember from the [previous part](part-05.md), the Orders page shows products' identities instead of their names:
+Remember from the [previous part](part-05.md), the Orders page shows product's identities instead of their names:
-
+
That is because the Orders module has no access to the product data, so it can not perform a JOIN query to get the names of products from the `Products` table. That is a natural result of the modular design. However, we also don't want to show a product's identity on the UI, which is not a good user experience.
@@ -152,8 +152,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using ModularCrm.Ordering.Contracts.Enums;
-using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Enums;
using ModularCrm.Ordering.Entities;
using ModularCrm.Products.Integration;
using Volo.Abp.Application.Services;
@@ -172,7 +171,6 @@ public class OrderAppService : ApplicationService, IOrderAppService
{
_orderRepository = orderRepository;
_productIntegrationService = productIntegrationService;
- ObjectMapperContext = typeof(OrderingWebModule);
}
public async Task> GetListAsync()
@@ -182,7 +180,7 @@ public class OrderAppService : ApplicationService, IOrderAppService
// Prepare a list of products we need
var productIds = orders.Select(o => o.ProductId).Distinct().ToList();
var products = (await _productIntegrationService
- .GetProductsByIdsAsync(productIds))
+ .GetProductsByIdsAsync(productIds))
.ToDictionary(p => p.Id, p => p.Name);
var orderDtos = ObjectMapper.Map, List>(orders);
@@ -213,9 +211,9 @@ And also, open the `OrderDto` class (the `OrderDto.cs` file under the `Services`
````csharp
using System;
-using ModularCrm.Ordering.Contracts.Enums;
+using ModularCrm.Ordering.Enums;
-namespace ModularCrm.Ordering.Contracts.Services;
+namespace ModularCrm.Ordering.Services;
public class OrderDto
{
@@ -227,11 +225,11 @@ public class OrderDto
}
````
-Lastly, open the `OrderingApplicationAutoMapperProfile` class (the `OrderingApplicationAutoMapperProfile.cs` file under the `Services` folder of the `ModularCrm.Ordering` project of the `ModularCrm.Ordering` .NET solution) and ignore the `ProductName` property in the mapping configuration:
+Lastly, open the `OrderingAutoMapperProfile` class (the `OrderingAutoMapperProfile.cs` file under the `Services` folder of the `ModularCrm.Ordering` project of the `ModularCrm.Ordering` .NET solution) and ignore the `ProductName` property in the mapping configuration:
````csharp
using AutoMapper;
-using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Services;
using ModularCrm.Ordering.Entities;
using Volo.Abp.AutoMapper;
@@ -262,7 +260,7 @@ Open the `Index.cshtml` file, and change the `@order.ProductId` part by `@Model.
````html
@page
-@model ModularCrm.Ordering.Pages.Orders.IndexModel
+@model ModularCrm.Ordering.UI.Pages.Ordering.IndexModel
Orders
@@ -271,11 +269,11 @@ Open the `Index.cshtml` file, and change the `@order.ProductId` part by `@Model.
@foreach (var order in Model.Orders)
{
-
- Customer: @order.CustomerName
- Product: @order.ProductName
- State: @order.State
-
+
+ Customer: @order.CustomerName
+ Product: @order.ProductName
+ State: @order.State
+
}
diff --git a/docs/en/tutorials/modular-crm/part-07.md b/docs/en/tutorials/modular-crm/part-07.md
index 5ddba71421..510e5675b3 100644
--- a/docs/en/tutorials/modular-crm/part-07.md
+++ b/docs/en/tutorials/modular-crm/part-07.md
@@ -42,7 +42,7 @@ We've placed the `OrderPlacedEto` class inside the `ModularCrm.Ordering.Contract
````csharp
using System;
-namespace ModularCrm.Ordering.Contracts.Events
+namespace ModularCrm.Ordering.Events
{
public class OrderPlacedEto
{
@@ -63,18 +63,16 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using ModularCrm.Ordering.Contracts.Enums;
-using ModularCrm.Ordering.Contracts.Events;
-using ModularCrm.Ordering.Contracts.Services;
+using ModularCrm.Ordering.Enums;
+using ModularCrm.Ordering.Events;
using ModularCrm.Ordering.Entities;
using ModularCrm.Products.Integration;
-using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.EventBus.Distributed;
namespace ModularCrm.Ordering.Services;
-public class OrderAppService : ApplicationService, IOrderAppService
+public class OrderAppService : OrderingAppService, IOrderAppService
{
private readonly IRepository _orderRepository;
private readonly IProductIntegrationService _productIntegrationService;
@@ -88,7 +86,6 @@ public class OrderAppService : ApplicationService, IOrderAppService
_orderRepository = orderRepository;
_productIntegrationService = productIntegrationService;
_distributedEventBus = distributedEventBus;
- ObjectMapperContext = typeof(OrderingWebModule);
}
public async Task> GetListAsync()
@@ -174,7 +171,7 @@ Open the Product module's .NET solution in your IDE, locate the `ModularCrm.Prod
Replace the `OrderEventHandler.cs` file's content with the following code block:
````csharp
-using ModularCrm.Ordering.Contracts.Events;
+using ModularCrm.Ordering.Events;
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
diff --git a/docs/en/ui-themes/lepton-x/index.md b/docs/en/ui-themes/lepton-x/index.md
index 3bfc769409..241d4dfb89 100644
--- a/docs/en/ui-themes/lepton-x/index.md
+++ b/docs/en/ui-themes/lepton-x/index.md
@@ -52,11 +52,11 @@ This module follows the [module development best practices guide](../../framewor
LeptonX Theme module doesn't provide any UI pages. It just changes the existing UI pages of an application. Here are some sample pages:
-#### Login page
+### Login page

-#### Languages Page
+### Languages Page

diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs
index 01e0dd7ae9..f020d032c2 100644
--- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Microsoft/Extensions/DependencyInjection/AbpOpenIdConnectExtensions.cs
@@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.RequestLocalization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Volo.Abp;
using Volo.Abp.AspNetCore.Authentication.OpenIdConnect;
using Volo.Abp.AspNetCore.MultiTenancy;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs
index b5ca46e7d8..1d171aa766 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/ApplicationConfigurationCache.cs
@@ -1,5 +1,4 @@
using System;
-using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/AbpAspNetCoreComponentsServerModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/AbpAspNetCoreComponentsServerModule.cs
index cd1fad79a0..501fcc0b9f 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/AbpAspNetCoreComponentsServerModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/AbpAspNetCoreComponentsServerModule.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using Microsoft.AspNetCore.Builder;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs
index 3211aec50d..787539a63a 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo/Abp/AspNetCore/Components/Server/Extensibility/BlazorServerLookupApiRequestService.cs
@@ -1,12 +1,9 @@
using System;
using System.Globalization;
-using System.Linq.Dynamic.Core;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Options;
-using Microsoft.Extensions.Primitives;
using Volo.Abp.AspNetCore.Components.Web.Extensibility;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Client;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs
index 76bffc43a8..492e2231ae 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/PageHeader.razor.cs
@@ -1,11 +1,9 @@
-using System;
-using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Components.Web.Theming.PageToolbars;
using Volo.Abp.BlazoriseUI;
using System.Linq;
-using System.Collections.ObjectModel;
namespace Volo.Abp.AspNetCore.Components.Web.Theming.Layout;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/StandardLayouts.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/StandardLayouts.cs
index 5811cc22c1..2b86d67e3f 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/StandardLayouts.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Layout/StandardLayouts.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Volo.Abp.AspNetCore.Components.Web.Theming.Layout;
+namespace Volo.Abp.AspNetCore.Components.Web.Theming.Layout;
public static class StandardLayouts
{
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs
index 673c004fdb..e76772d704 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarExtensions.cs
@@ -3,7 +3,6 @@ using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.BlazoriseUI.Components;
-using Volo.Abp.Localization;
namespace Volo.Abp.AspNetCore.Components.Web.Theming.PageToolbars;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs
index 00f7f5da23..9796ece5e2 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/PageToolbars/PageToolbarManager.cs
@@ -1,6 +1,4 @@
-using Microsoft.Extensions.Options;
-using System;
-using System.Collections.Generic;
+using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpAspNetCoreComponentsWebModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpAspNetCoreComponentsWebModule.cs
index 3e186b9d0f..7408682833 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpAspNetCoreComponentsWebModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpAspNetCoreComponentsWebModule.cs
@@ -2,7 +2,6 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.AspNetCore.Components.DependencyInjection;
-using Volo.Abp.AspNetCore.Components.Web;
using Volo.Abp.Modularity;
using Volo.Abp.UI;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs
index 1c461f33aa..507f2ef0e2 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/AbpBlazorMessageLocalizerHelper.cs
@@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Linq;
-using JetBrains.Annotations;
using Microsoft.Extensions.Localization;
namespace Volo.Abp.AspNetCore.Components.Web;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs
index 07043e151b..000e4e7703 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs
@@ -1,5 +1,4 @@
-using JetBrains.Annotations;
-using System;
+using System;
using System.Collections.Generic;
using System.Globalization;
using Volo.Abp.AspNetCore.Components.Web.Extensibility.EntityActions;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpAuthenticationState.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpAuthenticationState.cs
index cc435ed54d..508b2ea128 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpAuthenticationState.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpAuthenticationState.cs
@@ -1,4 +1,3 @@
-using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Routing;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs
index 74cbd37e29..c98edaef19 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Security/AbpComponentsClaimsCache.cs
@@ -1,6 +1,5 @@
using System.Security.Claims;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/Extensibility/WebAssemblyLookupApiRequestService.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/Extensibility/WebAssemblyLookupApiRequestService.cs
index 4acdafdb15..f0ba3c840e 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/Extensibility/WebAssemblyLookupApiRequestService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/Extensibility/WebAssemblyLookupApiRequestService.cs
@@ -2,12 +2,10 @@
using System.Globalization;
using System.Net.Http;
using System.Threading.Tasks;
-using Castle.Components.DictionaryAdapter;
using Volo.Abp.AspNetCore.Components.Web.Extensibility;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Client.Authentication;
using Volo.Abp.Http.Client;
-using Microsoft.Extensions.Options;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Extensibility;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpAspNetCoreComponentsModule.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpAspNetCoreComponentsModule.cs
index dd48830a24..ea49d4ee9d 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpAspNetCoreComponentsModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/AbpAspNetCoreComponentsModule.cs
@@ -2,7 +2,6 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Components.DependencyInjection;
using Volo.Abp.DynamicProxy;
-using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs
index f450033b01..a448a52eb3 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertList.cs
@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Collections.ObjectModel;
namespace Volo.Abp.AspNetCore.Components.Alerts;
diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertType.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertType.cs
index 6149f9bb24..627c9ddf76 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertType.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/AlertType.cs
@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Volo.Abp.AspNetCore.Components.Alerts;
+namespace Volo.Abp.AspNetCore.Components.Alerts;
public enum AlertType
{
diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/IAlertManager.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/IAlertManager.cs
index 0e6344baaf..5095409888 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/IAlertManager.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Alerts/IAlertManager.cs
@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Volo.Abp.AspNetCore.Components.Alerts;
+namespace Volo.Abp.AspNetCore.Components.Alerts;
public interface IAlertManager
{
diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs
index e0d8ecd806..f41d096e75 100644
--- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs
@@ -1,5 +1,4 @@
-using Microsoft.Extensions.DependencyInjection;
-using Volo.Abp.Modularity;
+using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.MultiTenancy;
diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs
index 080427cf6b..31c60b1588 100644
--- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs
+++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs
@@ -19,7 +19,6 @@ using Microsoft.Net.Http.Headers;
using Volo.Abp.AspNetCore.MultiTenancy.Views;
using Volo.Abp.AspNetCore.RazorViews;
using Volo.Abp.Http;
-using Volo.Abp.Json;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs
index f63c04e49c..8d787bec65 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs
index b7d8a0df40..0bff9d09b1 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs
@@ -1,4 +1,3 @@
-using System;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs
index d8c1351b3e..a06dd0578a 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/CurrentTenantDto.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Text;
namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs
index c08e4ab60d..fcbb911ad7 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/MultiTenancy/MultiTenancyInfoDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy;
+namespace Volo.Abp.AspNetCore.Mvc.MultiTenancy;
public class MultiTenancyInfoDto
{
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprAppApiTokenValidator.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprAppApiTokenValidator.cs
index aa7d17072b..1e272bc785 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprAppApiTokenValidator.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprAppApiTokenValidator.cs
@@ -1,5 +1,4 @@
using System;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Authorization;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprHttpContextExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprHttpContextExtensions.cs
index e73eaec4f7..c5f2c023b5 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprHttpContextExtensions.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo/Abp/AspNetCore/Mvc/Dapr/DaprHttpContextExtensions.cs
@@ -1,5 +1,4 @@
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.Dapr;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs
index 8d0227fd11..f299eedaf2 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelper.cs
@@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.Threading;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Alert/AbpAlertTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Alert/AbpAlertTagHelperService.cs
index 6d465f4bb4..866132af01 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Alert/AbpAlertTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Alert/AbpAlertTagHelperService.cs
@@ -1,5 +1,4 @@
-using System;
-using Microsoft.AspNetCore.Razor.TagHelpers;
+using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Alerts;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupDirection.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupDirection.cs
index 9b4e42805d..a4f4a5c1a9 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupDirection.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupDirection.cs
@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button;
+namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button;
public enum AbpButtonGroupDirection
{
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupTagHelperService.cs
index fb646e9941..f92a8e1346 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Button/AbpButtonGroupTagHelperService.cs
@@ -1,5 +1,4 @@
-using System;
-using Microsoft.AspNetCore.Razor.TagHelpers;
+using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs
index 64d90496c3..0131862236 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelper.cs
@@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
-using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Collapse;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelperService.cs
index 49b356379a..965e71c505 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Collapse/AbpCollapseButtonTagHelperService.cs
@@ -1,6 +1,4 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
-using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
-using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Collapse;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs
index bda437f8c5..58ac3f7fea 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Extensions/TagHelperContextExtensions.cs
@@ -1,7 +1,4 @@
-using System.Collections.Generic;
-using System.Linq;
-using Microsoft.AspNetCore.Razor.TagHelpers;
-using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form;
+using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs
index 4e4b86a308..253e614fa4 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelper.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
-using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs
index d2ed433161..bd3a4abe48 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs
@@ -364,12 +364,14 @@ public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelp
attrList.Add("data-parent-el", options.ParentEl);
}
+#pragma warning disable CS0618 // Type or member is obsolete
if (!options.DateFormat.IsNullOrEmpty())
{
attrList.Add("data-date-format", options.DateFormat);
}
-
- if(!options.VisibleDateFormat.IsNullOrEmpty())
+#pragma warning restore CS0618 // Type or member is obsolete
+
+ if (!options.VisibleDateFormat.IsNullOrEmpty())
{
attrList.Add("data-visible-date-format", options.VisibleDateFormat);
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOpens.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOpens.cs
index a74bf229ef..e75f624446 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOpens.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOpens.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
+namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
public enum AbpDatePickerOpens : byte
{
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs
index 519952d21e..e8a8a60b3c 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs
@@ -1,5 +1,4 @@
-using JetBrains.Annotations;
-using Microsoft.AspNetCore.Mvc.ViewFeatures;
+using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs
index a2abf7c368..3fc2861b59 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs
@@ -1,7 +1,6 @@
using System;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs
index e2f249bf28..5a052d8877 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs
@@ -1,5 +1,4 @@
-using JetBrains.Annotations;
-using Microsoft.AspNetCore.Mvc.ViewFeatures;
+using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs
index f21c2a1507..c8ba8b3a12 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs
@@ -2,7 +2,6 @@
using System.Linq;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/IAbpTagHelperLocalizer.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/IAbpTagHelperLocalizer.cs
index f19f1dd8d7..0c1116fe87 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/IAbpTagHelperLocalizer.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/IAbpTagHelperLocalizer.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Reflection;
+using System.Reflection;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Localization;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavLinkTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavLinkTagHelperService.cs
index 5a2e05cf41..d2937ba459 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavLinkTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavLinkTagHelperService.cs
@@ -1,7 +1,4 @@
-using System.Collections.Generic;
-using System.Text.Encodings.Web;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Razor.TagHelpers;
+using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Nav;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavTagHelperService.cs
index 2d7639ca09..92f702d4ce 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavTagHelperService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Nav/AbpNavTagHelperService.cs
@@ -1,8 +1,4 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Razor.TagHelpers;
+using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Nav;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Pagination/AbpPaginationTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Pagination/AbpPaginationTagHelper.cs
index 4c144bb92d..2449ba6b1c 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Pagination/AbpPaginationTagHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Pagination/AbpPaginationTagHelper.cs
@@ -1,6 +1,4 @@
-using Microsoft.AspNetCore.Mvc.Rendering;
-using Microsoft.AspNetCore.Mvc.ViewFeatures;
-using Microsoft.AspNetCore.Razor.TagHelpers;
+using Microsoft.AspNetCore.Razor.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Pagination;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs
index a234ea5dba..7e3360e4c8 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Scripts/ScriptBundler.cs
@@ -1,7 +1,6 @@
using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Options;
-using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.Minify.Scripts;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.Scripts;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs
index 97e6353f6b..6623a2d667 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/Styles/StyleBundler.cs
@@ -2,7 +2,6 @@ using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Options;
-using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.Minify.Styles;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.Styles;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs
index 03ed327dc0..cf5d2721dd 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelper.cs
@@ -1,5 +1,4 @@
using System;
-using Microsoft.AspNetCore.Razor.TagHelpers;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs
index ea5ecc8edc..7939cb7912 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs
@@ -3,8 +3,6 @@ using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.Diagnostics;
-using System.IO;
-using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Rendering;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantController.cs
index be255af2ca..606bd45266 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantController.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/AbpTenantController.cs
@@ -2,7 +2,6 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
-using Volo.Abp.AspNetCore;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.MultiTenancy;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs
index 94a6760df3..6c0ad91e5f 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/TenantSwitchModal.cshtml.cs
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Volo.Abp;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Anchor/AnchorJsScriptBundleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Anchor/AnchorJsScriptBundleContributor.cs
index 5d3d1e1f33..4ce05679eb 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Anchor/AnchorJsScriptBundleContributor.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Anchor/AnchorJsScriptBundleContributor.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System.Collections.Generic;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery;
using Volo.Abp.Modularity;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/BootstrapDaterangepicker/BootstrapDaterangepickerScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/BootstrapDaterangepicker/BootstrapDaterangepickerScriptContributor.cs
index 4328f74b7a..9b931217c4 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/BootstrapDaterangepicker/BootstrapDaterangepickerScriptContributor.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/BootstrapDaterangepicker/BootstrapDaterangepickerScriptContributor.cs
@@ -1,9 +1,7 @@
using System.Collections.Generic;
-using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery;
using Volo.Abp.AspNetCore.Mvc.UI.Packages.Moment;
-using Volo.Abp.Localization;
using Volo.Abp.Modularity;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.BootstrapDaterangepicker;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginScriptBundleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginScriptBundleContributor.cs
index 01c729af5e..30639e1583 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginScriptBundleContributor.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginScriptBundleContributor.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System.Collections.Generic;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.MalihuCustomScrollbar;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginStyleBundleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginStyleBundleContributor.cs
index 87e4f61b5d..d24ccb9f77 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginStyleBundleContributor.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/MalihuCustomScrollbar/MalihuCustomScrollbarPluginStyleBundleContributor.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System.Collections.Generic;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.MalihuCustomScrollbar;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Moment/MomentScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Moment/MomentScriptContributor.cs
index a58340902c..7e70dd6933 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Moment/MomentScriptContributor.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/Moment/MomentScriptContributor.cs
@@ -1,9 +1,7 @@
using System.Collections.Generic;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
-using Volo.Abp.AspNetCore.Mvc.UI.Packages.JQuery;
using Volo.Abp.Localization;
-using Volo.Abp.Modularity;
namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.Moment;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetScripts/WidgetScriptsViewComponent.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetScripts/WidgetScriptsViewComponent.cs
index c662a88e2b..57eecc3140 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetScripts/WidgetScriptsViewComponent.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/Components/WidgetScripts/WidgetScriptsViewComponent.cs
@@ -1,6 +1,5 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
-using Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles;
namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/IWidgetManager.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/IWidgetManager.cs
index 8a3aace9d3..69b78761a2 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/IWidgetManager.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/IWidgetManager.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Text;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/WidgetAttribute.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/WidgetAttribute.cs
index 31fc18a8a0..5913123351 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/WidgetAttribute.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/WidgetAttribute.cs
@@ -1,6 +1,5 @@
using System;
using System.Reflection;
-using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
index 379523b659..ba1bfd0437 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
@@ -1,13 +1,10 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
-using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Infrastructure;
-using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
-using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -34,18 +31,14 @@ using Volo.Abp.AspNetCore.Mvc.Infrastructure;
using Volo.Abp.AspNetCore.Mvc.Json;
using Volo.Abp.AspNetCore.Mvc.Libs;
using Volo.Abp.AspNetCore.Mvc.Localization;
-using Volo.Abp.AspNetCore.VirtualFileSystem;
-using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
using Volo.Abp.DynamicProxy;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.Http.Modeling;
using Volo.Abp.Http.ProxyScripting.Generators.JQuery;
-using Volo.Abp.Json;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
-using Volo.Abp.UI;
using Volo.Abp.UI.Navigation;
using Volo.Abp.Validation.Localization;
@@ -197,8 +190,8 @@ public class AbpAspNetCoreMvcModule : AbpModule
options.EndpointConfigureActions.Add(endpointContext =>
{
endpointContext.Endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}");
- endpointContext.Endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
- endpointContext.Endpoints.MapRazorPages();
+ endpointContext.Endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}").WithStaticAssets();
+ endpointContext.Endpoints.MapRazorPages().WithStaticAssets();
});
});
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs
index b8d98d7de4..8c93400929 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs
@@ -3,7 +3,6 @@ using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
-using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Options;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs
index f00c4ac250..7f41f73165 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs
@@ -4,7 +4,6 @@ using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationLocalizationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationLocalizationAppService.cs
index a76691ca06..a01d5c6aff 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationLocalizationAppService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationLocalizationAppService.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpConventionalControllerOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpConventionalControllerOptions.cs
index a8a2c2db54..ee893a0d1e 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpConventionalControllerOptions.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpConventionalControllerOptions.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Reflection;
-using JetBrains.Annotations;
using Microsoft.AspNetCore.Http;
using Volo.Abp.Content;
using Volo.Abp.Http.Modeling;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpServiceConvention.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpServiceConvention.cs
index ba85a34f65..3d3a71958a 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpServiceConvention.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/AbpServiceConvention.cs
@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
-using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalControllerSettingList.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalControllerSettingList.cs
index 633be5786f..077a580920 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalControllerSettingList.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalControllerSettingList.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using JetBrains.Annotations;
namespace Volo.Abp.AspNetCore.Mvc.Conventions;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs
index 58dda9fb92..62dfc66f93 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/ConventionalRouteBuilder.cs
@@ -1,7 +1,7 @@
using System;
+using System.ComponentModel;
using System.Linq;
using System.Reflection;
-using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
@@ -36,7 +36,8 @@ public class ConventionalRouteBuilder : IConventionalRouteBuilder, ITransientDep
var idParameterModel = action.Parameters.FirstOrDefault(p => p.ParameterName == "id");
if (idParameterModel != null)
{
- if (TypeHelper.IsPrimitiveExtended(idParameterModel.ParameterType, includeEnums: true))
+ if (TypeHelper.IsPrimitiveExtended(idParameterModel.ParameterType, includeEnums: true)
+ || TypeDescriptor.GetConverter(idParameterModel.ParameterType).CanConvertFrom(typeof(string)))
{
url += "/{id}";
}
@@ -157,4 +158,4 @@ public class ConventionalRouteBuilder : IConventionalRouteBuilder, ITransientDep
{
return secondaryId.ParameterName;
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/IConventionalRouteBuilder.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/IConventionalRouteBuilder.cs
index 8e55911240..b5a60ca158 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/IConventionalRouteBuilder.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Conventions/IConventionalRouteBuilder.cs
@@ -1,5 +1,4 @@
-using JetBrains.Annotations;
-using Microsoft.AspNetCore.Mvc.ApplicationModels;
+using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace Volo.Abp.AspNetCore.Mvc.Conventions;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs
index fbdeead63f..4cde96be0e 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/DataAnnotations/DynamicStringLengthAttributeAdapter.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Globalization;
+using System.Globalization;
using Microsoft.AspNetCore.Mvc.DataAnnotations;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Microsoft.Extensions.Localization;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
index 03684b063d..f09cde9815 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
@@ -77,7 +77,7 @@ public class AbpExceptionFilter : IAsyncExceptionFilter, IAbpFilter, ITransientD
{
if (!context.HttpContext.Response.HasStarted)
{
- context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
+ context.HttpContext.Response.Headers.Append(AbpHttpConsts.AbpErrorFormat, "true");
context.HttpContext.Response.StatusCode = (int)context
.GetRequiredService()
.GetStatusCode(context.HttpContext, context.Exception);
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs
index 8869293c7a..0e53b01cad 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs
@@ -106,7 +106,7 @@ public class AbpExceptionPageFilter : IAsyncPageFilter, IAbpFilter, ITransientDe
{
if (!context.HttpContext.Response.HasStarted)
{
- context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
+ context.HttpContext.Response.Headers.Append(AbpHttpConsts.AbpErrorFormat, "true");
context.HttpContext.Response.StatusCode = (int)context
.GetRequiredService()
.GetStatusCode(context.HttpContext, context.Exception!);
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeatureActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeatureActionFilter.cs
index 34f125f228..759fac2ba8 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeatureActionFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeatureActionFilter.cs
@@ -1,4 +1,3 @@
-using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeaturePageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeaturePageFilter.cs
index 3c43301221..8d72dfff4c 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeaturePageFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/GlobalFeatures/GlobalFeaturePageFilter.cs
@@ -1,4 +1,3 @@
-using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpApplicationLocalizationScriptController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpApplicationLocalizationScriptController.cs
index c3da22706e..f1ec46e59d 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpApplicationLocalizationScriptController.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpApplicationLocalizationScriptController.cs
@@ -1,14 +1,11 @@
-using System;
-using System.Text;
+using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.Auditing;
using Volo.Abp.Http;
using Volo.Abp.Json;
-using Volo.Abp.Localization;
using Volo.Abp.Minify.Scripts;
namespace Volo.Abp.AspNetCore.Mvc.Localization;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs
index 8a4f82953a..73c93851ff 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Localization/AbpLanguagesController.cs
@@ -1,7 +1,6 @@
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using System;
-using System.Globalization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.RequestLocalization;
using Volo.Abp.Auditing;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs
index 9512a82698..5cd9bf8089 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs
@@ -106,7 +106,7 @@ public class AbpUowActionFilter : IAsyncActionFilter, IAbpFilter, ITransientDepe
{
await currentUow.SaveChangesAsync(cancellationToken);
}
- catch (Exception e)
+ catch (Exception)
{
await currentUow.RollbackAsync(cancellationToken);
throw;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs
index 5c69c07797..b086df1a42 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowPageFilter.cs
@@ -6,7 +6,6 @@ using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Filters;
-using Volo.Abp.AspNetCore.Uow;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
using Volo.Abp.Uow;
@@ -112,7 +111,7 @@ public class AbpUowPageFilter : IAsyncPageFilter, IAbpFilter, ITransientDependen
{
await currentUow.SaveChangesAsync(cancellationToken);
}
- catch (Exception e)
+ catch (Exception)
{
await currentUow.RollbackAsync(cancellationToken);
throw;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/ValidationAttributeHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/ValidationAttributeHelper.cs
index cd87c55ea4..d2d8a0bf14 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/ValidationAttributeHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Validation/ValidationAttributeHelper.cs
@@ -30,7 +30,7 @@ public static class ValidationAttributeHelper
var errorMessageString = ValidationAttributeErrorMessageStringProperty.GetValue(validationAttribute) as string;
validationAttribute.ErrorMessage = errorMessageString;
}
- catch (Exception e)
+ catch (Exception)
{
// ignored
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Versioning/HttpContextRequestedApiVersion.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Versioning/HttpContextRequestedApiVersion.cs
index b634799fb1..e530cfd9e1 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Versioning/HttpContextRequestedApiVersion.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Versioning/HttpContextRequestedApiVersion.cs
@@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
using Volo.Abp.ApiVersioning;
namespace Volo.Abp.AspNetCore.Mvc.Versioning;
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ViewFeatures/AbpValidationHtmlAttributeProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ViewFeatures/AbpValidationHtmlAttributeProvider.cs
index a1da0f8ff1..654b2b1783 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ViewFeatures/AbpValidationHtmlAttributeProvider.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ViewFeatures/AbpValidationHtmlAttributeProvider.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.DataAnnotations;
diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs
index 7f77992ce3..00d2d33a9d 100644
--- a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs
+++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs
@@ -1,10 +1,8 @@
using System;
-using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.Security.Claims;
@@ -34,17 +32,6 @@ public class AbpAuthenticationHubFilter : IHubFilter
}
}
- public virtual async Task OnDisconnectedAsync(HubLifetimeContext context, Exception? exception, Func next)
- {
- var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService();
- var claimsPrincipal = context.Context.User;
- await HandleDynamicClaimsPrincipalAsync(claimsPrincipal, context.ServiceProvider, context.Context, true);
- using (currentPrincipalAccessor.Change(claimsPrincipal!))
- {
- await next(context, exception);
- }
- }
-
protected virtual async Task HandleDynamicClaimsPrincipalAsync(ClaimsPrincipal? claimsPrincipal, IServiceProvider serviceProvider, HubCallerContext hubCallerContext, bool skipCheckDynamicClaimsInterval)
{
if (claimsPrincipal?.Identity != null &&
diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/HubConfigList.cs b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/HubConfigList.cs
index 158a97d8c4..0f2a606038 100644
--- a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/HubConfigList.cs
+++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/HubConfigList.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Linq;
namespace Volo.Abp.AspNetCore.SignalR;
diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/DynamicProxying/AspNetCoreTestProxyHttpClientFactory.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/DynamicProxying/AspNetCoreTestProxyHttpClientFactory.cs
index 93099a12bc..6235f46ed6 100644
--- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/DynamicProxying/AspNetCoreTestProxyHttpClientFactory.cs
+++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/DynamicProxying/AspNetCoreTestProxyHttpClientFactory.cs
@@ -1,7 +1,5 @@
using System.Net.Http;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.Http.Client;
-using Volo.Abp.Http.Client.DynamicProxying;
using Volo.Abp.Http.Client.Proxying;
namespace Volo.Abp.AspNetCore.TestBase.DynamicProxying;
diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Internal/ResponseContentTypeHelper.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Internal/ResponseContentTypeHelper.cs
index 1389365715..a4a6dc5033 100644
--- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Internal/ResponseContentTypeHelper.cs
+++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Internal/ResponseContentTypeHelper.cs
@@ -1,5 +1,4 @@
using System;
-using System.Net.Mime;
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.Net.Http.Headers;
diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs
index 1f6e3c17bf..1e361d1587 100644
--- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs
+++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ApplicationInitializationContextExtensions.cs
@@ -1,5 +1,4 @@
-using JetBrains.Annotations;
-using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs
index c0c56053d3..fc010f9846 100644
--- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs
+++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AspNetCoreAuditLogContributor.cs
@@ -8,7 +8,6 @@ using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.AspNetCore.WebClientInfo;
using Volo.Abp.Auditing;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.ExceptionHandling;
namespace Volo.Abp.AspNetCore.Auditing;
diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs
index e144812753..c99ac00fcc 100644
--- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs
+++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs
@@ -82,8 +82,8 @@ public class AbpExceptionHandlingMiddleware : AbpMiddlewareBase, ITransientDepen
httpContext.Response.Clear();
httpContext.Response.StatusCode = (int)statusCodeFinder.GetStatusCode(httpContext, exception);
httpContext.Response.OnStarting(_clearCacheHeadersDelegate, httpContext.Response);
- httpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
- httpContext.Response.Headers.Add("Content-Type", "application/json");
+ httpContext.Response.Headers.Append(AbpHttpConsts.AbpErrorFormat, "true");
+ httpContext.Response.Headers.Append("Content-Type", "application/json");
await httpContext.Response.WriteAsync(
jsonSerializer.Serialize(
diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ServiceProviderAccessorExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ServiceProviderAccessorExtensions.cs
index da7e40dbdc..b549ec9053 100644
--- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ServiceProviderAccessorExtensions.cs
+++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/ServiceProviderAccessorExtensions.cs
@@ -1,5 +1,4 @@
-using JetBrains.Annotations;
-using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs
index 78989e16d2..09dacc7ba2 100644
--- a/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs
+++ b/framework/src/Volo.Abp.Auditing.Contracts/Volo/Abp/Auditing/IMayHaveCreator.cs
@@ -1,5 +1,4 @@
using System;
-using JetBrains.Annotations;
namespace Volo.Abp.Auditing;
diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs
index 7c6fdacc11..91aa5eb318 100644
--- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs
+++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingModule.cs
@@ -1,5 +1,4 @@
using System;
-using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Data;
using Volo.Abp.Json;
diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogActionInfo.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogActionInfo.cs
index f9f2c66cd0..bb155349f4 100644
--- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogActionInfo.cs
+++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogActionInfo.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using Volo.Abp.Data;
namespace Volo.Abp.Auditing;
diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs
index 4f686a6bae..c58c266e3f 100644
--- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs
+++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs
@@ -1,7 +1,6 @@
using System;
using JetBrains.Annotations;
using Volo.Abp.Localization;
-using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
@@ -32,7 +31,6 @@ public interface IPermissionDefinitionContext
/// Throws if there is a group with the name.
/// Name of the group
/// Localized display name of the group
- /// Select a multi-tenancy side
///
PermissionGroupDefinition AddGroup(
[NotNull] string name,
diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs
index f3e8e8cc4d..ae9252632d 100644
--- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs
+++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
namespace Volo.Abp.Authorization.Permissions;
diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs
index 4372046e15..85d771a6ab 100644
--- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs
+++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp.Localization;
-using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Authorization.Permissions;
diff --git a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs
index 5dc31a7d83..21fffcfa3d 100644
--- a/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs
+++ b/framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Authorization.Permissions;
diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs
index 0c94342749..13c7981063 100644
--- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs
+++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/ClientPermissionValueProvider.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Volo.Abp.MultiTenancy;
using System.Linq;
using Volo.Abp.Security.Claims;
diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs
index 2ab98adbb4..3357d8f95c 100644
--- a/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs
+++ b/framework/src/Volo.Abp.Autofac/Autofac/Builder/AbpRegistrationBuilderExtensions.cs
@@ -9,7 +9,6 @@ using Volo.Abp;
using Volo.Abp.Autofac;
using Volo.Abp.Castle.DynamicProxy;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.DynamicProxy;
using Volo.Abp.Modularity;
namespace Autofac.Builder;
diff --git a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs
index 4417a6ef79..8f9b69b6fb 100644
--- a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs
+++ b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumer.cs
@@ -6,10 +6,8 @@ using Azure.Messaging.ServiceBus;
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
-using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.ExceptionHandling;
-using Volo.Abp.Threading;
namespace Volo.Abp.AzureServiceBus;
diff --git a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumerFactory.cs b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumerFactory.cs
index cf92ed7b73..8788edd638 100644
--- a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumerFactory.cs
+++ b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/AzureServiceBusMessageConsumerFactory.cs
@@ -1,5 +1,4 @@
using System;
-using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/IAzureServiceBusMessageConsumerFactory.cs b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/IAzureServiceBusMessageConsumerFactory.cs
index 4d93bcf5c3..bda147cf9c 100644
--- a/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/IAzureServiceBusMessageConsumerFactory.cs
+++ b/framework/src/Volo.Abp.AzureServiceBus/Volo/Abp/AzureServiceBus/IAzureServiceBusMessageConsumerFactory.cs
@@ -1,5 +1,3 @@
-using System.Threading.Tasks;
-
namespace Volo.Abp.AzureServiceBus;
public interface IAzureServiceBusMessageConsumerFactory
diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AsyncBackgroundJob.cs
index aa6cad070a..fae4e553a8 100644
--- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AsyncBackgroundJob.cs
+++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AsyncBackgroundJob.cs
@@ -1,5 +1,4 @@
-using System.Threading;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJob.cs
index b1770942fe..358a74e46a 100644
--- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJob.cs
+++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJob.cs
@@ -1,4 +1,3 @@
-using System.Threading;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs
index 022067d3ed..dc39b1bd0f 100644
--- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs
+++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs
@@ -1,5 +1,4 @@
-using System.Threading;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
namespace Volo.Abp.BackgroundJobs;
diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs
index 8c8c17ca93..140db1e72a 100644
--- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs
+++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs
@@ -1,6 +1,4 @@
-using System.Threading;
-
-namespace Volo.Abp.BackgroundJobs;
+namespace Volo.Abp.BackgroundJobs;
///
/// Defines interface of a background job.
diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs
index ca874cd701..ee747e4611 100644
--- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs
+++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs
@@ -1,5 +1,4 @@
using System;
-using System.Linq;
using Hangfire;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs
index 5c1e883888..67636ae84f 100644
--- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs
+++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
-using Quartz;
namespace Volo.Abp.BackgroundJobs.Quartz;
diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs
index 9947ba64ac..cf88778089 100644
--- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs
+++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs
index 5bfe6aad7c..2577181143 100644
--- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs
+++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs
@@ -1,11 +1,9 @@
using System;
-using System.Threading.Tasks;
using Hangfire;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Hangfire;
using Volo.Abp.Modularity;
-using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundWorkers.Hangfire;
diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs
index 9553bf12fc..43e9b4a95c 100644
--- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs
+++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfirePeriodicBackgroundWorkerAdapter.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Reflection;
+using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
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 ff72cf138c..32f267075a 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
@@ -1,7 +1,6 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using Volo.Abp.Modularity;
using Volo.Abp.Quartz;
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 d017d442e6..8d05ce1239 100644
--- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs
+++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundWorkers;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
index 7544173944..6f5c89a320 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
@@ -4,19 +4,16 @@ using System.Linq;
using System.Threading.Tasks;
using Blazorise;
using Blazorise.DataGrid;
-using JetBrains.Annotations;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
-using Microsoft.Extensions.Options;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.AspNetCore.Components;
using Volo.Abp.Localization;
using Volo.Abp.Authorization;
using Volo.Abp.BlazoriseUI.Components;
-using Volo.Abp.BlazoriseUI.Components.ObjectExtending;
using Volo.Abp.ObjectExtending.Modularity;
using Volo.Abp.ObjectExtending;
using Volo.Abp.AspNetCore.Components.Web.Extensibility.EntityActions;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs b/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs
index 7f02b02b85..ec2f9e13ca 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/BreadcrumbItem.cs
@@ -1,6 +1,4 @@
-using Blazorise;
-
-namespace Volo.Abp.BlazoriseUI;
+namespace Volo.Abp.BlazoriseUI;
public class BreadcrumbItem
{
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor
index aa0ad21bac..29010dded6 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor
@@ -1,7 +1,6 @@
@typeparam TItem
@using Blazorise.DataGrid;
@using Volo.Abp.Data
-@using Volo.Abp.BlazoriseUI.Components.ObjectExtending
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor.cs
index 9a39b7a02d..f71d4cb283 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor.cs
@@ -1,14 +1,5 @@
-using Microsoft.AspNetCore.Components;
-using Microsoft.Extensions.Localization;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Blazorise;
-using Volo.Abp.AspNetCore.Components.Web;
+using System;
using Volo.Abp.Data;
-using Volo.Abp.ObjectExtending;
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/EnumHelper.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/EnumHelper.cs
index b1858da261..a3d26fd317 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/EnumHelper.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/EnumHelper.cs
@@ -1,9 +1,5 @@
using Microsoft.Extensions.Localization;
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using Volo.Abp.Localization;
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor
index e43426a7ef..f97b8bac0b 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor
@@ -1,6 +1,5 @@
@typeparam TEntityType
@typeparam TResourceType
-@using Volo.Abp.ObjectExtending
@using Volo.Abp.Data
@{
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor.cs
index 4890e2c369..27f69f3ba4 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionProperties.razor.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionPropertyComponentBase.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionPropertyComponentBase.cs
index ec09d57c9a..1329fc8981 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionPropertyComponentBase.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/ExtensionPropertyComponentBase.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
using System.Linq;
using Blazorise;
using Blazorise.Utilities;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs
index dcb301c3b7..d50d98dfc3 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs
@@ -1,22 +1,11 @@
using Microsoft.AspNetCore.Components;
-using Microsoft.Extensions.Localization;
-using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
-using System.Globalization;
using System.Linq;
-using System.Net.Http;
-using System.Net.Http.Headers;
using System.Text.Json;
using System.Threading.Tasks;
-using Blazorise;
-using Volo.Abp.AspNetCore.Components.Web;
using Volo.Abp.AspNetCore.Components.Web.Extensibility;
using Volo.Abp.Data;
-using Volo.Abp.Http;
-using Volo.Abp.Http.Client;
-using Volo.Abp.MultiTenancy;
-using Volo.Abp.ObjectExtending;
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor.cs
index d7ec33be91..0dedaf3486 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor.cs
@@ -1,13 +1,6 @@
-using Microsoft.AspNetCore.Components;
-using Microsoft.Extensions.Localization;
-using System;
+using Microsoft.Extensions.Localization;
using System.Collections.Generic;
-using System.Linq;
-using Blazorise;
-using Volo.Abp.AspNetCore.Components.Web;
using Volo.Abp.Data;
-using Volo.Abp.Localization;
-using Volo.Abp.ObjectExtending;
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor
index 5d3f1f26af..03be9f438a 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor
@@ -1,6 +1,5 @@
@typeparam TEntity
@typeparam TResourceType
-@using Volo.Abp.BlazoriseUI
@using Volo.Abp.Localization
@inherits ExtensionPropertyComponentBase
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor.cs
index 038283850c..48d072f927 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor.cs
@@ -1,14 +1,5 @@
-using Microsoft.AspNetCore.Components;
-using Microsoft.Extensions.Localization;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Blazorise;
-using Volo.Abp.AspNetCore.Components.Web;
+using System;
using Volo.Abp.Data;
-using Volo.Abp.ObjectExtending;
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs
index 1bedfea916..03ce35b87a 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Blazorise;
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiNotificationAlert.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/UiNotificationAlert.razor
index 23f5e79786..02b776e24a 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Components/UiNotificationAlert.razor
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiNotificationAlert.razor
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.BlazoriseUI/ObjectExtensionPropertyInfoBlazorExtensions.cs b/framework/src/Volo.Abp.BlazoriseUI/ObjectExtensionPropertyInfoBlazorExtensions.cs
index c951571983..c30603414f 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/ObjectExtensionPropertyInfoBlazorExtensions.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/ObjectExtensionPropertyInfoBlazorExtensions.cs
@@ -1,9 +1,6 @@
using System;
-using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace Volo.Abp.ObjectExtending;
diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunTemporaryCredentialsCacheItem.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunTemporaryCredentialsCacheItem.cs
index d6e76f602b..1ec74be746 100644
--- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunTemporaryCredentialsCacheItem.cs
+++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunTemporaryCredentialsCacheItem.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Text;
-using Volo.Abp.Caching;
namespace Volo.Abp.BlobStoring.Aliyun;
diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs
index 2cdcdeb665..c46467cf95 100644
--- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs
+++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs
@@ -5,8 +5,6 @@ using Aliyun.Acs.Core.Profile;
using Aliyun.OSS;
using Microsoft.Extensions.Caching.Distributed;
using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Security.Encryption;
diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs
index 2bb97fc0c1..50da869a3e 100644
--- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs
+++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/AbpBlobStoringFileSystemModule.cs
@@ -1,5 +1,4 @@
-using System;
-using Volo.Abp.Modularity;
+using Volo.Abp.Modularity;
namespace Volo.Abp.BlobStoring.FileSystem;
diff --git a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobNamingNormalizer.cs b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobNamingNormalizer.cs
index d0f63e4310..7450c73212 100644
--- a/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobNamingNormalizer.cs
+++ b/framework/src/Volo.Abp.BlobStoring.FileSystem/Volo/Abp/BlobStoring/FileSystem/FileSystemBlobNamingNormalizer.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Globalization;
+using System.Globalization;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
diff --git a/framework/src/Volo.Abp.BlobStoring.Google/FodyWeavers.xml b/framework/src/Volo.Abp.BlobStoring.Google/FodyWeavers.xml
new file mode 100644
index 0000000000..00e1d9a1c1
--- /dev/null
+++ b/framework/src/Volo.Abp.BlobStoring.Google/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.BlobStoring.Google/FodyWeavers.xsd b/framework/src/Volo.Abp.BlobStoring.Google/FodyWeavers.xsd
new file mode 100644
index 0000000000..3f3946e282
--- /dev/null
+++ b/framework/src/Volo.Abp.BlobStoring.Google/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerExtensions.cs b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerExtensions.cs
index 0bc57ddc35..06de7b829c 100644
--- a/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerExtensions.cs
+++ b/framework/src/Volo.Abp.BlobStoring/Volo/Abp/BlobStoring/BlobContainerExtensions.cs
@@ -1,5 +1,4 @@
using System.IO;
-using System.Linq;
using System.Threading;
using System.Threading.Tasks;
diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs
index 840a77fb28..854df6afe5 100644
--- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs
+++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using StackExchange.Redis;
namespace Volo.Abp.Caching.StackExchangeRedis;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs
index ec2074434a..8695c0c418 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Auth/AuthService.cs
@@ -2,12 +2,9 @@
using System.IO;
using System.Net.Http;
using System.Text;
-using System.Text.Json;
-using System.Threading;
using System.Threading.Tasks;
using IdentityModel;
using Microsoft.Extensions.Logging;
-using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs
index d8d930f9c8..20b9c03627 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using LibGit2Sharp;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Build;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DotNetProjectDependencyFiller.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DotNetProjectDependencyFiller.cs
index 561f6e96c2..66e3332772 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DotNetProjectDependencyFiller.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DotNetProjectDependencyFiller.cs
@@ -1,8 +1,6 @@
using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Xml.Linq;
-using Microsoft.Extensions.Logging;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Build;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlerBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlerBase.cs
index 792c7590f6..a78011a401 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlerBase.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlerBase.cs
@@ -5,7 +5,6 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
-using System.Text.Json.Nodes;
using Volo.Abp.Bundling;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Minify;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/IScriptBundler.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/IScriptBundler.cs
index 4a92b8ddf4..dae61f5c95 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/IScriptBundler.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/IScriptBundler.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Volo.Abp.Cli.Bundling.Scripts;
+namespace Volo.Abp.Cli.Bundling.Scripts;
public interface IScriptBundler : IBundler
{
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/IStyleBundler.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/IStyleBundler.cs
index 45c318cac4..a03ff62ecf 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/IStyleBundler.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/IStyleBundler.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Volo.Abp.Cli.Bundling.Styles;
+namespace Volo.Abp.Cli.Bundling.Styles;
public interface IStyleBundler : IBundler
{
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
index 3c9aa74910..0a0c46b6a4 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
@@ -3,12 +3,10 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using NuGet.Versioning;
using System;
-using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
-using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Commands;
@@ -16,7 +14,6 @@ using Volo.Abp.Cli.Memory;
using Volo.Abp.Cli.Version;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.IO;
namespace Volo.Abp.Cli;
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 a70c115c73..3ea145eb7f 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
@@ -1,7 +1,6 @@
using System;
using System.Diagnostics;
using System.IO;
-using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Cli.Args;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs
index 22846185ac..ddeb822a57 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs
@@ -2,7 +2,6 @@ using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Cli.ServiceProxying;
-using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Commands;
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 c014f52d0e..796a8ff757 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
@@ -1,22 +1,16 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
using System.Linq;
-using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
using StackExchange.Redis;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Bundling;
using Volo.Abp.Cli.Commands.Services;
using Volo.Abp.Cli.LIbs;
using Volo.Abp.Cli.ProjectBuilding;
-using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Events;
-using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectModification;
using Volo.Abp.Cli.Utils;
using Volo.Abp.Cli.Version;
@@ -151,7 +145,7 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien
var redis = await ConnectionMultiplexer.ConnectAsync("127.0.0.1", options => options.ConnectTimeout = 3000);
isConnected = redis.IsConnected;
}
- catch (Exception e)
+ catch (Exception)
{
// ignored
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs
index 6b607d4454..dabc6b6862 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs
@@ -81,7 +81,7 @@ public abstract class ProjectCreationCommandBase
if (version != null)
{
- Logger.LogInformation("Version: " + version);
+ Logger.LogInformation($"Version: {version}");
}
var preview = commandLineArgs.Options.ContainsKey(Options.Preview.Long);
@@ -110,25 +110,25 @@ public abstract class ProjectCreationCommandBase
var databaseProvider = GetDatabaseProvider(commandLineArgs);
if (databaseProvider != DatabaseProvider.NotSpecified)
{
- Logger.LogInformation("Database provider: " + databaseProvider);
+ Logger.LogInformation($"Database provider: {databaseProvider}");
}
var connectionString = GetConnectionString(commandLineArgs);
if (connectionString != null)
{
- Logger.LogInformation("Connection string: " + connectionString);
+ Logger.LogInformation($"Connection string: {connectionString}");
}
var databaseManagementSystem = GetDatabaseManagementSystem(commandLineArgs);
if (databaseManagementSystem != DatabaseManagementSystem.NotSpecified)
{
- Logger.LogInformation("DBMS: " + databaseManagementSystem);
+ Logger.LogInformation($"DBMS: {databaseManagementSystem}");
}
var uiFramework = GetUiFramework(commandLineArgs, template);
if (uiFramework != UiFramework.NotSpecified)
{
- Logger.LogInformation("UI Framework: " + uiFramework);
+ Logger.LogInformation($"UI Framework: {uiFramework}");
}
var publicWebSite = uiFramework != UiFramework.None && commandLineArgs.Options.ContainsKey(Options.PublicWebSite.Long);
@@ -140,25 +140,25 @@ public abstract class ProjectCreationCommandBase
var mobileApp = GetMobilePreference(commandLineArgs, template);
if (mobileApp != MobileApp.None)
{
- Logger.LogInformation("Mobile App: " + mobileApp);
+ Logger.LogInformation($"Mobile App: {mobileApp}");
}
var gitHubAbpLocalRepositoryPath = commandLineArgs.Options.GetOrNull(Options.GitHubAbpLocalRepositoryPath.Long);
if (gitHubAbpLocalRepositoryPath != null)
{
- Logger.LogInformation("GitHub Abp Local Repository Path: " + gitHubAbpLocalRepositoryPath);
+ Logger.LogInformation($"GitHub Abp Local Repository Path: {gitHubAbpLocalRepositoryPath}");
}
var gitHubVoloLocalRepositoryPath = commandLineArgs.Options.GetOrNull(Options.GitHubVoloLocalRepositoryPath.Long);
if (gitHubVoloLocalRepositoryPath != null)
{
- Logger.LogInformation("GitHub Volo Local Repository Path: " + gitHubVoloLocalRepositoryPath);
+ Logger.LogInformation($"GitHub Volo Local Repository Path: {gitHubVoloLocalRepositoryPath}");
}
var templateSource = commandLineArgs.Options.GetOrNull(Options.TemplateSource.Short, Options.TemplateSource.Long);
if (templateSource != null)
{
- Logger.LogInformation("Template Source: " + templateSource);
+ Logger.LogInformation($"Template Source: {templateSource}");
}
var createSolutionFolder = GetCreateSolutionFolderPreference(commandLineArgs);
@@ -216,7 +216,7 @@ public abstract class ProjectCreationCommandBase
IO.DirectoryHelper.CreateIfNotExists(outputFolder);
- Logger.LogInformation("Output folder: " + outputFolder);
+ Logger.LogInformation($"Output folder: {outputFolder}");
if (connectionString == null &&
databaseManagementSystem != DatabaseManagementSystem.NotSpecified &&
@@ -309,10 +309,7 @@ public abstract class ProjectCreationCommandBase
bool isTiered,
CommandLineArgs commandLineArgs)
{
-
-#if DEBUG
- return;
-#endif
+#if !DEBUG
if (AppTemplateBase.IsAppTemplate(template))
{
var isCommercial = template == AppProTemplate.TemplateName;
@@ -322,6 +319,7 @@ public abstract class ProjectCreationCommandBase
{
OpenMicroserviceDocumentPage();
}
+#endif
}
protected UiFramework FindMicroserviceSolutionUiFramework(string outputFolderRoot)
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs
index 046727d259..b008dfedf6 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs
@@ -2,7 +2,6 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Cli.ServiceProxying;
-using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Commands;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs
index cbeb6ee9d4..4dbbb6fe01 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/DotnetEfToolManager.cs
@@ -20,12 +20,10 @@ public class DotnetEfToolManager : ISingletonDependency
public async Task BeSureInstalledAsync()
{
- if (IsDotNetEfToolInstalled())
+ if (!IsDotNetEfToolInstalled())
{
- return;
- }
-
- InstallDotnetEfTool();
+ InstallDotnetEfTool();
+ }
}
private bool IsDotNetEfToolInstalled()
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs
index 502b5328b0..7355ab1a74 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
+using System.IO;
using System.Threading.Tasks;
using ICSharpCode.SharpZipLib.Core;
using ICSharpCode.SharpZipLib.Zip;
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 f742397503..d8a3b6d154 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
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Net;
using System.Net.Http;
using System.Net.NetworkInformation;
using System.Text;
@@ -12,7 +11,6 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json.Linq;
-using NuGet.Versioning;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Commands.Services;
@@ -21,8 +19,6 @@ using Volo.Abp.Cli.Version;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
-using Volo.Abp.Json;
-using Volo.Abp.Threading;
namespace Volo.Abp.Cli.Commands;
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 bf059e5e56..2418d0ad1d 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
@@ -412,7 +412,7 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
{
jObject = JObject.Parse(json);
}
- catch (Exception e)
+ catch (Exception)
{
return null;
}
@@ -490,7 +490,7 @@ public class TranslateCommand : IConsoleCommand, ITransientDependency
var jsonString = File.ReadAllText(jsonFile);
_ = JsonLocalizationDictionaryBuilder.BuildFromJsonString(jsonString);
}
- catch (Exception e)
+ catch (Exception)
{
Logger.LogError($"Invalid json file: {jsonFile}");
hasInvalidJsonFile = true;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/ConfigReader.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/ConfigReader.cs
index 6a27e7d063..784e229911 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/ConfigReader.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/ConfigReader.cs
@@ -1,9 +1,6 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
+using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;
-using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Configuration;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/IConfigReader.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/IConfigReader.cs
index db2927741e..dce756fc3f 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/IConfigReader.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/IConfigReader.cs
@@ -1,6 +1,4 @@
-using System.Threading.Tasks;
-
-namespace Volo.Abp.Cli.Configuration;
+namespace Volo.Abp.Cli.Configuration;
public interface IConfigReader
{
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs
index 3edb04c383..dcdd670b68 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs
@@ -6,12 +6,8 @@ using System.Threading.Tasks;
using Microsoft.Extensions.FileSystemGlobbing;
using Microsoft.Extensions.FileSystemGlobbing.Abstractions;
using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
-using Newtonsoft.Json;
-using NuGet.Versioning;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.Json;
namespace Volo.Abp.Cli.LIbs;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
index 46a401839f..ffd0dfdde2 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs
@@ -1,13 +1,6 @@
using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Net;
-using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
-using Polly;
-using Polly.Extensions.Http;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
index c0bc8a097a..7ae34bef1c 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
@@ -6,11 +6,8 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
-using System.Reflection;
using System.Text;
-using System.Text.Json;
using System.Text.RegularExpressions;
-using System.Threading;
using System.Threading.Tasks;
using NuGet.Versioning;
using Volo.Abp.Cli.GitHub;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs
index 5f504bd407..136ca5579d 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs
@@ -5,7 +5,6 @@ using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
-using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs
index 641740bce0..822a40ea6f 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/MobileApp.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Text;
namespace Volo.Abp.Cli.ProjectBuilding.Building;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NpmPackageProjectBuildPipelineBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NpmPackageProjectBuildPipelineBuilder.cs
index 5b088a5765..d9f851dcad 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NpmPackageProjectBuildPipelineBuilder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NpmPackageProjectBuildPipelineBuilder.cs
@@ -1,5 +1,4 @@
using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
-using Volo.Abp.Cli.ProjectBuilding.Templates;
namespace Volo.Abp.Cli.ProjectBuilding.Building;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NugetPackageProjectBuildPipelineBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NugetPackageProjectBuildPipelineBuilder.cs
index 9e9b50f8fe..71c6556cd4 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NugetPackageProjectBuildPipelineBuilder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/NugetPackageProjectBuildPipelineBuilder.cs
@@ -1,5 +1,4 @@
using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
-using Volo.Abp.Cli.ProjectBuilding.Templates;
namespace Volo.Abp.Cli.ProjectBuilding.Building;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppModuleDatabaseManagementSystemChangeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppModuleDatabaseManagementSystemChangeStep.cs
index 362fc14713..fd60e7e6bb 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppModuleDatabaseManagementSystemChangeStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppModuleDatabaseManagementSystemChangeStep.cs
@@ -1,7 +1,6 @@
using System;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
-using Volo.Abp.Cli.ProjectBuilding.Templates.App;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppNoLayersMigrateDatabaseChangeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppNoLayersMigrateDatabaseChangeStep.cs
index ef1a89e6fd..e84138c0ef 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppNoLayersMigrateDatabaseChangeStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/AppNoLayersMigrateDatabaseChangeStep.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Linq;
+using System.Linq;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs
index 0f50a443e7..9838814c89 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ConnectionStringChangeStep.cs
@@ -1,10 +1,5 @@
using System;
-using System.Collections.Generic;
-using System.IO;
using System.Linq;
-using System.Text;
-using System.Text.RegularExpressions;
-using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
using Volo.Abp.Text;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/DatabaseManagementSystemChangeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/DatabaseManagementSystemChangeStep.cs
index 56a77c4929..daf8a854f4 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/DatabaseManagementSystemChangeStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/DatabaseManagementSystemChangeStep.cs
@@ -1,7 +1,6 @@
using System;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
-using Volo.Abp.Cli.ProjectBuilding.Templates.App;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs
index 0130c6e950..5e0bd242e0 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Xml;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectRenameStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectRenameStep.cs
index 4284fa95bb..a109d21f7a 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectRenameStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectRenameStep.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Linq;
+using System.Linq;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs
index 3edbd32e25..3866d2c33f 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs
@@ -1,10 +1,8 @@
using System;
using System.Collections.Generic;
-using System.IO;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
-using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveRootFolderStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveRootFolderStep.cs
index dbecf8a0d2..a412e1a621 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveRootFolderStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveRootFolderStep.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Volo.Abp.Cli.ProjectBuilding.Files;
+using System.Linq;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameHelper.cs
index e3cf437053..582dd84bbf 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameHelper.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameHelper.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameProjectInTyeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameProjectInTyeStep.cs
index bf91e377c0..6076ccf402 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameProjectInTyeStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RenameProjectInTyeStep.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Linq;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs
index 6c2da47c53..fb48492a18 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text.RegularExpressions;
+using System.Collections.Generic;
using System.Xml;
using Volo.Abp.Cli.ProjectBuilding.Files;
using Volo.Abp.Cli.Utils;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceConfigureAwaitPropsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceConfigureAwaitPropsStep.cs
index 928b2ea1f8..fb2a8f0c4b 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceConfigureAwaitPropsStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceConfigureAwaitPropsStep.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text.RegularExpressions;
+using System.Collections.Generic;
using System.Xml;
using Volo.Abp.Cli.ProjectBuilding.Files;
using Volo.Abp.Cli.Utils;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs
index c70fed4625..0ebf002a6f 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
-using Volo.Abp.Cli.ProjectBuilding.Templates;
namespace Volo.Abp.Cli.ProjectBuilding.Building;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs
index bfdb5ed300..4f654a6639 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs
@@ -1,7 +1,6 @@
using System;
using NuGet.Versioning;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
-using Volo.Abp.Cli.ProjectBuilding.Templates;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs
index c634f09fa8..6d3c261799 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntry.cs
@@ -97,7 +97,9 @@ public class FileEntry
if (Bytes[0] == 0x2b && Bytes[1] == 0x2f && Bytes[2] == 0x76)
{
+#pragma warning disable SYSLIB0001 // The UTF-7 encoding is insecure
return Encoding.UTF7;
+#pragma warning restore SYSLIB0001 // The UTF-7 encoding is insecure
}
if (Bytes[0] == 0xef && Bytes[1] == 0xbb && Bytes[2] == 0xbf)
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiTemplateBase.cs
index c17d661efa..1d8606f124 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiTemplateBase.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiTemplateBase.cs
@@ -1,7 +1,6 @@
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Building;
-using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
namespace Volo.Abp.Cli.ProjectBuilding.Templates.Maui;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RandomizeAuthServerPassPhraseStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RandomizeAuthServerPassPhraseStep.cs
index b29998438a..f86a97d930 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RandomizeAuthServerPassPhraseStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RandomizeAuthServerPassPhraseStep.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Building;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs
index c867469a22..44de2f69ad 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs
@@ -1,10 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.ProjectBuilding.Building;
-using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Templates;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AddModuleInfoOutput.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AddModuleInfoOutput.cs
index 599ecf5cc4..323c89d9d6 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AddModuleInfoOutput.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AddModuleInfoOutput.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace Volo.Abp.Cli.ProjectModification;
+namespace Volo.Abp.Cli.ProjectModification;
public class AddModuleInfoOutput
{
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs
index 2b47b2b66c..ec817d825f 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
index fa47442514..019feb93d0 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs
@@ -54,7 +54,7 @@ public class NpmPackagesUpdater : ITransientDependency
{
var fileList = _packageJsonFileFinder.Find(rootDirectory);
- if (!fileList.Any())
+ if (fileList.Count == 0)
{
return;
}
@@ -95,8 +95,8 @@ public class NpmPackagesUpdater : ITransientDependency
if (!IsAngularProject(fileDirectory))
{
- Thread.Sleep(1000);
- RunInstallLibsAsync(fileDirectory);
+ await Task.Delay(1000);
+ await RunInstallLibsAsync(fileDirectory);
}
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NugetPackageToLocalReferenceConverter.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NugetPackageToLocalReferenceConverter.cs
index bb9360b550..988b9aacc1 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NugetPackageToLocalReferenceConverter.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NugetPackageToLocalReferenceConverter.cs
@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using System.Text;
using System.Threading.Tasks;
using System.Xml;
using Microsoft.Extensions.Logging;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackagePreviewSwitcher.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackagePreviewSwitcher.cs
index 2b9a595742..7cf1d0da7a 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackagePreviewSwitcher.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackagePreviewSwitcher.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -193,7 +192,7 @@ public class PackagePreviewSwitcher : ITransientDependency
var folder = Path.GetDirectoryName(project);
_packageSourceManager.Add(FindSolutionFolder(project) ?? folder, "ABP Nightly",
- "https://www.myget.org/F/abp-nightly/api/v3/index.json");
+ "https://www.myget.org/F/abp-nightly/api/v3/index.json", "Volo.*");
await _nugetPackagesVersionUpdater.UpdateSolutionAsync(
project,
@@ -213,7 +212,8 @@ public class PackagePreviewSwitcher : ITransientDependency
var solutionAngularFolder = GetSolutionAngularFolder(solutionFolder);
_packageSourceManager.Add(solutionFolder, "ABP Nightly",
- "https://www.myget.org/F/abp-nightly/api/v3/index.json");
+ "https://www.myget.org/F/abp-nightly/api/v3/index.json",
+ "Volo.*");
if (solutionPath != null)
{
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackageSourceManager.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackageSourceManager.cs
index 90364781d3..b325abab22 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackageSourceManager.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/PackageSourceManager.cs
@@ -1,5 +1,6 @@
-using System;
+using System;
using System.IO;
+using System.Linq;
using System.Xml;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
@@ -16,7 +17,7 @@ public class PackageSourceManager : ITransientDependency
Logger = NullLogger.Instance;
}
- public void Add(string solutionFolder, string sourceKey, string sourceValue)
+ public void Add(string solutionFolder, string sourceKey, string sourceValue, params string[] packageMappingPatterns)
{
var nugetConfigPath = GetNugetConfigPath(solutionFolder);
@@ -61,6 +62,11 @@ public class PackageSourceManager : ITransientDependency
sourceNodes?[0]?.AppendChild(newNode);
+ if (packageMappingPatterns.Any())
+ {
+ ConfigurePackageSourceMappings(doc, sourceKey, packageMappingPatterns);
+ }
+
File.WriteAllText(nugetConfigPath, doc.OuterXml);
}
catch
@@ -69,6 +75,31 @@ public class PackageSourceManager : ITransientDependency
}
}
+ protected virtual void ConfigurePackageSourceMappings(XmlDocument doc, string sourceKey, string[] packageMappingPatterns)
+ {
+ var packageMappingNodes = doc.SelectNodes("/configuration/packageSourceMapping");
+
+ if (packageMappingNodes == null)
+ {
+ // If there is no packageSourceMapping node, leave it as it is.
+ Logger.LogWarning($" node not found in 'NuGet.Config' file. Skipping adding patterns for '{sourceKey}' source.");
+ return;
+ }
+ var packageSourceNode = doc.CreateElement("packageSource");
+ var sourceAttr = doc.CreateAttribute("key");
+ sourceAttr.Value = sourceKey;
+ packageSourceNode.Attributes.Append(sourceAttr);
+ packageMappingNodes[0]?.AppendChild(packageSourceNode);
+ foreach (var pattern in packageMappingPatterns)
+ {
+ var packageNode = doc.CreateElement("package");
+ var patternAttr = doc.CreateAttribute("pattern");
+ patternAttr.Value = pattern;
+ packageNode.Attributes.Append(patternAttr);
+ packageSourceNode.AppendChild(packageNode);
+ }
+ }
+
public void Remove(string solutionFolder, string sourceKey)
{
var nugetConfigPath = GetNugetConfigPath(solutionFolder);
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFileNameHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFileNameHelper.cs
index fa6bd47697..06f3648d10 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFileNameHelper.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectFileNameHelper.cs
@@ -1,7 +1,5 @@
using System;
-using System.Collections.Generic;
using System.IO;
-using System.Text;
namespace Volo.Abp.Cli.ProjectModification;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs
index d3d2c834ab..c9aade0feb 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNpmPackageAdder.cs
@@ -1,15 +1,10 @@
using System;
-using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Net;
using System.Threading.Tasks;
-using System.Xml;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json.Linq;
-using Volo.Abp.Cli.Args;
-using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Commands.Services;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.LIbs;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs
index 0697c00293..9d9d7e159e 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs
@@ -259,11 +259,11 @@ public class ProjectNugetPackageAdder : ITransientDependency
if (useDotnetCliToInstall)
{
- AddUsingDotnetCli(package, version);
+ await AddUsingDotnetCli(package, version);
}
else
{
- AddToCsprojManuallyAsync(projectFile, package, version);
+ await AddToCsprojManuallyAsync(projectFile, package, version);
}
var moduleFiles = ModuleClassFinder.Find(projectFile, "AbpModule");
@@ -291,7 +291,7 @@ public class ProjectNugetPackageAdder : ITransientDependency
{
await RunBundleForBlazorAsync(projectFile);
}
- catch (Exception e)
+ catch (Exception)
{
Logger.LogWarning("Couldn't run bundle for blazor.");
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
index ed5b40f717..9873a09b58 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs
@@ -15,7 +15,6 @@ using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Commands.Services;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding;
-using Volo.Abp.Cli.ProjectBuilding.Files;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.ProjectModification.Events;
using Volo.Abp.Cli.Utils;
@@ -391,7 +390,7 @@ public class SolutionModuleAdder : ITransientDependency
continue;
}
- RemoveProjectFromSolutionAsync(moduleSolutionFile, projectToRemove);
+ await RemoveProjectFromSolutionAsync(moduleSolutionFile, projectToRemove);
}
}
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ThemePackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ThemePackageAdder.cs
index db5fdecfce..511943b632 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ThemePackageAdder.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ThemePackageAdder.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using NuGet.Versioning;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs
index 3060435928..9f23645fb9 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using NuGet.Versioning;
using System.IO;
using System.Linq;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs
index ac6775a86c..0f2b287d67 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Linq;
namespace Volo.Abp.Cli.Utils;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/StreamHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/StreamHelper.cs
index ebedde8443..8962eda379 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/StreamHelper.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/StreamHelper.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
+using System.IO;
namespace Volo.Abp.Cli.Utils;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs
index 7bfb578a2d..59bc8bfe1d 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System.Collections.Generic;
namespace Volo.Abp.Cli.Version;
diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs
index 2266a0d30c..d5764c1c0e 100644
--- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs
+++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs
@@ -14,7 +14,6 @@ using Volo.Abp.Cli.ProjectModification;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;
using Volo.Abp.Threading;
-using System.Text.Json.Serialization;
namespace Volo.Abp.Cli.Version;
diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationExtensions.cs
index 6e0a14fd94..0a5ab5d5ec 100644
--- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationExtensions.cs
+++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/Configuration/AbpConfigurationExtensions.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Hosting;
namespace Microsoft.Extensions.Configuration;
diff --git a/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs b/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs
index d098a1602b..9b0af42a11 100644
--- a/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs
+++ b/framework/src/Volo.Abp.Core/System/AbpObjectExtensions.cs
@@ -2,7 +2,6 @@
using System.ComponentModel;
using System.Globalization;
using System.Linq;
-using System.Reflection;
using System.Runtime.CompilerServices;
namespace System;
diff --git a/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs b/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs
index bdfd644b28..48f628d438 100644
--- a/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs
+++ b/framework/src/Volo.Abp.Core/System/AbpStringExtensions.cs
@@ -1,5 +1,4 @@
using System.Collections.Generic;
-using System.Globalization;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
diff --git a/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs b/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs
index df66790ca2..0833be8a95 100644
--- a/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs
+++ b/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs
@@ -1,7 +1,6 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq.Expressions;
-using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using JetBrains.Annotations;
diff --git a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj
index edb61d6a21..b1605bddd2 100644
--- a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj
+++ b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj
@@ -33,6 +33,9 @@
+
+
+
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs
index 0356ab450b..7e658efe36 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IInjectPropertiesService.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IInjectPropertiesService.cs
index 76313efaaa..f2e4c59451 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IInjectPropertiesService.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IInjectPropertiesService.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Volo.Abp.DependencyInjection;
public interface IInjectPropertiesService
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs
index 5286c4672e..a6ccf8f42c 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IObjectAccessor.cs
@@ -1,5 +1,3 @@
-using JetBrains.Annotations;
-
namespace Volo.Abp.DependencyInjection;
public interface IObjectAccessor
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs
index 612732b370..cd64d18741 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ObjectAccessor.cs
@@ -1,5 +1,3 @@
-using JetBrains.Annotations;
-
namespace Volo.Abp.DependencyInjection;
public class ObjectAccessor : IObjectAccessor
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs
index f4adefd9c3..9839b08429 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/IO/FileHelper.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs
index 7f12dce8bd..9150bccac9 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/Localization/CultureHelper.cs
@@ -1,6 +1,5 @@
using System;
using System.Globalization;
-using System.Linq;
using JetBrains.Annotations;
namespace Volo.Abp.Localization;
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/PlugInSourceExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/PlugInSourceExtensions.cs
index c0a3120e1e..6a0958864e 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/PlugInSourceExtensions.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/PlugIns/PlugInSourceExtensions.cs
@@ -2,7 +2,6 @@
using System.Linq;
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
-using Volo.Abp.Logging;
namespace Volo.Abp.Modularity.PlugIns;
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs
index 9d9398b847..ffe9e50623 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/ObjectHelper.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Concurrent;
-using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs
index 588e138f42..79510024b7 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/ISimpleStateCheckerSerializerContributor.cs
@@ -1,5 +1,4 @@
using System.Text.Json.Nodes;
-using JetBrains.Annotations;
namespace Volo.Abp.SimpleStateChecking;
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs
index 0cdd300050..8ae58d16be 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/SimpleStateChecking/SimpleStateCheckerSerializer.cs
@@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Text.Json.Nodes;
-using JetBrains.Annotations;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.SimpleStateChecking;
diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Threading/SemaphoreSlimExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/SemaphoreSlimExtensions.cs
index 51066da8a5..57151c24a0 100644
--- a/framework/src/Volo.Abp.Core/Volo/Abp/Threading/SemaphoreSlimExtensions.cs
+++ b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/SemaphoreSlimExtensions.cs
@@ -1,4 +1,5 @@
using System;
+using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
@@ -6,19 +7,22 @@ namespace Volo.Abp.Threading;
public static class SemaphoreSlimExtensions
{
- public async static Task LockAsync(this SemaphoreSlim semaphoreSlim)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public async static ValueTask LockAsync(this SemaphoreSlim semaphoreSlim)
{
await semaphoreSlim.WaitAsync();
return GetDispose(semaphoreSlim);
}
- public async static Task LockAsync(this SemaphoreSlim semaphoreSlim, CancellationToken cancellationToken)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public async static ValueTask LockAsync(this SemaphoreSlim semaphoreSlim, CancellationToken cancellationToken)
{
await semaphoreSlim.WaitAsync(cancellationToken);
return GetDispose(semaphoreSlim);
}
- public async static Task LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public async static ValueTask LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout)
{
if (await semaphoreSlim.WaitAsync(millisecondsTimeout))
{
@@ -28,7 +32,8 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
- public async static Task LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout, CancellationToken cancellationToken)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public async static ValueTask LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout, CancellationToken cancellationToken)
{
if (await semaphoreSlim.WaitAsync(millisecondsTimeout, cancellationToken))
{
@@ -38,7 +43,8 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
- public async static Task LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public async static ValueTask LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout)
{
if (await semaphoreSlim.WaitAsync(timeout))
{
@@ -48,7 +54,8 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
- public async static Task LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout, CancellationToken cancellationToken)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public async static ValueTask LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout, CancellationToken cancellationToken)
{
if (await semaphoreSlim.WaitAsync(timeout, cancellationToken))
{
@@ -58,18 +65,21 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim)
{
semaphoreSlim.Wait();
return GetDispose(semaphoreSlim);
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, CancellationToken cancellationToken)
{
semaphoreSlim.Wait(cancellationToken);
return GetDispose(semaphoreSlim);
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout)
{
if (semaphoreSlim.Wait(millisecondsTimeout))
@@ -80,6 +90,7 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout, CancellationToken cancellationToken)
{
if (semaphoreSlim.Wait(millisecondsTimeout, cancellationToken))
@@ -90,6 +101,7 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, TimeSpan timeout)
{
if (semaphoreSlim.Wait(timeout))
@@ -100,6 +112,7 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, TimeSpan timeout, CancellationToken cancellationToken)
{
if (semaphoreSlim.Wait(timeout, cancellationToken))
@@ -110,6 +123,7 @@ public static class SemaphoreSlimExtensions
throw new TimeoutException();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static IDisposable GetDispose(this SemaphoreSlim semaphoreSlim)
{
return new DisposeAction(static (semaphoreSlim) =>
diff --git a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs
index 06c8c0c4bc..d741ab49ec 100644
--- a/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs
+++ b/framework/src/Volo.Abp.Dapr/Volo/Abp/Dapr/AbpDaprModule.cs
@@ -1,12 +1,10 @@
using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Http.Client;
using Volo.Abp.Json;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
-using Volo.Abp.RemoteServices;
namespace Volo.Abp.Dapr;
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs
index b573d7d958..c516c34270 100644
--- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDataModule.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Options;
using Volo.Abp.EventBus.Abstractions;
using Volo.Abp.Modularity;
using Volo.Abp.ObjectExtending;
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfoDictionary.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfoDictionary.cs
index 06334be6db..13b9c1765d 100644
--- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfoDictionary.cs
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/AbpDatabaseInfoDictionary.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using JetBrains.Annotations;
namespace Volo.Abp.Data;
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/ConcurrencyStampExtensions.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/ConcurrencyStampExtensions.cs
index 84232a7a88..dfaf3a3e21 100644
--- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/ConcurrencyStampExtensions.cs
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/ConcurrencyStampExtensions.cs
@@ -1,7 +1,5 @@
using System;
-using System.Collections.Generic;
using Volo.Abp.Domain.Entities;
-using JetBrains.Annotations;
namespace Volo.Abp.Data;
diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs
index 83586e8e70..25f403c27f 100644
--- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs
+++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DataSeeder.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Linq;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs
index bef608a6ff..737bcb3c2f 100644
--- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs
+++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs
@@ -1,6 +1,5 @@
using System.Collections.Generic;
using Volo.Abp.Application.Services;
-using Volo.Abp.Aspects;
using Volo.Abp.Auditing;
using Volo.Abp.Authorization;
using Volo.Abp.Domain;
diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs
index b3a2af6663..18ba9fccb9 100644
--- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs
+++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/AbstractKeyCrudAppService.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
diff --git a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IAutoEntityDistributedEventSelectorList.cs b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IAutoEntityDistributedEventSelectorList.cs
index a20c3136b0..3b70b3a231 100644
--- a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IAutoEntityDistributedEventSelectorList.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IAutoEntityDistributedEventSelectorList.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
namespace Volo.Abp.Domain.Entities.Events.Distributed;
diff --git a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs
index 67406fd0d4..5047299427 100644
--- a/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain.Shared/Volo/Abp/Domain/Entities/Events/Distributed/IEntityToEtoMapper.cs
@@ -1,6 +1,4 @@
-using JetBrains.Annotations;
-
-namespace Volo.Abp.Domain.Entities.Events.Distributed;
+namespace Volo.Abp.Domain.Entities.Events.Distributed;
public interface IEntityToEtoMapper
{
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs
index ee580332a8..d0842de7ee 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs
@@ -20,23 +20,23 @@ public interface IAbpCommonDbContextRegistrationOptionsBuilder
///
/// Registers default repositories for all the entities in this DbContext.
- /// Default repositories will use given .
+ /// Default repositories will use given .
///
/// DbContext type that will be used by default repositories
///
/// Registers repositories only for aggregate root entities by default.
- /// Set to true to include all entities.
+ /// Set to true to include all entities.
///
IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(bool includeAllEntities = false);
///
/// Registers default repositories for all the entities in this DbContext.
- /// Default repositories will use given .
+ /// Default repositories will use given .
///
/// DbContext type that will be used by default repositories
///
/// Registers repositories only for aggregate root entities by default.
- /// Set to true to include all entities.
+ /// Set to true to include all entities.
///
IAbpCommonDbContextRegistrationOptionsBuilder AddDefaultRepositories(Type defaultRepositoryDbContextType, bool includeAllEntities = false);
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/ChangeTracking/ChangeTrackingHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/ChangeTracking/ChangeTrackingHelper.cs
index d2235afd22..0f886c4ddc 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/ChangeTracking/ChangeTrackingHelper.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/ChangeTracking/ChangeTrackingHelper.cs
@@ -1,7 +1,6 @@
using System.Linq;
using System.Reflection;
using JetBrains.Annotations;
-using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.Domain.ChangeTracking;
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs
index f38c21d2fe..79b73b4619 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs
@@ -4,7 +4,7 @@ using Volo.Abp.Auditing;
namespace Volo.Abp.Domain.Entities.Auditing;
///
-/// This class can be used to simplify implementing for aggregate roots.
+/// This class can be used to simplify implementing for aggregate roots.
///
/// Type of the user
[Serializable]
@@ -19,7 +19,7 @@ public abstract class AuditedAggregateRootWithUser : AuditedAggregateRoot
}
///
-/// This class can be used to simplify implementing for aggregate roots.
+/// This class can be used to simplify implementing for aggregate roots.
///
/// Type of the primary key of the entity
/// Type of the user
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs
index 4407a93de8..fb0272360b 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedAggregateRootWithUser.cs
@@ -4,7 +4,7 @@ using Volo.Abp.Auditing;
namespace Volo.Abp.Domain.Entities.Auditing;
///
-/// This class can be used to simplify implementing for aggregate roots.
+/// This class can be used to simplify implementing for aggregate roots.
///
/// Type of the user
[Serializable]
@@ -15,7 +15,7 @@ public abstract class CreationAuditedAggregateRootWithUser : CreationAudi
}
///
-/// This class can be used to simplify implementing for aggregate roots.
+/// This class can be used to simplify implementing for aggregate roots.
///
/// Type of the primary key of the entity
/// Type of the user
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs
index 635bb06183..870547d255 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/CreationAuditedEntityWithUser.cs
@@ -15,7 +15,7 @@ public abstract class CreationAuditedEntityWithUser : CreationAuditedEnti
}
///
-/// This class can be used to simplify implementing .
+/// This class can be used to simplify implementing .
///
/// Type of the primary key of the entity
/// Type of the user
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs
index 834b106d95..8bcbd61306 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs
@@ -22,7 +22,7 @@ public abstract class FullAuditedEntityWithUser : FullAuditedEntity, IFul
}
///
-/// Implements to be a base class for full-audited entities.
+/// Implements to be a base class for full-audited entities.
///
/// Type of the primary key of the entity
/// Type of the user
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs
index d55ef92439..81d2993c4f 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Caching/EntityCacheServiceCollectionExtensions.cs
@@ -1,5 +1,4 @@
using System;
-using JetBrains.Annotations;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs
index 5640c427c2..d8e222e42b 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Events/Distributed/EntitySynchronizer.cs
@@ -1,5 +1,4 @@
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Volo.Abp.Auditing;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs
index acc0dcd59a..dd9cfbd554 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Values/ValueObject.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Collections.Generic;
namespace Volo.Abp.Domain.Values;
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
index ad380d7128..523ca071a1 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
@@ -13,7 +13,9 @@ namespace Volo.Abp.Emailing;
typeof(AbpVirtualFileSystemModule),
typeof(AbpBackgroundJobsAbstractionsModule),
typeof(AbpLocalizationModule),
+#pragma warning disable CS0618 // Type or member is obsolete
typeof(AbpTextTemplatingModule)
+#pragma warning restore CS0618 // Type or member is obsolete
)]
public class AbpEmailingModule : AbpModule
{
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJob.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJob.cs
index ac12ddcead..abf762a4c4 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJob.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJob.cs
@@ -1,5 +1,4 @@
using System;
-using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJobArgs.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJobArgs.cs
index 0b30a9bfd1..1dd605b37b 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJobArgs.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJobArgs.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using Volo.Abp.Data;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Emailing;
diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/NullEmailSender.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/NullEmailSender.cs
index f73783ebeb..9a8df880bd 100644
--- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/NullEmailSender.cs
+++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/NullEmailSender.cs
@@ -1,7 +1,6 @@
using System.Net.Mail;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs
index a77821b9df..67de4ac754 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/ConnectionStrings/MySqlConnectionStringChecker.cs
@@ -32,7 +32,7 @@ public class MySqlConnectionStringChecker : IConnectionStringChecker, ITransient
return result;
}
- catch (Exception e)
+ catch (Exception)
{
return result;
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs
index 1bbc300ec8..c838b0c9aa 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleDevartConnectionStringChecker.cs
@@ -28,7 +28,7 @@ public class OracleDevartConnectionStringChecker : IConnectionStringChecker, ITr
return result;
}
- catch (Exception e)
+ catch (Exception)
{
return result;
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/Oracle/Devart/AbpEntityFrameworkCoreOracleDevartModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/Oracle/Devart/AbpEntityFrameworkCoreOracleDevartModule.cs
index 317f664b04..1a00cfdaa3 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/Oracle/Devart/AbpEntityFrameworkCoreOracleDevartModule.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/Oracle/Devart/AbpEntityFrameworkCoreOracleDevartModule.cs
@@ -1,5 +1,4 @@
-using Microsoft.Extensions.DependencyInjection;
-using Volo.Abp.EntityFrameworkCore.GlobalFilters;
+using Volo.Abp.EntityFrameworkCore.GlobalFilters;
using Volo.Abp.Guids;
using Volo.Abp.Modularity;
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs
index 1176a9ce64..7ecc70d986 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/ConnectionStrings/OracleConnectionStringChecker.cs
@@ -28,7 +28,7 @@ public class OracleConnectionStringChecker : IConnectionStringChecker, ITransien
return result;
}
- catch (Exception e)
+ catch (Exception)
{
return result;
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/Oracle/AbpEntityFrameworkCoreOracleModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/Oracle/AbpEntityFrameworkCoreOracleModule.cs
index 76ffe32f7a..e7104380e4 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/Oracle/AbpEntityFrameworkCoreOracleModule.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/Oracle/AbpEntityFrameworkCoreOracleModule.cs
@@ -1,5 +1,4 @@
-using Microsoft.Extensions.DependencyInjection;
-using Volo.Abp.EntityFrameworkCore.GlobalFilters;
+using Volo.Abp.EntityFrameworkCore.GlobalFilters;
using Volo.Abp.Guids;
using Volo.Abp.Modularity;
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs
index 56e47aa2d4..f6c8392da5 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/ConnectionStrings/NpgsqlConnectionStringChecker.cs
@@ -32,7 +32,7 @@ public class NpgsqlConnectionStringChecker : IConnectionStringChecker, ITransien
return result;
}
- catch (Exception e)
+ catch (Exception)
{
return result;
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs
index 668aec3d96..6b84e69024 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqlServerConnectionStringChecker.cs
@@ -32,7 +32,7 @@ public class SqlServerConnectionStringChecker : IConnectionStringChecker, ITrans
return result;
}
- catch (Exception e)
+ catch (Exception)
{
return result;
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs
index 48b428ce8f..4697f7e0b2 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/ConnectionStrings/SqliteConnectionStringChecker.cs
@@ -24,7 +24,7 @@ public class SqliteConnectionStringChecker : IConnectionStringChecker, ITransien
return result;
}
- catch (Exception e)
+ catch (Exception)
{
return result;
}
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreModelBuilderExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreModelBuilderExtensions.cs
index 6cb3f8b508..055c0651cb 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreModelBuilderExtensions.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreModelBuilderExtensions.cs
@@ -3,7 +3,6 @@ using System.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
using Volo.Abp;
-using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.GlobalFilters;
using Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs
index 55e88b72e7..8c203bd52a 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs
@@ -5,7 +5,6 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.DependencyInjection;
-using Volo.Abp.MultiTenancy;
namespace Microsoft.Extensions.DependencyInjection;
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs
index 799397218c..0ed9a2e199 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs
@@ -9,8 +9,6 @@ using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.Storage;
-using Microsoft.Extensions.Logging;
-using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.DependencyInjection;
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs
index cfaee16e6a..5dd2b3a571 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs
index 949d1ebc1a..1ab174cc16 100644
--- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs
+++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs
@@ -6,7 +6,6 @@ using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
-using Microsoft.Extensions.Options;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.DependencyInjection;
diff --git a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs
index 8e45a8887f..13de378855 100644
--- a/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs
+++ b/framework/src/Volo.Abp.EventBus.Azure/Volo/Abp/EventBus/Azure/AzureDistributedEventBus.cs
@@ -4,7 +4,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
-using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs
index dbaedf7779..1c8012f529 100644
--- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs
+++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs
@@ -3,7 +3,6 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using RabbitMQ.Client;
diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs
index 17d497f883..72a20748c6 100644
--- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs
+++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/DistributedEventBusBase.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.EventBus.Local;
@@ -224,7 +223,7 @@ public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventB
{
await LocalEventBus.PublishAsync(distributedEvent);
}
- catch (Exception _)
+ catch (Exception)
{
// ignored
}
@@ -236,7 +235,7 @@ public abstract class DistributedEventBusBase : EventBusBase, IDistributedEventB
{
await LocalEventBus.PublishAsync(distributedEvent);
}
- catch (Exception _)
+ catch (Exception)
{
// ignored
}
diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs
index 2c1c01fbed..1831158e9d 100644
--- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs
+++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/IocEventHandlerFactory.cs
@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
-using Volo.Abp.DependencyInjection;
namespace Volo.Abp.EventBus;
diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs
index 66e145563d..04eef96e6c 100644
--- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs
+++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace Volo.Abp.Features;
diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs
index 2ddba43eec..9d4dfda7a7 100644
--- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs
+++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs
index 4a2a1e716c..6c095b3f77 100644
--- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs
+++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Aspects;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Guids/Volo/Abp/Guids/SequentialGuidType.cs b/framework/src/Volo.Abp.Guids/Volo/Abp/Guids/SequentialGuidType.cs
index f9c4095ac2..5e0609fd7f 100644
--- a/framework/src/Volo.Abp.Guids/Volo/Abp/Guids/SequentialGuidType.cs
+++ b/framework/src/Volo.Abp.Guids/Volo/Abp/Guids/SequentialGuidType.cs
@@ -1,4 +1,6 @@
-namespace Volo.Abp.Guids;
+using System;
+
+namespace Volo.Abp.Guids;
///
/// Describes the type of a sequential GUID value.
@@ -12,7 +14,7 @@ public enum SequentialGuidType
SequentialAsString,
///
- /// The GUID should be sequential when formatted using the method.
+ /// The GUID should be sequential when formatted using the method.
/// Used by Oracle.
///
SequentialAsBinary,
diff --git a/framework/src/Volo.Abp.Http.Client.Web/Volo/Abp/Http/Client/Web/Conventions/AbpHttpClientProxyServiceConvention.cs b/framework/src/Volo.Abp.Http.Client.Web/Volo/Abp/Http/Client/Web/Conventions/AbpHttpClientProxyServiceConvention.cs
index a7a2aad343..004669eeb2 100644
--- a/framework/src/Volo.Abp.Http.Client.Web/Volo/Abp/Http/Client/Web/Conventions/AbpHttpClientProxyServiceConvention.cs
+++ b/framework/src/Volo.Abp.Http.Client.Web/Volo/Abp/Http/Client/Web/Conventions/AbpHttpClientProxyServiceConvention.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Mvc;
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs
index c0dfeabbd1..0d211e72c1 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientModule.cs
@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Castle;
using Volo.Abp.Data;
using Volo.Abp.EventBus;
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs
index 1f50fc8bd2..6743ab5174 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/AbpHttpClientOptions.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using Volo.Abp.Http.Client.DynamicProxying;
using Volo.Abp.Http.Client.Proxying;
namespace Volo.Abp.Http.Client;
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs
index e8da52f3b1..b8d2b763df 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using System.Threading.Tasks;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.FileProviders.Physical;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs
index 1cab08f73d..a4306050a4 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs
@@ -7,7 +7,6 @@ using System.Net.Http.Headers;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Primitives;
using Volo.Abp.Content;
diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs
index d7755a1ac9..c24404918e 100644
--- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs
+++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs
@@ -7,7 +7,6 @@ using System.Net.Http.Headers;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Content;
diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs
index f0cf747ac1..7c4d67fccc 100644
--- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs
+++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ApplicationApiDescriptionModel.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerApiDescriptionModel.cs
index 97919e54ba..40188c4b93 100644
--- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerApiDescriptionModel.cs
+++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerApiDescriptionModel.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using JetBrains.Annotations;
namespace Volo.Abp.Http.Modeling;
diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerInterfaceApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerInterfaceApiDescriptionModel.cs
index a95e2ac547..b88573314a 100644
--- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerInterfaceApiDescriptionModel.cs
+++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ControllerInterfaceApiDescriptionModel.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Linq;
using System.Reflection;
namespace Volo.Abp.Http.Modeling;
diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs
index 00d762f826..a7ef661997 100644
--- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs
+++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/Modeling/ModuleApiDescriptionModel.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using JetBrains.Annotations;
namespace Volo.Abp.Http.Modeling;
diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs
index 1d44b72caf..c8fd93c220 100644
--- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs
+++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/ProxyScriptManager.cs
@@ -7,7 +7,6 @@ using Volo.Abp.Http.Modeling;
using Volo.Abp.Http.ProxyScripting.Configuration;
using Volo.Abp.Http.ProxyScripting.Generators;
using Volo.Abp.Json;
-using Volo.Abp.Minify.Scripts;
namespace Volo.Abp.Http.ProxyScripting;
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
index 1970d7aba3..5fd1925935 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
@@ -1,6 +1,5 @@
using System;
using System.Linq;
-using Volo.Abp.MultiTenancy;
namespace Volo.Abp.IdentityModel;
diff --git a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressor.cs b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressor.cs
index 6d80cd1c6b..8741722675 100644
--- a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressor.cs
+++ b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressor.cs
@@ -1,7 +1,6 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using JetBrains.Annotations;
namespace Volo.Abp.Imaging;
diff --git a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressorContributor.cs b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressorContributor.cs
index 7fc9362c77..e98ba44bc9 100644
--- a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressorContributor.cs
+++ b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageCompressorContributor.cs
@@ -1,7 +1,6 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using JetBrains.Annotations;
namespace Volo.Abp.Imaging;
diff --git a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizer.cs b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizer.cs
index 2c9c2878ed..758f62e2b8 100644
--- a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizer.cs
+++ b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizer.cs
@@ -1,7 +1,6 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using JetBrains.Annotations;
namespace Volo.Abp.Imaging;
diff --git a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizerContributor.cs b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizerContributor.cs
index a6603ea136..19f4eb24c2 100644
--- a/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizerContributor.cs
+++ b/framework/src/Volo.Abp.Imaging.Abstractions/Volo/Abp/Imaging/IImageResizerContributor.cs
@@ -1,7 +1,6 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using JetBrains.Annotations;
namespace Volo.Abp.Imaging;
diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs
index 83988c8c26..9a2f53b988 100644
--- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs
+++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageCompressorContributor.cs
@@ -2,10 +2,8 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Microsoft.Extensions.Options;
using SixLabors.ImageSharp;
-using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Formats.Png;
diff --git a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs
index df93258f72..6e17ddc9a8 100644
--- a/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs
+++ b/framework/src/Volo.Abp.Imaging.ImageSharp/Volo/Abp/Imaging/ImageSharpImageResizerContributor.cs
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageCompressorContributor.cs b/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageCompressorContributor.cs
index 3aba7f5000..50fa84596a 100644
--- a/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageCompressorContributor.cs
+++ b/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageCompressorContributor.cs
@@ -1,9 +1,7 @@
-using System;
-using System.IO;
+using System.IO;
using System.Threading;
using System.Threading.Tasks;
using ImageMagick;
-using JetBrains.Annotations;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
diff --git a/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageResizerContributor.cs b/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageResizerContributor.cs
index b71230e8bb..3938bc6eba 100644
--- a/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageResizerContributor.cs
+++ b/framework/src/Volo.Abp.Imaging.MagickNet/Volo/Abp/Imaging/MagickImageResizerContributor.cs
@@ -3,7 +3,6 @@ using System.IO;
using System.Threading;
using System.Threading.Tasks;
using ImageMagick;
-using JetBrains.Annotations;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
diff --git a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializer.cs b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializer.cs
index 2a21f5fbd7..0450064f2f 100644
--- a/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializer.cs
+++ b/framework/src/Volo.Abp.Json.Newtonsoft/Volo/Abp/Json/Newtonsoft/AbpNewtonsoftJsonSerializer.cs
@@ -45,6 +45,7 @@ public class AbpNewtonsoftJsonSerializer : IJsonSerializer, ITransientDependency
indented
}, _ =>
{
+#pragma warning disable CS0618 // Type or member is obsolete
var settings = new JsonSerializerSettings
{
Binder = Options.Value.JsonSerializerSettings.Binder,
@@ -80,6 +81,7 @@ public class AbpNewtonsoftJsonSerializer : IJsonSerializer, ITransientDependency
TypeNameHandling = Options.Value.JsonSerializerSettings.TypeNameHandling,
TypeNameAssemblyFormatHandling = Options.Value.JsonSerializerSettings.TypeNameAssemblyFormatHandling
};
+#pragma warning restore CS0618 // Type or member is obsolete
if (!camelCase)
{
diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs
index 7288be03c0..6fd96fb58a 100644
--- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs
+++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/AbpSystemTextJsonSerializerOptions.cs
@@ -1,5 +1,4 @@
using System.Text.Json;
-using Volo.Abp.Collections;
namespace Volo.Abp.Json.SystemTextJson;
diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs
index d940a80ea0..c3b5b7d9d6 100644
--- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs
+++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/Modifiers/AbpDateTimeConverterModifier.cs
@@ -1,7 +1,6 @@
using System;
using System.Linq;
using System.Text.Json.Serialization.Metadata;
-using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Json.SystemTextJson.JsonConverters;
using Volo.Abp.Reflection;
using Volo.Abp.Timing;
diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs
index 5a2ba38189..5852148cae 100644
--- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs
+++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Concurrent;
-using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Confluent.Kafka;
diff --git a/framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/AbpLdapAbstractionsModule.cs b/framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/AbpLdapAbstractionsModule.cs
index 1cba84f1c8..12a8a04e6a 100644
--- a/framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/AbpLdapAbstractionsModule.cs
+++ b/framework/src/Volo.Abp.Ldap.Abstractions/Volo/Abp/Ldap/AbpLdapAbstractionsModule.cs
@@ -1,7 +1,6 @@
using Volo.Abp.Ldap.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
-using Volo.Abp.Settings;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Ldap;
diff --git a/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/FixedLocalizableString.cs b/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/FixedLocalizableString.cs
index 07eaa4a357..773884a938 100644
--- a/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/FixedLocalizableString.cs
+++ b/framework/src/Volo.Abp.Localization.Abstractions/Volo/Abp/Localization/FixedLocalizableString.cs
@@ -8,6 +8,7 @@ public class FixedLocalizableString : ILocalizableString
public FixedLocalizableString(string value)
{
+ Check.NotNull(value, nameof(value));
Value = value;
}
diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs
index 02b9cc8fac..4a3f68626a 100644
--- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs
+++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizableStringSerializer.cs
@@ -35,7 +35,12 @@ public class LocalizableStringSerializer : ILocalizableStringSerializer, ITransi
public virtual ILocalizableString Deserialize(string value)
{
- if (value.IsNullOrEmpty() ||
+ if (value == null)
+ {
+ throw new AbpException($"{nameof(value)} can not be null!");
+ }
+
+ if (value.IsNullOrWhiteSpace() ||
value.Length < 3 ||
value[1] != ':')
{
diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs
index d87169ea31..b25bd9ec6e 100644
--- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs
+++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Localization;
diff --git a/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/AbpMauiClientModule.cs b/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/AbpMauiClientModule.cs
index 6dbfb6cb75..046f1cc642 100644
--- a/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/AbpMauiClientModule.cs
+++ b/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/AbpMauiClientModule.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Client;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/MauiCachedApplicationConfigurationClient.cs b/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/MauiCachedApplicationConfigurationClient.cs
index 44445acf69..2f4f8768e4 100644
--- a/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/MauiCachedApplicationConfigurationClient.cs
+++ b/framework/src/Volo.Abp.Maui.Client/Volo/Abp/Maui/Client/MauiCachedApplicationConfigurationClient.cs
@@ -3,7 +3,6 @@ using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies;
using Volo.Abp.AspNetCore.Mvc.Client;
using Volo.Abp.DependencyInjection;
-using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs
index 186edd7d33..058508a30a 100644
--- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs
+++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs
index 725b92621e..e7c7b93d2a 100644
--- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs
+++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories.MemoryDb;
diff --git a/framework/src/Volo.Abp.Minify/Volo/Abp/Minify/IMinifier.cs b/framework/src/Volo.Abp.Minify/Volo/Abp/Minify/IMinifier.cs
index 4c4f1881da..a7d2ddba4f 100644
--- a/framework/src/Volo.Abp.Minify/Volo/Abp/Minify/IMinifier.cs
+++ b/framework/src/Volo.Abp.Minify/Volo/Abp/Minify/IMinifier.cs
@@ -1,5 +1,3 @@
-using JetBrains.Annotations;
-
namespace Volo.Abp.Minify;
public interface IMinifier
diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbContextOptions.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbContextOptions.cs
index 36ff84a64f..0f23f98d02 100644
--- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbContextOptions.cs
+++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbContextOptions.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Threading.Tasks;
using MongoDB.Driver;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs
index f77335f285..bae06df072 100644
--- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs
+++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/ConnectionStrings/MongoDBConnectionStringChecker.cs
@@ -22,7 +22,7 @@ public class MongoDBConnectionStringChecker : IConnectionStringChecker, ITransie
DatabaseExists = true
});
}
- catch (Exception e)
+ catch (Exception)
{
return Task.FromResult(new AbpConnectionStringCheckResult());
}
diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
index 04d4e0bfa5..1585bc1332 100644
--- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
+++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
@@ -242,7 +242,7 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext
{
session.StartTransaction();
}
- catch (NotSupportedException e)
+ catch (NotSupportedException)
{
Logger.LogWarning(TransactionsNotSupportedWarningMessage);
diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/BasicTenantInfo.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/BasicTenantInfo.cs
index a11a892a11..49b4e59005 100644
--- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/BasicTenantInfo.cs
+++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/BasicTenantInfo.cs
@@ -1,5 +1,4 @@
using System;
-using JetBrains.Annotations;
namespace Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenant.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenant.cs
index 09ab641562..bf99780baa 100644
--- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenant.cs
+++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ICurrentTenant.cs
@@ -1,5 +1,4 @@
using System;
-using JetBrains.Annotations;
namespace Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenantUrlProvider.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenantUrlProvider.cs
index 7e3bb097b7..630e00ec72 100644
--- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenantUrlProvider.cs
+++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/IMultiTenantUrlProvider.cs
@@ -1,5 +1,4 @@
using System.Threading.Tasks;
-using JetBrains.Annotations;
namespace Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs
index e703fd487b..d0fca61adb 100644
--- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs
+++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveContext.cs
@@ -1,4 +1,3 @@
-using JetBrains.Annotations;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveResultAccessor.cs b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveResultAccessor.cs
index 707b59493b..85e09d6b96 100644
--- a/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveResultAccessor.cs
+++ b/framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/ITenantResolveResultAccessor.cs
@@ -1,6 +1,4 @@
-using JetBrains.Annotations;
-
-namespace Volo.Abp.MultiTenancy;
+namespace Volo.Abp.MultiTenancy;
public interface ITenantResolveResultAccessor
{
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs
index 595aaa0f10..a6a95b9957 100644
--- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs
@@ -1,5 +1,4 @@
using System.Threading;
-using Volo.Abp.DependencyInjection;
namespace Volo.Abp.MultiTenancy;
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs
index 6ed12a3159..1d58b94a9f 100644
--- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs
@@ -118,27 +118,25 @@ public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolv
return connString!;
}
- //Fallback to tenant's default connection string if available
- if (!tenantDefaultConnectionString.IsNullOrWhiteSpace())
- {
- return tenantDefaultConnectionString!;
- }
-
- //Try to find the specific connection string for given name
- var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName);
- if (!connStringInOptions.IsNullOrWhiteSpace())
+ //Fallback to the mapped database for the specific connection string
+ var database = Options.Databases.GetMappedDatabaseOrNull(connectionStringName);
+ if (database != null && database.IsUsedByTenants)
{
- return connStringInOptions!;
+ connString = tenant.ConnectionStrings?.GetOrDefault(database.DatabaseName);
+ if (!connString.IsNullOrWhiteSpace())
+ {
+ //Found for the tenant
+ return connString!;
+ }
}
- //Fallback to the global default connection string
- var defaultConnectionString = Options.ConnectionStrings.Default;
- if (!defaultConnectionString.IsNullOrWhiteSpace())
+ //Fallback to tenant's default connection string if available
+ if (!tenantDefaultConnectionString.IsNullOrWhiteSpace())
{
- return defaultConnectionString!;
+ return tenantDefaultConnectionString!;
}
- throw new AbpException("No connection string defined!");
+ return base.Resolve(connectionStringName);
}
protected virtual async Task FindTenantConfigurationAsync(Guid tenantId)
diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantUrlProvider.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantUrlProvider.cs
index 47ac6105bb..95339b726b 100644
--- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantUrlProvider.cs
+++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantUrlProvider.cs
@@ -1,6 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/IBasicObjectExtensionPropertyInfo.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/IBasicObjectExtensionPropertyInfo.cs
index 86f34354a8..743bad6015 100644
--- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/IBasicObjectExtensionPropertyInfo.cs
+++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/IBasicObjectExtensionPropertyInfo.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp.Localization;
-using Volo.Abp.ObjectExtending.Modularity;
namespace Volo.Abp.ObjectExtending;
diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/EntityExtensionConfiguration.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/EntityExtensionConfiguration.cs
index 83429e36ce..a377acce5a 100644
--- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/EntityExtensionConfiguration.cs
+++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/EntityExtensionConfiguration.cs
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using JetBrains.Annotations;
-using Volo.Abp.Localization;
namespace Volo.Abp.ObjectExtending.Modularity;
diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/ExtensionPropertyLookupConfiguration.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/ExtensionPropertyLookupConfiguration.cs
index bd1cb61b20..0bc9a45544 100644
--- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/ExtensionPropertyLookupConfiguration.cs
+++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/Modularity/ExtensionPropertyLookupConfiguration.cs
@@ -1,6 +1,4 @@
-using Microsoft.Extensions.Logging;
-
-namespace Volo.Abp.ObjectExtending.Modularity;
+namespace Volo.Abp.ObjectExtending.Modularity;
public class ExtensionPropertyLookupConfiguration
{
diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs
index c7ebe2f961..13bd8228fc 100644
--- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs
+++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionInfo.cs
@@ -4,7 +4,6 @@ using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using JetBrains.Annotations;
-using Volo.Abp.Data;
namespace Volo.Abp.ObjectExtending;
diff --git a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionManager.cs b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionManager.cs
index 1d7ad836b4..f9ff680bb6 100644
--- a/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionManager.cs
+++ b/framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ObjectExtensionManager.cs
@@ -3,7 +3,6 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using JetBrains.Annotations;
-using Volo.Abp.Data;
namespace Volo.Abp.ObjectExtending;
diff --git a/framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/IObjectMapper.cs b/framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/IObjectMapper.cs
index 9801de4543..c0f235c848 100644
--- a/framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/IObjectMapper.cs
+++ b/framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/IObjectMapper.cs
@@ -11,7 +11,7 @@ public interface IObjectMapper
IAutoObjectMappingProvider AutoObjectMappingProvider { get; }
///
- /// Converts an object to another. Creates a new object of .
+ /// Converts an object to another. Creates a new object of .
///
/// Type of the destination object
/// Type of the source object
@@ -25,7 +25,7 @@ public interface IObjectMapper
/// Destination type
/// Source object
/// Destination object
- /// Returns the same object after mapping operation
+ /// Returns the same object after mapping operation
TDestination Map(TSource source, TDestination destination);
}
@@ -46,7 +46,7 @@ public interface IObjectMapper : IObjectMapper
public interface IObjectMapper
{
///
- /// Converts an object to another. Creates a new object of .
+ /// Converts an object to another. Creates a new object of .
///
/// Source object
TDestination Map(TSource source);
@@ -56,6 +56,6 @@ public interface IObjectMapper
///
/// Source object
/// Destination object
- /// Returns the same object after mapping operation
+ /// Returns the same object after mapping operation
TDestination Map(TSource source, TDestination destination);
}
diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs
index 1d94122008..6f361f7670 100644
--- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs
+++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs
@@ -6,7 +6,6 @@ using RabbitMQ.Client.Events;
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
-using RabbitMQ.Client.Exceptions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Threading;
diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/RemoteDynamicClaimsPrincipalContributorCacheBase.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/RemoteDynamicClaimsPrincipalContributorCacheBase.cs
index fce2324812..331a3c7bdf 100644
--- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/RemoteDynamicClaimsPrincipalContributorCacheBase.cs
+++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/RemoteDynamicClaimsPrincipalContributorCacheBase.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/IStringEncryptionService.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/IStringEncryptionService.cs
index fdf077d483..3cd2d43dca 100644
--- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/IStringEncryptionService.cs
+++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/IStringEncryptionService.cs
@@ -1,6 +1,4 @@
-using JetBrains.Annotations;
-
-namespace Volo.Abp.Security.Encryption;
+namespace Volo.Abp.Security.Encryption;
///
/// Can be used to simply encrypt/decrypt texts.
diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/StringEncryptionService.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/StringEncryptionService.cs
index e1e7e94b7a..c2fb7d8c9e 100644
--- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/StringEncryptionService.cs
+++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Encryption/StringEncryptionService.cs
@@ -26,38 +26,21 @@ public class StringEncryptionService : IStringEncryptionService, ITransientDepen
return null;
}
- if (passPhrase == null)
- {
- passPhrase = Options.DefaultPassPhrase;
- }
-
- if (salt == null)
- {
- salt = Options.DefaultSalt;
- }
+ passPhrase ??= Options.DefaultPassPhrase;
+ salt ??= Options.DefaultSalt;
var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
- using (var password = new Rfc2898DeriveBytes(passPhrase, salt))
- {
- var keyBytes = password.GetBytes(Options.Keysize / 8);
- using (var symmetricKey = Aes.Create())
- {
- symmetricKey.Mode = CipherMode.CBC;
- using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, Options.InitVectorBytes))
- {
- using (var memoryStream = new MemoryStream())
- {
- using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
- {
- cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
- cryptoStream.FlushFinalBlock();
- var cipherTextBytes = memoryStream.ToArray();
- return Convert.ToBase64String(cipherTextBytes);
- }
- }
- }
- }
- }
+ using var password = new Rfc2898DeriveBytes(passPhrase, salt);
+ var keyBytes = password.GetBytes(Options.Keysize / 8);
+ using var symmetricKey = Aes.Create();
+ symmetricKey.Mode = CipherMode.CBC;
+ using var encryptor = symmetricKey.CreateEncryptor(keyBytes, Options.InitVectorBytes);
+ using var memoryStream = new MemoryStream();
+ using var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
+ cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
+ cryptoStream.FlushFinalBlock();
+ var cipherTextBytes = memoryStream.ToArray();
+ return Convert.ToBase64String(cipherTextBytes);
}
public virtual string? Decrypt(string? cipherText, string? passPhrase = null, byte[]? salt = null)
@@ -67,53 +50,36 @@ public class StringEncryptionService : IStringEncryptionService, ITransientDepen
return null;
}
- if (passPhrase == null)
- {
- passPhrase = Options.DefaultPassPhrase;
- }
-
- if (salt == null)
- {
- salt = Options.DefaultSalt;
- }
+ passPhrase ??= Options.DefaultPassPhrase;
+ salt ??= Options.DefaultSalt;
var cipherTextBytes = Convert.FromBase64String(cipherText);
- using (var password = new Rfc2898DeriveBytes(passPhrase, salt))
+ using var password = new Rfc2898DeriveBytes(passPhrase, salt);
+ var keyBytes = password.GetBytes(Options.Keysize / 8);
+ using var symmetricKey = Aes.Create();
+ symmetricKey.Mode = CipherMode.CBC;
+ using var decryptor = symmetricKey.CreateDecryptor(keyBytes, Options.InitVectorBytes);
+ using var memoryStream = new MemoryStream(cipherTextBytes);
+ using var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
+ var plainTextBytes = new byte[cipherTextBytes.Length];
+ var totalReadCount = 0;
+ while (totalReadCount < cipherTextBytes.Length)
{
- var keyBytes = password.GetBytes(Options.Keysize / 8);
- using (var symmetricKey = Aes.Create())
+ var buffer = new byte[cipherTextBytes.Length];
+ var readCount = cryptoStream.Read(buffer, 0, buffer.Length);
+ if (readCount == 0)
{
- symmetricKey.Mode = CipherMode.CBC;
- using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, Options.InitVectorBytes))
- {
- using (var memoryStream = new MemoryStream(cipherTextBytes))
- {
- using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
- {
- var plainTextBytes = new byte[cipherTextBytes.Length];
- var totalReadCount = 0;
- while (totalReadCount < cipherTextBytes.Length)
- {
- var buffer = new byte[cipherTextBytes.Length];
- var readCount = cryptoStream.Read(buffer, 0, buffer.Length);
- if (readCount == 0)
- {
- break;
- }
-
- for (var i = 0; i < readCount; i++)
- {
- plainTextBytes[i + totalReadCount] = buffer[i];
- }
-
- totalReadCount += readCount;
- }
+ break;
+ }
- return Encoding.UTF8.GetString(plainTextBytes, 0, totalReadCount);
- }
- }
- }
+ for (var i = 0; i < readCount; i++)
+ {
+ plainTextBytes[i + totalReadCount] = buffer[i];
}
+
+ totalReadCount += readCount;
}
+
+ return Encoding.UTF8.GetString(plainTextBytes, 0, totalReadCount);
}
}
diff --git a/framework/src/Volo.Abp.Serialization/Volo/Abp/Serialization/DefaultObjectSerializer.cs b/framework/src/Volo.Abp.Serialization/Volo/Abp/Serialization/DefaultObjectSerializer.cs
index 99ec929ca8..da1d647a35 100644
--- a/framework/src/Volo.Abp.Serialization/Volo/Abp/Serialization/DefaultObjectSerializer.cs
+++ b/framework/src/Volo.Abp.Serialization/Volo/Abp/Serialization/DefaultObjectSerializer.cs
@@ -1,6 +1,5 @@
using System;
using System.Text.Json;
-using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs
index a371fc3a9a..da15bb31ab 100644
--- a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs
+++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/TemplateDefinition.cs
@@ -39,8 +39,8 @@ public class TemplateDefinition : IHasNameWithLocalizableDisplayName
///
/// Name of the property
///
- /// Returns the value in the dictionary by given .
- /// Returns null if given is not present in the dictionary.
+ /// Returns the value in the dictionary by given .
+ /// Returns null if given is not present in the dictionary.
///
public object? this[string name] {
get => Properties.GetOrDefault(name);
diff --git a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs
index ab2380c069..7ac381b321 100644
--- a/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs
+++ b/framework/src/Volo.Abp.TextTemplating.Core/Volo/Abp/TextTemplating/VirtualFiles/ILocalizedTemplateContentReader.cs
@@ -1,6 +1,4 @@
-using JetBrains.Annotations;
-
-namespace Volo.Abp.TextTemplating.VirtualFiles;
+namespace Volo.Abp.TextTemplating.VirtualFiles;
public interface ILocalizedTemplateContentReader
{
diff --git a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/EmptyProjectFileSystem.cs b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/EmptyProjectFileSystem.cs
index 8c8d8703dd..c8bebc5d88 100644
--- a/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/EmptyProjectFileSystem.cs
+++ b/framework/src/Volo.Abp.TextTemplating.Razor/Volo/Abp/TextTemplating/Razor/EmptyProjectFileSystem.cs
@@ -12,11 +12,13 @@ internal class EmptyProjectFileSystem : RazorProjectFileSystem
public override IEnumerable EnumerateItems(string basePath)
{
NormalizeAndEnsureValidPath(basePath);
- return Enumerable.Empty();
+ return [];
}
[Obsolete("Use GetItem(string path, string fileKind) instead.")]
+#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member
public override RazorProjectItem GetItem(string path)
+#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member
{
return GetItem(path, fileKind: null);
}
diff --git a/framework/src/Volo.Abp.Timing/Volo/Abp/Timing/AbpTimingModule.cs b/framework/src/Volo.Abp.Timing/Volo/Abp/Timing/AbpTimingModule.cs
index 25caedd025..9af5c00b38 100644
--- a/framework/src/Volo.Abp.Timing/Volo/Abp/Timing/AbpTimingModule.cs
+++ b/framework/src/Volo.Abp.Timing/Volo/Abp/Timing/AbpTimingModule.cs
@@ -1,5 +1,4 @@
using Volo.Abp.Localization;
-using Volo.Abp.Localization.Resources.AbpLocalization;
using Volo.Abp.Modularity;
using Volo.Abp.Settings;
using Volo.Abp.Timing.Localization.Resources.AbpTiming;
diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenu.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenu.cs
index d38279b1cd..f0a384599e 100644
--- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenu.cs
+++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenu.cs
@@ -1,8 +1,5 @@
-using System;
using System.Collections.Generic;
using JetBrains.Annotations;
-using Volo.Abp.Data;
-using Volo.Abp.UI.Navigation;
namespace Volo.Abp.UI.Navigation;
diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs
index 0c42a15c5e..65df0d2181 100644
--- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs
+++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItem.cs
@@ -125,7 +125,7 @@ public class ApplicationMenuItem : IHasMenuItems, IHasSimpleStateCheckers>();
- Items = new ApplicationMenuItemList();
+ Items = new ApplicationMenuItemList();
}
///
diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItemList.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItemList.cs
index d89fde8a7c..f314d6d927 100644
--- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItemList.cs
+++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuItemList.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using Volo.Abp.UI.Navigation;
namespace Volo.Abp.UI.Navigation;
diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/HasMenuItemsExtensions.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/HasMenuItemsExtensions.cs
index d712c8d931..f8adc2ea6b 100644
--- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/HasMenuItemsExtensions.cs
+++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/HasMenuItemsExtensions.cs
@@ -1,7 +1,4 @@
-using JetBrains.Annotations;
-using Volo.Abp.UI.Navigation;
-
-namespace Volo.Abp.UI.Navigation;
+namespace Volo.Abp.UI.Navigation;
public static class HasMenuItemsExtensions
{
diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IHasMenuItems.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IHasMenuItems.cs
index 190e0e56ed..06a71c533f 100644
--- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IHasMenuItems.cs
+++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/IHasMenuItems.cs
@@ -1,5 +1,3 @@
-using Volo.Abp.UI.Navigation;
-
namespace Volo.Abp.UI.Navigation;
public interface IHasMenuItems
diff --git a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs
index bff1abb341..6334ea9918 100644
--- a/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs
+++ b/framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkDefaultOptions.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkDefaultOptions.cs
index 4bb5e791f9..35e59a0cd4 100644
--- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkDefaultOptions.cs
+++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkDefaultOptions.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Data;
+using System.Data;
namespace Volo.Abp.Uow;
diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkOptions.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkOptions.cs
index 56886a3317..394529061f 100644
--- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkOptions.cs
+++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/AbpUnitOfWorkOptions.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Data;
+using System.Data;
namespace Volo.Abp.Uow;
diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IAbpUnitOfWorkOptions.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IAbpUnitOfWorkOptions.cs
index 518d636483..da8abd5619 100644
--- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IAbpUnitOfWorkOptions.cs
+++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IAbpUnitOfWorkOptions.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Data;
+using System.Data;
namespace Volo.Abp.Uow;
diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWorkAccessor.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWorkAccessor.cs
index e2333b5bbc..79e4a70f05 100644
--- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWorkAccessor.cs
+++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/IUnitOfWorkAccessor.cs
@@ -1,5 +1,3 @@
-using JetBrains.Annotations;
-
namespace Volo.Abp.Uow;
public interface IUnitOfWorkAccessor
diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs
index d49d131299..2403405fbd 100644
--- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs
+++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs
@@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
-using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManagerExtensions.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManagerExtensions.cs
index 0ad7bf40e6..2ad5c7b74b 100644
--- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManagerExtensions.cs
+++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkManagerExtensions.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Data;
+using System.Data;
using JetBrains.Annotations;
namespace Volo.Abp.Uow;
diff --git a/framework/test/SimpleConsoleDemo/Program.cs b/framework/test/SimpleConsoleDemo/Program.cs
index c9315c1ac4..1019301e20 100644
--- a/framework/test/SimpleConsoleDemo/Program.cs
+++ b/framework/test/SimpleConsoleDemo/Program.cs
@@ -1,5 +1,4 @@
using System;
-using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
diff --git a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/Program.cs b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/Program.cs
index d2e28ce2c1..156666b42a 100644
--- a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/Program.cs
+++ b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/App/Program.cs
@@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Builder;
-using Volo.Abp.AspNetCore;
using Volo.Abp.AspNetCore.App;
using Volo.Abp.AspNetCore.TestBase;
diff --git a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_WithDomainResolver_Tests.cs b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_WithDomainResolver_Tests.cs
index 02d0288b4b..fe90d5f2fb 100644
--- a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_WithDomainResolver_Tests.cs
+++ b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_WithDomainResolver_Tests.cs
@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Shouldly;
using Volo.Abp.MultiTenancy;
diff --git a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs
index 71ee5f11df..7776b34b13 100644
--- a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs
+++ b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs
@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Microsoft.Net.Http.Headers;
using Shouldly;
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/LocalizationTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/LocalizationTestController.cs
index 84bd26d5cd..f54e9f9625 100644
--- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/LocalizationTestController.cs
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/LocalizationTestController.cs
@@ -1,5 +1,4 @@
using System;
-using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc;
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/Views/LocalizationTest/PersonForm.cshtml b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/Views/LocalizationTest/PersonForm.cshtml
index 31dee8bf83..ea787f61d4 100644
--- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/Views/LocalizationTest/PersonForm.cshtml
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/App/Views/LocalizationTest/PersonForm.cshtml
@@ -1,5 +1,4 @@
@using Microsoft.AspNetCore.Mvc.Localization
-@using Volo.Abp.AspNetCore.App
@inject IViewLocalizer Localizer
@model Volo.Abp.AspNetCore.App.LocalizationTestController.PersonModel
@@ -164,4 +164,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json
index 0ca180a665..d25470b917 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ar.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "تمكين إدارة الإعداد",
"Feature:SettingManagementEnableDescription": "تفعيل إعداد نظام الإدارة في التطبيق.",
"Feature:AllowChangingEmailSettings": "السماح لتغيير إعدادات البريد الإلكتروني.",
- "Feature:AllowChangingEmailSettingsDescription": "السماح لتغيير إعدادات البريد الإلكتروني."
+ "Feature:AllowChangingEmailSettingsDescription": "السماح لتغيير إعدادات البريد الإلكتروني.",
+ "SmtpPasswordPlaceholder": "أدخل قيمة لتحديث كلمة المرور",
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json
index 898fbfe841..2f6711296b 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/cs.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Povolit správu nastavení",
"Feature:SettingManagementEnableDescription": "Povolit systém správy nastavení v aplikaci.",
"Feature:AllowChangingEmailSettings": "Povolit změnu nastavení e-mailu.",
- "Feature:AllowChangingEmailSettingsDescription": "Povolit změnu nastavení e-mailu."
+ "Feature:AllowChangingEmailSettingsDescription": "Povolit změnu nastavení e-mailu.",
+ "SmtpPasswordPlaceholder": "Zadejte hodnotu pro aktualizaci hesla",
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json
index 3653f69a92..a0127f127e 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de-DE.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Einstellungsverwaltung aktivieren",
"Feature:SettingManagementEnableDescription": "Aktivieren Sie das Einstellungsverwaltungssystem in der Anwendung.",
"Feature:AllowChangingEmailSettings": "Änderung der E-Mail-Einstellungen zulassen.",
- "Feature:AllowChangingEmailSettingsDescription": "Änderung der E-Mail-Einstellungen zulassen."
+ "Feature:AllowChangingEmailSettingsDescription": "Änderung der E-Mail-Einstellungen zulassen.",
+ "SmtpPasswordPlaceholder": "Geben Sie einen Wert ein, um das Passwort zu aktualisieren"
}
}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json
index 211100a71f..c9fea92a36 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/de.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Aktivieren Sie die Einstellungsverwaltung",
"Feature:SettingManagementEnableDescription": "Aktivieren Sie das Einstellungsverwaltungssystem in der Anwendung.",
"Feature:AllowChangingEmailSettings": "Erlauben Sie das Ändern der E-Mail-Einstellungen.",
- "Feature:AllowChangingEmailSettingsDescription": "Erlauben Sie das Ändern der E-Mail-Einstellungen."
+ "Feature:AllowChangingEmailSettingsDescription": "Erlauben Sie das Ändern der E-Mail-Einstellungen.",
+ "SmtpPasswordPlaceholder": "Geben Sie einen Wert ein, um das Passwort zu aktualisieren"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json
index 29ec725ae5..95132d1f67 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/el.json
@@ -31,6 +31,7 @@
"Feature:SettingManagementEnable": "Ενεργοποίηση διαχείρισης ρυθμίσεων",
"Feature:SettingManagementEnableDescription": "Ενεργοποίηση συστήματος διαχείρισης ρυθμίσεων στην εφαρμογή.",
"Feature:AllowChangingEmailSettings": "Επιτρέψτε την αλλαγή των ρυθμίσεων email.",
- "Feature:AllowChangingEmailSettingsDescription": "Επιτρέψτε την αλλαγή των ρυθμίσεων email."
+ "Feature:AllowChangingEmailSettingsDescription": "Επιτρέψτε την αλλαγή των ρυθμίσεων email.",
+ "SmtpPasswordPlaceholder": "Εισαγάγετε μια τιμή για ενημέρωση κωδικού πρόσβασης"
}
}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json
index 7c672ee019..e81ce7718b 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/en.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Enable setting management",
"Feature:SettingManagementEnableDescription": "Enable setting management system in the application.",
"Feature:AllowChangingEmailSettings": "Allow changing email settings.",
- "Feature:AllowChangingEmailSettingsDescription": "Allow changing email settings."
+ "Feature:AllowChangingEmailSettingsDescription": "Allow changing email settings.",
+ "SmtpPasswordPlaceholder": "Enter a value to update password"
}
}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json
index 75ed8ac019..660a7998ac 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/es.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Habilitar la gestión de la configuración",
"Feature:SettingManagementEnableDescription": "Habilite el sistema de gestión de la configuración en la aplicación.",
"Feature:AllowChangingEmailSettings": "Permitir cambiar la configuración de correo electrónico.",
- "Feature:AllowChangingEmailSettingsDescription": "Permitir cambiar la configuración de correo electrónico."
+ "Feature:AllowChangingEmailSettingsDescription": "Permitir cambiar la configuración de correo electrónico.",
+ "SmtpPasswordPlaceholder": "Ingrese un valor para actualizar la contraseña"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json
index bedcaceb67..d9f853dd76 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fi.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Ota asetusten hallinta käyttöön",
"Feature:SettingManagementEnableDescription": "Ota asetustenhallintajärjestelmä käyttöön sovelluksessa.",
"Feature:AllowChangingEmailSettings": "Salli sähköpostiasetusten muuttaminen.",
- "Feature:AllowChangingEmailSettingsDescription": "Salli sähköpostiasetusten muuttaminen."
+ "Feature:AllowChangingEmailSettingsDescription": "Salli sähköpostiasetusten muuttaminen.",
+ "SmtpPasswordPlaceholder": "Syötä arvo päivittääksesi salasana"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json
index ec4af0e774..85a8d04f18 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Activer la gestion des paramètres",
"Feature:SettingManagementEnableDescription": "Activer le système de gestion des paramètres dans l'application.",
"Feature:AllowChangingEmailSettings": "Autoriser la modification des paramètres de messagerie.",
- "Feature:AllowChangingEmailSettingsDescription": "Autoriser la modification des paramètres de messagerie."
+ "Feature:AllowChangingEmailSettingsDescription": "Autoriser la modification des paramètres de messagerie.",
+ "SmtpPasswordPlaceholder": "Entrez une valeur pour mettre à jour le mot de passe"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json
index 84ea888203..73e0340584 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hi.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "सेटिंग प्रबंधन सक्षम करें",
"Feature:SettingManagementEnableDescription": "एप्लिकेशन में सेटिंग प्रबंधन प्रणाली सक्षम करें।",
"Feature:AllowChangingEmailSettings": "ईमेल सेटिंग्स बदलने की अनुमति दें।",
- "Feature:AllowChangingEmailSettingsDescription": "ईमेल सेटिंग्स बदलने की अनुमति दें।"
+ "Feature:AllowChangingEmailSettingsDescription": "ईमेल सेटिंग्स बदलने की अनुमति दें।",
+ "SmtpPasswordPlaceholder": "पासवर्ड अपडेट करने के लिए एक मान दर्ज करें"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json
index 328bd37e74..db40dafe47 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hr.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Omogući upravljanje postavkama",
"Feature:SettingManagementEnableDescription": "Omogućite sustav upravljanja postavkama u aplikaciji.",
"Feature:AllowChangingEmailSettings": "Dopusti promjenu postavki e-pošte.",
- "Feature:AllowChangingEmailSettingsDescription": "Dopusti promjenu postavki e-pošte."
+ "Feature:AllowChangingEmailSettingsDescription": "Dopusti promjenu postavki e-pošte.",
+ "SmtpPasswordPlaceholder": "Unesite vrijednost za ažuriranje lozinke"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json
index bd1470a82b..c2cc70cb5b 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/hu.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Beállításkezelés engedélyezése",
"Feature:SettingManagementEnableDescription": "A beállításkezelő rendszer engedélyezése az alkalmazásban.",
"Feature:AllowChangingEmailSettings": "Az e-mail beállítások módosításának engedélyezése.",
- "Feature:AllowChangingEmailSettingsDescription": "Az e-mail beállítások módosításának engedélyezése."
+ "Feature:AllowChangingEmailSettingsDescription": "Az e-mail beállítások módosításának engedélyezése.",
+ "SmtpPasswordPlaceholder": "Adjon meg egy értéket a jelszó frissítéséhez"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json
index e00b26a892..cd80ba6fc3 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/is.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Virkja stillingar",
"Feature:SettingManagementEnableDescription": "Virkja stillingar í forritinu.",
"Feature:AllowChangingEmailSettings": "Leyfa að breyta stillingum tölvupósts.",
- "Feature:AllowChangingEmailSettingsDescription": "Leyfa að breyta stillingum tölvupósts."
+ "Feature:AllowChangingEmailSettingsDescription": "Leyfa að breyta stillingum tölvupósts.",
+ "SmtpPasswordPlaceholder": "Sláðu inn gildi til að uppfæra lykilorð"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json
index 5d68f59a0c..c03c678318 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/it.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Abilita gestione impostazioni",
"Feature:SettingManagementEnableDescription": "Abilita sistema gestione impostazioni nell'applicazione",
"Feature:AllowChangingEmailSettings": "Consenti di modificare le loro impostazioni e-mail.",
- "Feature:AllowChangingEmailSettingsDescription": "Consenti di modificare le loro impostazioni e-mail."
+ "Feature:AllowChangingEmailSettingsDescription": "Consenti di modificare le loro impostazioni e-mail.",
+ "SmtpPasswordPlaceholder": "Inserisci un valore per aggiornare la password"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json
index bf8467dc9d..e68f8a0b2c 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/nl.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Instellingenbeheer inschakelen",
"Feature:SettingManagementEnableDescription": "Schakel het instellingsbeheersysteem in de toepassing in.",
"Feature:AllowChangingEmailSettings": "Toestaan om e-mailinstellingen te wijzigen.",
- "Feature:AllowChangingEmailSettingsDescription": "Toestaan om e-mailinstellingen te wijzigen."
+ "Feature:AllowChangingEmailSettingsDescription": "Toestaan om e-mailinstellingen te wijzigen.",
+ "SmtpPasswordPlaceholder": "Voer een waarde in om het wachtwoord bij te werken"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json
index 5880daaf3c..0e900acb36 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pl-PL.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Włącz zarządzanie ustawieniami",
"Feature:SettingManagementEnableDescription": "Włącz system zarządzania ustawieniami w aplikacji.",
"Feature:AllowChangingEmailSettings": "Zezwól na zmianę ustawień poczty e-mail.",
- "Feature:AllowChangingEmailSettingsDescription": "Zezwól na zmianę ustawień poczty e-mail."
+ "Feature:AllowChangingEmailSettingsDescription": "Zezwól na zmianę ustawień poczty e-mail.",
+ "SmtpPasswordPlaceholder": "Wprowadź wartość, aby zaktualizować hasło"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json
index 1075ef4282..4d3719e229 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/pt-BR.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Habilitar gerenciamento de configuração",
"Feature:SettingManagementEnableDescription": "Habilite o sistema de gerenciamento de configuração no aplicativo.",
"Feature:AllowChangingEmailSettings": "Permitir alterar as configurações de e-mail.",
- "Feature:AllowChangingEmailSettingsDescription": "Permitir alterar as configurações de e-mail."
+ "Feature:AllowChangingEmailSettingsDescription": "Permitir alterar as configurações de e-mail.",
+ "SmtpPasswordPlaceholder": "Digite um valor para atualizar a senha"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json
index 7e52d92a0e..dccb428a93 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ro-RO.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Activează administrarea setărilor",
"Feature:SettingManagementEnableDescription": "Activează sistemul de administrare a setărilor în aplicaţie.",
"Feature:AllowChangingEmailSettings": "Permiteți modificarea setărilor de e-mail.",
- "Feature:AllowChangingEmailSettingsDescription": "Permiteți modificarea setărilor de e-mail."
+ "Feature:AllowChangingEmailSettingsDescription": "Permiteți modificarea setărilor de e-mail.",
+ "SmtpPasswordPlaceholder": "Introduceți o valoare pentru a actualiza parola"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json
index bceff4b9b0..c7a48b8c2e 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/ru.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Включить управление настройками",
"Feature:SettingManagementEnableDescription": "Включите систему управления настройками в приложении.",
"Feature:AllowChangingEmailSettings": "Разрешить изменение настроек электронной почты.",
- "Feature:AllowChangingEmailSettingsDescription": "Разрешить изменение настроек электронной почты."
+ "Feature:AllowChangingEmailSettingsDescription": "Разрешить изменение настроек электронной почты.",
+ "SmtpPasswordPlaceholder": "Введите значение для обновления пароля"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json
index 4facd0d356..dfee758b09 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sk.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Povoliť správu nastavení",
"Feature:SettingManagementEnableDescription": "Povoliť systém správy nastavení v aplikácii.",
"Feature:AllowChangingEmailSettings": "Povoliť zmenu nastavení e-mailu.",
- "Feature:AllowChangingEmailSettingsDescription": "Povoliť zmenu nastavení e-mailu."
+ "Feature:AllowChangingEmailSettingsDescription": "Povoliť zmenu nastavení e-mailu.",
+ "SmtpPasswordPlaceholder": "Zadajte hodnotu pre aktualizáciu hesla"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json
index 64f6e69cce..81af7b908c 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sl.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Omogoči upravljanje nastavitev",
"Feature:SettingManagementEnableDescription": "Omogočite nastavitev sistema upravljanja v aplikaciji.",
"Feature:AllowChangingEmailSettings": "Dovoli spreminjanje e-poštnih nastavitev.",
- "Feature:AllowChangingEmailSettingsDescription": "Dovoli spreminjanje e-poštnih nastavitev."
+ "Feature:AllowChangingEmailSettingsDescription": "Dovoli spreminjanje e-poštnih nastavitev.",
+ "SmtpPasswordPlaceholder": "Vnesite vrednost za posodobitev gesla"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json
index 0cb4b2aafa..3e66d68871 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/sv.json
@@ -33,6 +33,7 @@
"Feature:SettingManagementEnable": "Aktivera hantering av inställningar",
"Feature:SettingManagementEnableDescription": "Aktivera inställningshanteringssystem i applikationen.",
"Feature:AllowChangingEmailSettings": "Tillåt ändring av e-postinställningar.",
- "Feature:AllowChangingEmailSettingsDescription": "Tillåt ändring av e-postinställningar."
+ "Feature:AllowChangingEmailSettingsDescription": "Tillåt ändring av e-postinställningar.",
+ "SmtpPasswordPlaceholder": "Ange ett värde för att uppdatera lösenordet"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json
index 50f5fccbd2..c91e50d716 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/tr.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Ayar yönetimini etkinleştir",
"Feature:SettingManagementEnableDescription": "Uygulamada ayar yönetim sistemini etkinleştirin.",
"Feature:AllowChangingEmailSettings": "E-posta ayarlarını değiştirmeye izin verin.",
- "Feature:AllowChangingEmailSettingsDescription": "E-posta ayarlarını değiştirmeye izin verin."
+ "Feature:AllowChangingEmailSettingsDescription": "E-posta ayarlarını değiştirmeye izin verin.",
+ "SmtpPasswordPlaceholder": "Şifreyi güncellemek için bir değer girin"
}
}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json
index f553ed7876..42d9af1b32 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/vi.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "Bật quản lý cài đặt",
"Feature:SettingManagementEnableDescription": "Bật cài đặt hệ thống quản lý trong ứng dụng.",
"Feature:AllowChangingEmailSettings": "Cho phép thay đổi cài đặt email.",
- "Feature:AllowChangingEmailSettingsDescription": "Cho phép thay đổi cài đặt email."
+ "Feature:AllowChangingEmailSettingsDescription": "Cho phép thay đổi cài đặt email.",
+ "SmtpPasswordPlaceholder": "Nhập một giá trị để cập nhật mật khẩu"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json
index 13219450a6..3ad7f5efa4 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hans.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "启用设置管理",
"Feature:SettingManagementEnableDescription": "在应用程序中启用设置管理系统。",
"Feature:AllowChangingEmailSettings": "允许更改邮件设置。",
- "Feature:AllowChangingEmailSettingsDescription": "允许更改邮件设置。"
+ "Feature:AllowChangingEmailSettingsDescription": "允许更改邮件设置。",
+ "SmtpPasswordPlaceholder": "输入一个值以更新密码"
}
}
\ No newline at end of file
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json
index 958a94528d..add9d88e5c 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/zh-Hant.json
@@ -34,6 +34,7 @@
"Feature:SettingManagementEnable": "啟用設定管理",
"Feature:SettingManagementEnableDescription": "在應用程序中啟用設定管理系統.",
"Feature:AllowChangingEmailSettings": "允許更改電子郵件設置。",
- "Feature:AllowChangingEmailSettingsDescription": "允許更改電子郵件設置。"
+ "Feature:AllowChangingEmailSettingsDescription": "允許更改電子郵件設置。",
+ "SmtpPasswordPlaceholder": "輸入一個值以更新密碼"
}
}
diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml
index ee8db3e38f..070ee02178 100644
--- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml
+++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/Default.cshtml
@@ -21,7 +21,7 @@