diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml
index 3142e186c5..5587120951 100644
--- a/.github/workflows/auto-pr.yml
+++ b/.github/workflows/auto-pr.yml
@@ -1,13 +1,13 @@
-name: Merge branch dev with rel-7.4
+name: Merge branch dev with rel-8.0
on:
push:
branches:
- - rel-7.4
+ - rel-8.0
permissions:
contents: read
jobs:
- merge-dev-with-rel-7-4:
+ merge-dev-with-rel-8-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,13 +18,19 @@ jobs:
ref: dev
- name: Reset promotion branch
run: |
- git fetch origin rel-7.4:rel-7.4
- git reset --hard rel-7.4
+ git fetch origin rel-8.0:rel-8.0
+ git reset --hard rel-8.0
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
- branch: auto-merge/rel-7-4/${{github.run_number}}
- title: Merge branch dev with rel-7.4
- body: This PR generated automatically to merge dev with rel-7.4. Please review the changed files before merging to prevent any errors that may occur.
- reviewers: ${{github.actor}}
+ branch: auto-merge/rel-8-0/${{github.run_number}}
+ title: Merge branch dev with rel-8.0
+ body: This PR generated automatically to merge dev with rel-8.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/rel-8-0/${{github.run_number}} --approve
+ gh pr merge auto-merge/rel-8-0/${{github.run_number}} --merge --auto --delete-branch
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index 5f974c2da8..696d401fed 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: 8.0.100-rc.2.23502.2
+ dotnet-version: 8.0.100
- name: chown
run: |
diff --git a/Directory.Packages.props b/Directory.Packages.props
index a6d8cfdc4f..540c7f109d 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -4,167 +4,168 @@
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
index faf7c0b36d..a261c69dca 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
@@ -229,6 +229,7 @@
"ManageAccount": "Manage Account",
"CommunityProfile": "Community Profile",
"BlogProfile": "Blog Profile",
- "Tickets": "Tickets"
+ "Tickets": "Tickets",
+ "Videos": "Videos"
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
index e53398cd38..d2ea2d3a0b 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json
@@ -255,7 +255,6 @@
"LatestArticles": "Latest Articles",
"RaffleHeader": "Hello ABP Community Member!",
"RafflesInfo": " This is the raffle page dedicated to show our appreciation towards you for being an active Community Member. We do ABP Community Talks,ABP .NET Conference, attend or sponsor to the .NET-related events in which we give away some gifts.
You can follow this page to see the upcoming raffles, attend them, or see previous raffles we draw including the winners.
Thank you for being an active member! See you in the upcoming raffles.",
- "RafflesInfoTitle": "ABP Community Raffles",
-
+ "RafflesInfoTitle": "ABP Community Raffles"
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
index 9f0273d45d..cf26edf473 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
@@ -440,7 +440,8 @@
"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 docs.abp.io 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.",
"VideosLoginAndRegisterMessage": "To be able to watch videos, you must sign in.",
"Filter": "Filter",
- "VideoCourses": "Video Courses",
- "Videos": "Videos"
+ "VideoCourses": "Video Courses"
}
}
+
+
diff --git a/abp_io/README.md b/abp_io/README.md
index 8819a4fb73..3f59187ea4 100644
--- a/abp_io/README.md
+++ b/abp_io/README.md
@@ -1,11 +1,32 @@
-## Abp.io platform localization
+## ABP Platform Websites Localization
-This project is all localized resources of the abp.io platform.
+This is the localization project of [abp.io platform](https://abp.io).
+All *.abp.io websites are built on top of ABP Framework, and it uses ABP Framework's localization system.
+You can correct a wrong localization text, or you can translate it into your own language.
+By doing so, [abp.io](https://abp.io) websites will be translated into a new language and it will help to expand the ABP Community.
-If you like, you can contribute to the localization resources in this project.
-For example: `AbpIoLocalization\AbpIoLocalization\Www\Localization\Resources\zh-Hans.json`
-If the file is missing some translations or the translation is wrong, you can add it.
-If the language file is missing (eg `kr.json`), you can also add it.
-Please refer to the [Contribution Guide](https://github.com/abpframework/abp/blob/dev/docs/en/Contribution/Index.md) for details.
\ No newline at end of file
+## How to Translate abp.io Into Your Language:
+
+1. Install [ABP CLI](https://docs.abp.io/en/abp/latest/CLI) command line tool.
+
+2. Run the following command to generate the localization file.
+ For example, for translating from English to French `fr`:
+
+ ```bash
+ abp translate -c fr
+ ```
+3. After you fill in the empty localization keys, run the following command to apply it.
+ ```bash
+ abp translate -a
+ ```
+4. Send your PR to the team; after the review process, we wil merge it.
+
+---
+
+
+
+## References:
+* [ABP CLI Translate Command](https://docs.abp.io/en/abp/latest/Contribution/Index#using-the-abp-translate-command)
+* [Contribution Guide](https://github.com/abpframework/abp/blob/dev/docs/en/Contribution/Index.md)
diff --git a/common.props b/common.props
index b39a45b734..c64a4460d8 100644
--- a/common.props
+++ b/common.props
@@ -1,7 +1,7 @@
latest
- 8.0.0
+ 8.1.0$(NoWarn);CS1591;CS0436https://abp.io/assets/abp_nupkg.pnghttps://abp.io/
@@ -29,8 +29,8 @@
truecontent\
-
-
+
+ truecontent\
diff --git a/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md
index dc0f96e726..73bea079a1 100644
--- a/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md
+++ b/docs/en/Community-Articles/2023-10-23-NET-8-Feature-containers/POST.md
@@ -17,8 +17,8 @@ It's important to note that this change only affects the default port used when
If you want your application to continue using port 80, you can still specify it during the application launch or configure it in the application settings.
-* Recommended: Explicitly set the `ASPNETCORE_HTTP_PORTS`, `ASPNETCORE_HTTPS_PORTS``, and `ASPNETCORE_URLS` environment variables to the desired port. Example: `docker run --rm -it -p 9999:80 -e ASPNETCORE_HTTP_PORTS=80 ``
-* Update existing commands and configuration that rely on the expected default port of port 80 to reference port 8080 instead. Example: `docker run --rm -it -p 9999:8080 ``
+* Recommended: Explicitly set the `ASPNETCORE_HTTP_PORTS`, `ASPNETCORE_HTTPS_PORTS`, and `ASPNETCORE_URLS` environment variables to the desired port. Example: `docker run --rm -it -p 9999:80 -e ASPNETCORE_HTTP_PORTS=80 `
+* Update existing commands and configuration that rely on the expected default port of port 80 to reference port 8080 instead. Example: `docker run --rm -it -p 9999:8080 `
> The `dockerfile` of ABP templates has been updated to use port `80`.
diff --git a/docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD b/docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD
index 696bbaf07c..f11dec060d 100644
--- a/docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD
+++ b/docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD
@@ -180,7 +180,7 @@ For more details and examples, see the Microsoft's document in the *References*
You can find the sample project here:
-https://github.com/hikalkan/samples/tree/master/EfCoreComplexTypeDemo
+[https://github.com/hikalkan/samples/tree/master/EfCoreComplexTypeDemo](https://github.com/hikalkan/samples/tree/master/EfCoreComplexTypeDemo)
## References
diff --git a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md
index c3203d481d..c1c38d7818 100644
--- a/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md
+++ b/docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md
@@ -91,4 +91,5 @@ I summarized the new generation Blazor in a very simple way. This architecture w
* You can check Dan Roth's GitHub issue 👉 [github.com/dotnet/aspnetcore/issues/46636](https://github.com/dotnet/aspnetcore/issues/46636).
* Steven Sanderson's YouTube video is very good for understanding these concepts 👉 [Blazor United Prototype Video](https://youtu.be/48G_CEGXZZM).
+* "Full Stack Web UI with Blazor" — .NET Conf 2023 video 👉 [learn.microsoft.com/en-us/shows/dotnetconf-2023/full-stack-web-ui-with-blazor-in-dotnet-8](https://learn.microsoft.com/en-us/shows/dotnetconf-2023/full-stack-web-ui-with-blazor-in-dotnet-8)
diff --git a/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/POST.md b/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/POST.md
index 9255c39a5a..a3c143a9c8 100644
--- a/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/POST.md
+++ b/docs/en/Community-Articles/2023-11-06-EF-Core_Hierarchy-Id/POST.md
@@ -76,4 +76,4 @@ await context.SaveChangesAsync();
For more information about hierarchy id, see the following resource:
-https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#hierarchyid-in-net-and-ef-core
+- [https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#hierarchyid-in-net-and-ef-core](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew#hierarchyid-in-net-and-ef-core)
diff --git a/docs/en/Community-Articles/2023-11-16-Upgrading-Your-Existing-Projects-to-NET8/POST.md b/docs/en/Community-Articles/2023-11-16-Upgrading-Your-Existing-Projects-to-NET8/POST.md
new file mode 100644
index 0000000000..cc154ad9c1
--- /dev/null
+++ b/docs/en/Community-Articles/2023-11-16-Upgrading-Your-Existing-Projects-to-NET8/POST.md
@@ -0,0 +1,95 @@
+# Upgrade Your Existing Projects to .NET 8 & ABP 8.0
+
+A new .NET version was released on November 14, 2023 and ABP 8.0 RC.1 shipped based on .NET 8.0 just after Microsoft's .NET 8.0 release. Therefore, it's a good time to see what we need to do to upgrade our existing projects to .NET 8.0.
+
+Despite all the related dependency upgrades and changes made on ABP Framework and ABP Commercial sides, we still need to make some changes. Let's see the required actions that need to be taken in the following sections.
+
+## Installing the .NET 8.0 SDK
+
+To get started with ASP.NET Core in .NET 8.0, you need to install the .NET 8 SDK. You can install it at [https://dotnet.microsoft.com/en-us/download/dotnet/8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0).
+
+After installing the SDK & Runtime, you can upgrade your existing ASP.NET Core application to .NET 8.0.
+
+## Updating the Target Framework
+
+First, you need to update all your `*.csproj` files to support .NET 8. Find and replace all your `TargetFramework` definitions in the `*.csproj` files to support .NET 8.0:
+
+```xml
+net8.0
+```
+
+> This and all other changes mentioned in this article have already been done in the ABP Framework and ABP Commercial side, so you would not get any problems related to that.
+
+## Updating Microsoft Package Versions
+
+You are probably using some Microsoft packages in your solution, so you need to update them to the latest .NET 8.0 version. Therefore, update all `Microsoft.AspNetCore.*` and `Microsoft.Extensions.*` packages' references to `8.0.0`.
+
+## Checking the Breaking Changes in .NET 8.0
+
+As I have mentioned earlier in this article, on the ABP Framework & ABP Commercial sides all the related code changes have been made, so you would not get any error related to breaking changes introduced with .NET 8.0. However, you still need to check the [Breaking Changes in .NET 8.0 documentation](https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0), because the breaking changes listed in this documentation still might affect you. Therefore, read them accordingly and make the related changes in your application, if needed.
+
+## Update Your Global Dotnet CLI Tools (optional)
+
+You can update the global dotnet tools to the latest version by running the `dotnet tool update` command. For example, if you are using EF Core, you can update your `dotnet-ef` CLI tool with the following command:
+
+```bash
+dotnet tool update dotnet-ef --global
+```
+
+## Installing/Restoring the Workloads (required for Blazor WASM & MAUI apps)
+
+The `dotnet workload restore` command installs the workloads needed for a project or a solution. This command analyzes a project or solution to determine which workloads are needed and if you have a .NET MAUI or Blazor-WASM project, you can update your workloads by running the following command in a terminal:
+
+```bash
+dotnet workload restore
+```
+
+## Docker Image Updates
+
+If you are using Docker to automate the deployment of applications, you also need to update your images.
+
+For example, you can update the ASP.NET Core image as follows:
+
+```diff
+- FROM mcr.microsoft.com/dotnet/aspnet:7.0-bullseye-slim AS base
++ FROM mcr.microsoft.com/dotnet/aspnet:8.0-bullseye-slim AS base
+```
+
+You can check the related images from Docker Hub and update them accordingly:
+
+* [https://hub.docker.com/_/microsoft-dotnet-aspnet/](https://hub.docker.com/_/microsoft-dotnet-aspnet/)
+* [https://hub.docker.com/_/microsoft-dotnet-sdk/](https://hub.docker.com/_/microsoft-dotnet-sdk/)
+* [https://hub.docker.com/_/microsoft-dotnet-runtime/](https://hub.docker.com/_/microsoft-dotnet-runtime/)
+
+## Upgrading Your Existing Projects to ABP 8.0
+
+Updating your application to ABP 8.0 is pretty straight-forward. You first need to upgrade the ABP CLI to version `8.0.0-rc.1` using a command line terminal:
+
+````bash
+dotnet tool update Volo.Abp.Cli -g --version 8.0.0-rc.1
+````
+
+**or install** it if you haven't before:
+
+````bash
+dotnet tool install Volo.Abp.Cli -g --version 8.0.0-rc.1
+````
+
+Then, you can use the `abp update` command to update all the ABP related NuGet and NPM packages in your solution:
+
+```bash
+abp update --version 8.0.0-rc.1
+```
+
+After that, you need to check the migration guide documents, listed below:
+
+* [ABP Framework 7.x to 8.0 Migration Guide](https://docs.abp.io/en/abp/8.0/Migration-Guides/Abp-8_0)
+* [ABP Commercial 7.x to 8.0 Migration Guide](https://docs.abp.io/en/commercial/8.0/migration-guides/v8_0)
+
+> Check these documents carefully and make the related changes in your solution to prevent errors.
+
+## Final Words
+
+That's it! These were all the related steps that need to be taken to upgrade your application to .NET 8 and ABP 8.0. Now, you can enjoy the .NET 8 & ABP 8.0 and benefit from the performance improvements and new features.
+
+Happy Coding 🤗
diff --git a/docs/en/Community-Articles/2023-11-97-AOT-Compilation/Post.md b/docs/en/Community-Articles/2023-11-17-AOT-Compilation/Post.md
similarity index 99%
rename from docs/en/Community-Articles/2023-11-97-AOT-Compilation/Post.md
rename to docs/en/Community-Articles/2023-11-17-AOT-Compilation/Post.md
index 2b994b59c3..b39a2af339 100644
--- a/docs/en/Community-Articles/2023-11-97-AOT-Compilation/Post.md
+++ b/docs/en/Community-Articles/2023-11-17-AOT-Compilation/Post.md
@@ -39,7 +39,7 @@ I have created a simple console application to test the Native AOT Compilation.
| | Size | Speed |
-| --- | --- | --- |
+| --- | --- | --- |
| .NET 8 _(Self-Contained, Single File)_ | 65938 kb | 00.0051806 ~5ms |
| .NET 7 AOT (default) | 4452 kb | 00.0029823 ~2ms |
| .NET 8 AOT (default) | 1242 kb | 00.0028638 ~2ms |
@@ -65,11 +65,8 @@ Always consider the specific needs and constraints of your project before decidi
Native AOT Compilation is a great feature that improves the performance of .NET applications. It's still in early-stages and not all libraries support it yet. But it's a great beginning for the future of .NET 🚀
-
## Links
- Native AOT deployment overview - .NET | Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/.
--
- Optimize AOT deployments https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/optimizing
--
- What's new in .NET 8 | Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8.
diff --git a/docs/en/Dapr/Index.md b/docs/en/Dapr/Index.md
index 060b31aac3..464b56ea30 100644
--- a/docs/en/Dapr/Index.md
+++ b/docs/en/Dapr/Index.md
@@ -60,29 +60,6 @@ Alternatively, you can configure the options in the `Dapr` section of your `apps
}
````
-### Injecting DaprClient
-
-ABP registers the `DaprClient` class to the [dependency injection](../Dependency-Injection.md) system. So, you can inject and use it whenever you need:
-
-````csharp
-public class MyService : ITransientDependency
-{
- private readonly DaprClient _daprClient;
-
- public MyService(DaprClient daprClient)
- {
- _daprClient = daprClient;
- }
-
- public async Task DoItAsync()
- {
- // TODO: Use the injected _daprClient object
- }
-}
-````
-
-Injecting `DaprClient` is the recommended way of using it in your application code. When you inject it, the `IAbpDaprClientFactory` service is used to create it, which is explained in the next section.
-
### IAbpDaprClientFactory
`IAbpDaprClientFactory` can be used to create `DaprClient` or `HttpClient` objects to perform operations on Dapr. It uses `AbpDaprOptions`, so you can configure the settings in a central place.
@@ -113,15 +90,14 @@ public class MyService : ITransientDependency
});
// Create an HttpClient object
- HttpClient httpClient = await _daprClientFactory
- .CreateHttpClientAsync("target-app-id");
+ HttpClient httpClient = await _daprClientFactory.CreateHttpClientAsync("target-app-id");
}
}
````
`CreateHttpClientAsync` method also gets optional `daprEndpoint` and `daprApiToken` parameters.
-> ABP uses `IAbpDaprClientFactory` when it needs to create a Dapr client. You can also use Dapr API to create client objects in your application. Using `IAbpDaprClientFactory` is recommended, but not required.
+> You can use Dapr API to create client objects in your application. Using `IAbpDaprClientFactory` is recommended, but not required.
## C# API Client Proxies Integration
@@ -412,7 +388,7 @@ Or you can set it in your `appsettings.json` file:
}
````
-Once you set it, it is used when you inject `DaprClient` or use `IAbpDaprClientFactory`. If you need that value in your application, you can inject `IDaprApiTokenProvider` and use its `GetDaprApiToken()` method.
+Once you set it, it is used when you use `IAbpDaprClientFactory`. If you need that value in your application, you can inject `IDaprApiTokenProvider` and use its `GetDaprApiToken()` method.
### App API Token
diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md
index d8afe5c21c..143ec8cc19 100644
--- a/docs/en/Dependency-Injection.md
+++ b/docs/en/Dependency-Injection.md
@@ -480,6 +480,24 @@ This example simply checks if the service class has `MyLogAttribute` attribute a
> Notice that `OnRegistered` callback might be called multiple times for the same service class if it exposes more than one service/interface. So, it's safe to use `Interceptors.TryAdd` method instead of `Interceptors.Add` method. See [the documentation](Dynamic-Proxying-Interceptors.md) of dynamic proxying / interceptors.
+### IServiceCollection.OnActivated Event
+
+The `OnActivated` event is raised once a service is fully constructed. Here you can perform application-level tasks that depend on the service being fully constructed - these should be rare.
+
+````csharp
+var serviceDescriptor = ServiceDescriptor.Transient();
+services.Add(serviceDescriptor);
+if (setIsReadOnly)
+{
+ services.OnActivated(serviceDescriptor, x =>
+ {
+ x.Instance.As().IsReadOnly = true;
+ });
+}
+````
+
+> Notice that `OnActivated` event can be registered multiple times for the same `ServiceDescriptor`.
+
## 3rd-Party Providers
While ABP has no core dependency to any 3rd-party DI provider, it's required to use a provider that supports dynamic proxying and some other advanced features to make some ABP features properly work.
diff --git a/docs/en/Dynamic-Claims.md b/docs/en/Dynamic-Claims.md
new file mode 100644
index 0000000000..5985be9510
--- /dev/null
+++ b/docs/en/Dynamic-Claims.md
@@ -0,0 +1,92 @@
+# Dynamic Claims
+
+When a client authenticates and obtains an access token or an authentication cookie, the claims in that token or cookie are not changed unless it re-authenticates. For most of the claims, that may not be a problem since claims are not frequently changing values. However, some claims may be changed and these changes should be reflected to the current session immediately. For example, we can revoke a role from a user and that should be immediately effective, otherwise user will continue to use that role's permissions until re-login to the application.
+
+ABP's dynamic claims feature is used to automatically and dynamically override the configured claim values in the client's authentication token/cookie by the latest values of these claims.
+
+## How to Use
+
+This feature is disabled by default. You should enable it for your application and use the Dynamic Claims middleware.
+
+> **Beginning from the v8.0, all the [startup templates](Startup-Templates/Index.md) are pre-configured and the dynamic claims feature is enabled by default. So, if you have created a solution with v8.0 and above, you don't need to make any configuration. Follow the instructions only if you've upgraded from a version lower than 8.0.**
+
+### Enabling the Dynamic Claims
+
+You can enable it by the following code:
+
+````csharp
+public override void ConfigureServices(ServiceConfigurationContext context)
+{
+ context.Services.Configure(options =>
+ {
+ options.IsDynamicClaimsEnabled = true;
+ });
+}
+````
+
+This is typically done on the authentication server. In a monolith application, you will typically have a single application, so you can configure it. If you are using the tiered solution structure (where the UI part is hosted in a separate application) you will need to also set the `RemoteRefreshUrl` to the Authentication Server's URL in the UI application. Example:
+
+````csharp
+public override void ConfigureServices(ServiceConfigurationContext context)
+{
+ context.Services.Configure(options =>
+ {
+ options.IsDynamicClaimsEnabled = true;
+ options.RemoteRefreshUrl = configuration["AuthServerUrl"] + options.RemoteRefreshUrl;
+ });
+}
+````
+
+> The `RemoteRefreshUrl` is already configured inside methods `AddAbpOpenIdConnect` and `AddAbpJwtBearer`.
+
+
+### The Dynamic Claims Middleware
+
+Add the `DynamicClaims` middleware to all the applications that performs authentication (including the authentication server):
+
+````csharp
+public override void OnApplicationInitialization(
+ ApplicationInitializationContext context)
+{
+ //...
+ app.UseDynamicClaims(); // Add this line before UseAuthorization.
+ app.UseAuthorization();
+ //...
+}
+````
+
+## How It Works
+
+The `DynamicClaims` middleware will use `IAbpClaimsPrincipalFactory` to dynamically generate claims for the current user(`HttpContext.User`) in each request.
+
+There are three pre-built implementations of `IAbpDynamicClaimsPrincipalContributor` for different scenarios:
+
+* `IdentityDynamicClaimsPrincipalContributor`: Provided by the [Identity module](Modules/Identity.md) and generates and overrides the actual dynamic claims, and writes to the distributed cache. Typically works in the authentication server in a distributed system.
+* `RemoteDynamicClaimsPrincipalContributor`: For distributed scenarios, this implementation works in the UI application. It tries to get dynamic claim values in the distributed cache. If not found in the distributed cache, it makes an HTTP call to the authentication server and requests filling it by the authentication server. `AbpClaimsPrincipalFactoryOptions.RemoteRefreshUrl` should be properly configure to make it running.
+* `WebRemoteDynamicClaimsPrincipalContributor`: Similar to the `RemoteDynamicClaimsPrincipalContributor` but works in the microservice applications.
+
+### IAbpDynamicClaimsPrincipalContributor
+
+If you want to add your own dynamic claims contributor, you can create a class that implement the `IAbpDynamicClaimsPrincipalContributor` interface (and register it to the [dependency injection](Dependency-Injection.md) system. ABP Framework will call the `ContributeAsync` method to get the claims. It better to use a kind of cache to improve the performance since that is a frequently executed method (in every HTTP request).
+
+## AbpClaimsPrincipalFactoryOptions
+
+`AbpClaimsPrincipalFactoryOptions` is the main options class to configure the behavior of the dynamic claims system. It has the following properties:
+
+* `IsDynamicClaimsEnabled`: Enable or disable the dynamic claims feature.
+* `RemoteRefreshUrl`: The `url ` of the Auth Server to refresh the cache. It will be used by the `RemoteDynamicClaimsPrincipalContributor`. The default value is `/api/account/dynamic-claims/refresh ` and you should provide the full URL in the authentication server, like `http://my-account-server/api/account/dynamic-claims/refresh `.
+* `DynamicClaims`: A list of dynamic claim types. Only the claims in that list will be overridden by the dynamic claims system.
+* `ClaimsMap`: A dictionary to map the claim types. This is used when the claim types are different between the Auth Server and the client. Already set up for common claim types by default.
+
+## WebRemoteDynamicClaimsPrincipalContributorOptions
+
+`WebRemoteDynamicClaimsPrincipalContributorOptions` is the options class to configure the behavior of the `WebRemoteDynamicClaimsPrincipalContributor`. It has the following properties:
+
+* `IsEnabled`: Enable or disable the `WebRemoteDynamicClaimsPrincipalContributor`. `false` by default.
+* `AuthenticationScheme`: The authentication scheme to authenticate the HTTP call to the authentication server.
+
+## See Also
+
+* [Authorization](Authorization.md)
+* [Claims-based authorization in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/claims)
+* [Mapping, customizing, and transforming claims in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/claims)
diff --git a/docs/en/Migration-Guides/Abp-8_0.md b/docs/en/Migration-Guides/Abp-8_0.md
index 108de6ba98..9285858501 100644
--- a/docs/en/Migration-Guides/Abp-8_0.md
+++ b/docs/en/Migration-Guides/Abp-8_0.md
@@ -1,77 +1,288 @@
# ABP Version 8.0 Migration Guide
-This document is a guide for upgrading ABP v7.4.x solutions to ABP v8.0.x.
+This document is a guide for upgrading ABP v7.x solutions to ABP v8.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 Framework upgraded to .NET 8.0, so you need to move your solutions to .NET 8.0 if you want to use the ABP 8.0. You can check the [Migrate from ASP.NET Core 7.0 to 8.0](https://learn.microsoft.com/en-us/aspnet/core/migration/70-80) documentation.
+
+## Injected the `IDistributedEventBus` Dependency into the `IdentityUserManager`
+
+In this version, `IDistributedEventBus` service has been injected to the `IdentityUserManager` service, to publish a distributed event when the email or username is changed for a user, this was needed because sometimes there may be scenarios where the old email/username is needed for the synchronization purposes.
+
+Therefore, you might need to update the `IdentityUserManager`'s constructor if you have overridden the class and are using it.
+
+> See the issue for more information: https://github.com/abpframework/abp/pull/17990
+
+## Updated Method Signatures in the Bundling System
+
+In this version, ABP Framework introduced the CDN support for bundling. During the development, we have made some improvements on the bundling system and changed some method signatures.
+
+See https://github.com/abpframework/abp/issues/17864 for more information.
+
+## Replaced `IdentityUserLookupAppService` with the `IIdentityUserIntegrationService`
+
+[Integration Services](../Integration-Services.md) are built for module-to-module (or microservice-to-microservice) communication rather than consumed from a UI or a client application as [Application Services](../Application-Services.md) are intended to do.
+
+In that regard, we are discarding the `IIdentityUserLookupAppService` in the Identity Module and moving its functionality to the `IIdentityUserIntegrationService`. Therefore, if you have used that application service directly, use the integration service (`IIdentityUserIntegrationService`) instead. `IIdentityUserLookupAppService` will be removed in thes next versions, so you may need to create a similar service in your application.
+
+> Notice that integration services have no authorization and are not exposed as HTTP API by default.
+Also, if you have overridden the `IdentityUserLookupAppService` and `IdentityUserIntegrationService` classes in your application, you should update these classes' constructors as follows:
+
+*IdentityUserLookupAppService.cs*
+```csharp
+ public IdentityUserLookupAppService(IIdentityUserIntegrationService identityUserIntegrationService)
+ {
+ IdentityUserIntegrationService = identityUserIntegrationService;
+ }
+```
+
+*IdentityUserIntegrationService.cs*
+
+```diff
+ public IdentityUserIntegrationService(
+ IUserRoleFinder userRoleFinder,
++ IdentityUserRepositoryExternalUserLookupServiceProvider userLookupServiceProvider)
+ {
+ UserRoleFinder = userRoleFinder;
++ UserLookupServiceProvider = userLookupServiceProvider;
+ }
+```
+
+## MongoDB Event Bus Enhancements
+
+In this version, we have made some enhancements in the transactional inbox/outbox pattern implementation and defined two new methods: `ConfigureEventInbox` and `ConfigureEventOutbox` for MongoDB Event Box collections.
+
+If you call one of these methods in your DbContext class, then this introduces a breaking-change because if you do it, MongoDB collection names will be changed. Therefore, it should be carefully done since existing (non-processed) event records are not automatically moved to new collection and they will be lost. Existing applications with event records should rename the collection manually while deploying their solutions.
+
+See https://github.com/abpframework/abp/pull/17723 for more information. Also, check the documentation for the related configurations: [Distributed Event Bus](../Distributed-Event-Bus.md)
+
+## Moved the CMS Kit Pages Feature's Routing to a `DynamicRouteValueTransformer`
+
+In this version, we have made some improvements in the [CMS Kit's Pages Feature](../Modules/Cms-Kit/Pages.md), such as moving the routing logic to a `DynamicRouteValueTransformer` and etc...
+
+These enhancements led to some breaking changes as listed below that should be taken care of:
+
+* Page routing has been moved to **DynamicRouteValueTransformer**. If you use `{**slug}` pattern in your routing, it might conflict with new CMS Kit routing.
+* `PageConsts.UrlPrefix` has been removed, instead, the default prefix is *pages* for now. Still `/pages/{slug}` route works for backward compatibility alongside with `/{slug}` route.
+
+* **Endpoints changed:**
+ * `api/cms-kit-public/pages/{slug}` endpoint is changed to `api/cms-kit-public/pages/by-slug?slug={slug}`. Now multiple level of page URLs can be used and `/` characters will be transferred as URL Encoded in querysting to the HTTP API.
+ * `api/cms-kit-public/pages` changed to `api/cms-kit-public/pages/home`
+
+>_CmsKit Client Proxies are updated. If you don't send a **custom request** to this endpoint, **you don't need to take an action**_
+
+## Added Integration Postfix for Auto Controllers
+
+With this version on, the `Integration` suffix from controller names while generating [auto controllers](../API/Auto-API-Controllers.md) are not going to be removed, to differ the integration services from application services in the OpenAPI specification:
+
+
+
+> This should not affect most of the applications since you normally do not depend on the controller names in the client side.
+
+See https://github.com/abpframework/abp/issues/17625 for more information (how to preserve the existing behaviour, etc...).
+
+## Revised the reCaptcha Generator for CMS Kit's Comment Feature
+
+In this version, we have made improvements on the [CMS Kit's Comment Feature](../Modules/Cms-Kit/Comments.md) and revised the reCaptcha generation process, and made a performance improvement.
+
+This introduced some breaking changes that you should aware of:
+
+* Lifetime of the `SimpleMathsCaptchaGenerator` changed from singleton to transient,
+* Changed method signatures for `SimpleMathsCaptchaGenerator` class. (all of its methods are now async)
+
+If you haven't override the comment view component, then you don't need to make any changes, however if you have overriden the component and used the `SimpleMathsCaptchaGenerator` class, then you should make the required changes as described.
+
+## Disabled Logging for `HEAD` HTTP Methods
+
+HTTP GET requests should not make any change in the database normally and audit log system of ABP Framework doesn't save audit log objects for GET requests by default. You can configure the `AbpAuditingOptions` and set the `IsEnabledForGetRequests` to **true** if you want to record _GET_ requests as described in [the documentation](../Audit-Logging.md).
+
+Prior to this version, only the _GET_ requests were not saved as audit logs. From this version on, also the _HEAD_ requests will not be saved as audit logs, if the `IsEnabledForGetRequests` explicitly set as **true**.
+
+You don't need to make any changes related to that, however it's important to know this change.
+
+## Obsolete the `AbpAspNetCoreIntegratedTestBase` Class
+
+In this version, `AbpAspNetCoreAsyncIntegratedTestBase` class has been set as `Obsolete` and it's recommended to use `AbpWebApplicationFactoryIntegratedTest` instead.
+
+## Use NoTracking for Readonly Repositories for EF Core
+
+In this version, ABP Framework provides read-only [repository](Repositories.md) interfaces (`IReadOnlyRepository<...>` or `IReadOnlyBasicRepository<...>`) to explicitly indicate that your purpose is to query data, but not change it. If so, you can inject these interfaces into your services.
+
+Entity Framework Core read-only repository implementation uses [EF Core's No-Tracking feature](https://learn.microsoft.com/en-us/ef/core/querying/tracking#no-tracking-queries). That means the entities returned from the repository will not be tracked by the EF Core [change tracker](https://learn.microsoft.com/en-us/ef/core/change-tracking/), because it is expected that you won't update entities queried from a read-only repository.
+
+> This behavior works only if the repository object is injected with one of the read-only repository interfaces (`IReadOnlyRepository<...>` or `IReadOnlyBasicRepository<...>`). It won't work if you have injected a standard repository (e.g. `IRepository<...>`) then casted it to a read-only repository interface.
+
+> See the issue for more information: https://github.com/abpframework/abp/pull/17421
+
+## Use `IAbpDaprClientFactory` to Obtain `DaprClient`
+
+From this version on, instead of injecting the `DaprClient` directly, using the `IAbpDaprClientFactory.CreateAsync` method to create `DaprClient` or `HttpClient` objects to perform operations on Dapr is recommended.
+
+The documentation is already updated according to this suggestion and can be found at https://docs.abp.io/en/abp/8.0/Dapr/Index. So, if you want to learn more you can check the documentation or see the PR: https://github.com/abpframework/abp/pull/18117.
+
+## Angular UI
+
+# Guards
+
+From Angular Documentation;
+
+> Class-based **`Route`** guards are deprecated in favor of functional guards.
+
+- Angular has been using functional guards since version 14. According to this situation we have moved our guards to functional guards.
+
+We have modified our modules to adaptate functional guards.
+
+```diff
+- import {AuthGuard, PermissionGuard} from '@abp/ng.core';
++ import {authGuard, permissionGuard} from '@abp/ng.core';
+
+- canActivate: mapToCanActivate([AuthGuard, PermissionGuard])
++ canActivate: [authGuard, permissionGuard]
+```
+
+You can still use class based guards but we recommend it to use functional guards like us :)
## Upgraded NuGet Dependencies
-The following NuGet libraries have been upgraded:
+You can see the following list of NuGet libraries that have been upgraded with .NET 8.0 upgrade, if you are using one of these packages explicitly, you may consider upgrading them in your solution:
| Package | Old Version | New Version |
| ------------------- | ----------- | ----------- |
-| All Microsoft packages | 7.x | 8.x |
-| Microsoft.CodeAnalysis | 4.2.0 | 4.5.0 |
-| NUglify | 1.20.0 | 1.21.0 |
-| Polly | 7.2.3 | 8.0.0 |
-| aliyun-net-sdk-sts | 3.1.0 | 3.1.1 |
-| Autofac | 7.0.0 | 7.1.0 |
-| Autofac.Extras.DynamicProxy | 6.0.1 | 7.1.0 |
-| AutoMapper | 12.0.0 | 12.0.1 |
-| AsyncKeyedLock | 6.2.1 | 6.2.2 |
-| AWSSDK.S3 | 3.7.9.2 | 3.7.205.9 |
-| AWSSDK.SecurityToken | 3.7.1.151 | 3.7.202.4 |
-| Azure.Storage.Blobs | 12.15.0 | 12.18.0 |
-| ConfigureAwait.Fody | 3.3.1 | 3.3.2 |
-| Confluent.Kafka | 1.8.2 | 2.2.0 |
-| Dapper | 2.0.123 | 2.1.4 |
-| Dapr.Client | 1.11.0 | 1.9.0 |
-| DistributedLock.Core | 1.0.4 | 1.0.5 |
-| DistributedLock.Redis | 1.0.1 | 1.0.2 |
-| EphemeralMongo.Core | 1.1.0 | 1.1.3 |
-| EphemeralMongo6.runtime.linux-x64 | 1.1.0 | 1.1.3 |
-| EphemeralMongo6.runtime.osx-x64 | 1.1.0 | 1.1.3 |
-| EphemeralMongo6.runtime.win-x64 | 1.1.0 | 1.1.3 |
-| FluentValidation | 11.0.1 | 11.7.1 |
-| Fody | 6.6.1 | 6.8.0 |
-| Hangfire.AspNetCore | 1.8.2 | 1.8.5 |
-| Hangfire.SqlServer | 1.8.2 | 1.8.5 |
-| HtmlSanitizer | 5.0.331 | 8.0.723 |
-| IdentityModel | 6.0.0 | 6.2.0 |
-| IdentityServer4.AspNetIdentity | 4.1.1 | 4.1.2 |
-| JetBrains.Annotations | 2022.1.0 | 2023.2.0 |
-| LibGit2Sharp | 0.26.2 | 0.27.2 |
-| Magick.NET-Q16-AnyCPU | 13.2.0 | 13.3.0 |
-| MailKit | 3.2.0 | 4.2.0 |
-| Markdig.Signed | 0.26.0 | 0.33.0 |
-| Microsoft.AspNetCore.Mvc.Versioning | 5.0.0 | 5.1.0 |
-| Microsoft.AspNetCore.Razor.Language | 6.0.8 | 6.0.22 |
-| Microsoft.NET.Test.Sdk | 17.2.0 | 17.7.2 |
-| Minio | 4.0.6 | 6.0.0 |
-| MongoDB.Driver | 2.19.1 | 2.21.0 |
-| NEST | 7.14.1 | 7.17.5 |
-| Newtonsoft.Json | 13.0.1 | 13.0.3 |
-| NSubstitute | 4.3.0 | 5.1.0 |
-| NSubstitute.Analyzers.CSharp | 1.0.15 | 1.0.16 |
-| NuGet.Versioning | 5.11.0 | 6.7.0 |
-| Octokit | 0.50.0 | 8.0.1 |
-| Quartz | 3.4.0 | 3.7.0 |
-| Quartz.Extensions.DependencyInjection | 3.4.0 | 3.7.0 |
-| Quartz.Plugins.TimeZoneConverter | 3.4.0 | 3.7.0 |
-| RabbitMQ.Client | 6.3.0 | 6.5.0 |
-| Rebus | 6.6.5 | 7.2.1 |
-| Rebus.ServiceProvider | 7.0.0 | 9.1.0 |
-| Scriban | 5.4.4 | 5.9.0 |
-| Serilog.AspNetCore | 5.0.0 | 7.0.0 |
-| Serilog.Extensions.Hosting | 3.1.0 | 7.0.0 |
-| Serilog.Extensions.Logging | 3.1.0 | 7.0.0 |
-| Serilog.Sinks.Async | 1.4.0 | 1.5.0 |
-| SharpZipLib | 1.3.3 | 1.4.2 |
-| Shouldly | 4.1.0 | 4.2.1 |
-| SixLabors.ImageSharp | 1.0.4 | 3.0.2 |
-| Slugify.Core | 3.0.0 | 4.0.1 |
-| Spectre.Console | 0.46.1-preview.0.7 | 0.47.0 |
-| Swashbuckle.AspNetCore | 6.2.1 | 6.5.0 |
-| System.Linq.Dynamic.Core | 1.3.3 | 1.3.5 |
-| TimeZoneConverter | 5.0.0 | 6.1.0 |
-| xunit | 2.4.1 | 2.5.1 |
-| xunit.extensibility.execution | 2.4.1 | 2.5.1 |
-| xunit.runner.visualstudio | 2.4.5 | 2.5.1 |
+| aliyun-net-sdk-sts | 3.1.0 | 3.1.2 |
+| AsyncKeyedLock | 6.2.1 | 6.2.2 |
+| Autofac | 7.0.0 | 7.1.0 |
+| Autofac.Extras.DynamicProxy | 6.0.1 | 7.1.0 |
+| AutoMapper | 12.0.0 | 12.0.1 |
+| AWSSDK.S3 | 3.7.9.2 | 3.7.300.2 |
+| AWSSDK.SecurityToken | 3.7.1.151 | 3.7.300.2 |
+| Azure.Messaging.ServiceBus | 7.8.1 | 7.17.0 |
+| Azure.Storage.Blobs | 12.15.0 | 12.19.1 |
+| Blazorise | 1.3.1 | 1.3.2 |
+| Blazorise.Bootstrap5 | 1.3.1 | 1.3.2 |
+| Blazorise.Icons.FontAwesome | 1.3.1 | 1.3.2 |
+| Blazorise.Components | 1.3.1 | 1.3.2 |
+| Blazorise.DataGrid | 1.3.1 | 1.3.2 |
+| Blazorise.Snackbar | 1.3.1 | 1.3.2 |
+| Confluent.Kafka | 1.8.2 | 2.3.0 |
+| Dapper | 2.0.123 | 2.1.21 |
+| Dapr.AspNetCore | 1.9.0 | 1.12.0 |
+| Dapr.Client | 1.9.0 | 1.12.0 |
+| Devart.Data.Oracle.EFCore | 10.1.134.7 | 10.1.151.7 |
+| DistributedLock.Core | 1.0.4 | 1.0.5 |
+| DistributedLock.Redis | 1.0.1 | 1.0.2 |
+| EphemeralMongo.Core | 1.1.0 | 1.1.3 |
+| EphemeralMongo6.runtime.linux-x64 | 1.1.0 | 1.1.3 |
+| EphemeralMongo6.runtime.osx-x64 | 1.1.0 | 1.1.3 |
+| EphemeralMongo6.runtime.win-x64 | 1.1.0 | 1.1.3 |
+| FluentValidation | 11.0.1 | 11.8.0 |
+| Hangfire.AspNetCore | 1.8.2 | 1.8.6 |
+| Hangfire.SqlServer | 1.8.2 | 1.8.6 |
+| HtmlSanitizer | 5.0.331 | 8.0.746 |
+| HtmlAgilityPack | 1.11.42 | 1.11.54 |
+| IdentityModel | 6.0.0 | 6.2.0 |
+| IdentityServer4.AspNetIdentity | 4.1.1 | 4.1.2 |
+| JetBrains.Annotations | 2022.1.0 | 2023.3.0 |
+| LibGit2Sharp | 0.26.2 | 0.28.0 |
+| Magick.NET-Q16-AnyCPU | 13.2.0 | 13.4.0 |
+| MailKit | 3.2.0 | 4.3.0 |
+| Markdig.Signed | 0.26.0 | 0.33.0 |
+| Microsoft.AspNetCore.Authentication.JwtBearer | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Authentication.OpenIdConnect | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Authorization | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Components | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Components.Authorization | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Components.Web | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Components.WebAssembly | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Components.WebAssembly.Authentication | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Components.WebAssembly.DevServer | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Components.WebAssembly.Server | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.DataProtection.StackExchangeRedis | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Mvc.NewtonsoftJson | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.Mvc.Versioning | 5.0.0 | 5.1.0 |
+| Microsoft.AspNetCore.Razor.Language | 6.0.8 | 6.0.25 |
+| Microsoft.AspNetCore.TestHost | 7.0.10 | 8.0.0 |
+| Microsoft.AspNetCore.WebUtilities | 2.2.0 | 8.0.0 |
+| Microsoft.Bcl.AsyncInterfaces | 7.0.0 | 8.0.0 |
+| Microsoft.CodeAnalysis.CSharp | 4.2.0 | 4.5.0 |
+| Microsoft.Data.Sqlite | 7.0.0 | 8.0.0 |
+| Microsoft.EntityFrameworkCore | 7.0.10 | 8.0.0 |
+| Microsoft.EntityFrameworkCore.Design | 7.0.0 | 8.0.0 |
+| Microsoft.EntityFrameworkCore.InMemory | 7.0.10 | 8.0.0 |
+| Microsoft.EntityFrameworkCore.Proxies | 7.0.10 | 8.0.0 |
+| Microsoft.EntityFrameworkCore.Relational | 7.0.10 | 8.0.0 |
+| Microsoft.EntityFrameworkCore.Sqlite | 7.0.10 | 8.0.0 |
+| Microsoft.EntityFrameworkCore.SqlServer | 7.0.0 | 8.0.0 |
+| Microsoft.EntityFrameworkCore.Tools | 7.0.1 | 8.0.0 |
+| Microsoft.Extensions.Caching.Memory | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Caching.StackExchangeRedis | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Configuration.Binder | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Configuration.CommandLine | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Configuration.EnvironmentVariables | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Configuration.UserSecrets | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.DependencyInjection | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.DependencyInjection.Abstractions | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.FileProviders.Composite | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.FileProviders.Embedded | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.FileProviders.Physical | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.FileSystemGlobbing | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Hosting | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Hosting.Abstractions | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Http | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Http.Polly| 7.0.10 | 8.0.0 |
+| Microsoft.Extensions.Identity.Core | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Localization | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Logging | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Logging.Console | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Options | 7.0.0 | 8.0.0 |
+| Microsoft.Extensions.Options.ConfigurationExtensions | 7.0.0 | 8.0.0 |
+| Microsoft.NET.Test.Sdk | 17.2.0 | 17.8.0 |
+| Microsoft.VisualStudio.Web.CodeGeneration.Design | 7.0.0 | 8.0.0 |
+| Minio | 4.0.6 | 6.0.1 |
+| MongoDB.Driver | 2.19.1 | 2.22.0 |
+| NEST | 7.14.1 | 7.17.5 |
+| Newtonsoft.Json | 13.0.1 | 13.0.3 |
+| NSubstitute | 4.3.0 | 5.1.0 |
+| NuGet.Versioning | 5.11.0 | 6.7.0 |
+| NUglify | 1.20.0 | 1.21.0 |
+| Npgsql.EntityFrameworkCore.PostgreSQL | 7.0.0 | 8.0.0 |
+| NSubstitute.Analyzers.CSharp | 1.0.15 | 1.0.16 |
+| Octokit | 0.50.0 | 9.0.0 |
+| OpenIddict.Abstractions | 4.8.0 | 4.10.0 |
+| OpenIddict.Core | 4.8.0 | 4.10.0 |
+| OpenIddict.Server.AspNetCore | 4.8.0 | 4.10.0 |
+| OpenIddict.Validation.AspNetCore | 4.8.0 | 4.10.0 |
+| OpenIddict.Validation.ServerIntegration | 4.8.0 | 4.10.0 |
+| Oracle.EntityFrameworkCore | 7.21.8 | 7.21.12 |
+| Polly | 7.2.3 | 8.2.0 |
+| Pomelo.EntityFrameworkCore.MySql | 7.0.0 | 8.0.0-beta.2 |
+| Quartz | 3.4.0 | 3.7.0 |
+| Quartz.Extensions.DependencyInjection | 3.4.0 | 3.7.0 |
+| Quartz.Plugins.TimeZoneConverter | 3.4.0 | 3.7.0 |
+| Quartz.Serialization.Json | 3.3.3 | 3.7.0 |
+| RabbitMQ.Client | 6.3.0 | 6.6.0 |
+| Rebus | 6.6.5 | 8.0.1 |
+| Rebus.ServiceProvider | 7.0.0 | 10.0.0 |
+| Scriban | 5.4.4 | 5.9.0 |
+| Serilog | 2.11.0 | 3.1.1 |
+| Serilog.AspNetCore | 5.0.0 | 8.0.0 |
+| Serilog.Extensions.Hosting | 3.1.0 | 8.0.0 |
+| Serilog.Extensions.Logging | 3.1.0 | 8.0.0 |
+| Serilog.Sinks.Async | 1.4.0 | 1.5.0 |
+| Serilog.Sinks.Console | 3.1.1 | 5.0.0 |
+| Serilog.Sinks.File | 4.1.0 | 5.0.0 |
+| SharpZipLib | 1.3.3 | 1.4.2 |
+| Shouldly | 4.0.3 | 4.2.1 |
+| SixLabors.ImageSharp.Drawing | 2.0.0 | 2.0.1 |
+| Slugify.Core | 3.0.0 | 4.0.1 |
+| StackExchange.Redis | 2.6.122 | 2.7.4 |
+| Swashbuckle.AspNetCore | 6.2.1 | 6.5.0 |
+| System.Collections.Immutable | 7.0.0 | 8.0.0 |
+| System.Linq.Dynamic.Core | 1.3.3 | 1.3.5 |
+| System.Security.Permissions | 7.0.0 | 8.0.0 |
+| System.Text.Encoding.CodePages | 7.0.0 | 8.0.0 |
+| System.Text.Encodings.Web | 7.0.0 | 8.0.0 |
+| System.Text.Json | 7.0.0 | 8.0.0 |
+| TimeZoneConverter | 5.0.0 | 6.1.0 |
+| xunit | 2.4.1 | 2.6.1 |
+| xunit.extensibility.execution | 2.4.1 | 2.6.1 |
+| xunit.runner.visualstudio | 2.4.5 | 2.5.3 |
diff --git a/docs/en/Migration-Guides/Index.md b/docs/en/Migration-Guides/Index.md
index 88a2087ba0..e7dfa97f86 100644
--- a/docs/en/Migration-Guides/Index.md
+++ b/docs/en/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).
+- [7.x to 8.0](Abp-8_0.md)
- [7.3 to 7.4](Abp-7_4.md)
- [7.2 to 7.3](Abp-7_3.md)
- [7.1 to 7.2](Abp-7_2.md)
diff --git a/docs/en/Migration-Guides/images/integration-postfix-not-removed.png b/docs/en/Migration-Guides/images/integration-postfix-not-removed.png
new file mode 100644
index 0000000000..183a7a57c2
Binary files /dev/null and b/docs/en/Migration-Guides/images/integration-postfix-not-removed.png differ
diff --git a/docs/en/Modules/OpenIddict.md b/docs/en/Modules/OpenIddict.md
index 20098eb975..ef8dfe92ef 100644
--- a/docs/en/Modules/OpenIddict.md
+++ b/docs/en/Modules/OpenIddict.md
@@ -349,7 +349,7 @@ public class MyClaimDestinationsHandler : IAbpOpenIddictClaimsPrincipalHandler,
}
}
-Configure(options =>
+Configure(options =>
{
options.ClaimsPrincipalHandlers.Add();
});
diff --git a/docs/en/Road-Map.md b/docs/en/Road-Map.md
index e711dba5b2..05e071371a 100644
--- a/docs/en/Road-Map.md
+++ b/docs/en/Road-Map.md
@@ -4,17 +4,18 @@ This document provides a road map, release schedule and planned features for the
## Next Versions
-### v8.0
+### v8.1
-The next version will be 8.0 and planned to release the stable 8.0 version in December, 2023. We will be mostly working on the following topics:
+The next version will be 8.1 and planned to release the stable 8.1 version in February, 2024. We will be mostly working on the following topics:
-* Enabling nullable annotations for all projects ([#16610](https://github.com/abpframework/abp/issues/16610))
-* Upgrade to .NET 8.0 ([#17355](https://github.com/abpframework/abp/issues/17355))
-* Use NoTracking for readonly repositories for EF Core ([#597](https://github.com/abpframework/abp/issues/597))
-* Support mapping collection of objects for custom object mappers ([#94](https://github.com/abpframework/abp/issues/94))
+* Blazor Full-Stack UI ([#16156](https://github.com/abpframework/abp/issues/16156))
+* Upgrade to OpenIddict 5.x ([#17605](https://github.com/abpframework/abp/issues/17605))
+* Angular Universal ([#15782](https://github.com/abpframework/abp/issues/15782))
+* Blazor - Forms & Validation Documentation ([#16400](https://github.com/abpframework/abp/issues/16400))
+* Deployment Documents Improvements ([#15034](https://github.com/abpframework/abp/issues/15034))
* Improvements on the existing features and provide more guides.
-See the [8.0 milestone](https://github.com/abpframework/abp/milestone/88) for all the issues we've planned to work on.
+See the [8.1 milestone](https://github.com/abpframework/abp/milestone/94) for all the issues we've planned to work on.
## Backlog Items
diff --git a/docs/en/Themes/LeptonXLite/Blazor.md b/docs/en/Themes/LeptonXLite/Blazor.md
index bcf6efb4d6..d2565bea40 100644
--- a/docs/en/Themes/LeptonXLite/Blazor.md
+++ b/docs/en/Themes/LeptonXLite/Blazor.md
@@ -135,13 +135,17 @@ builder.RootComponents.Add("#ApplicationContainer");
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Main Layout";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMainLayout.razor.cs`, in your blazor application as shown below:
```csharp
[ExposeServices(typeof(MainLayout))]
-[Dependency(ReplaceServices = true)
+[Dependency(ReplaceServices = true)]
namespace LeptonXLite.DemoApp.Blazor.MyComponents
{
public partial class MyMainLayout
@@ -152,6 +156,7 @@ namespace LeptonXLite.DemoApp.Blazor.MyComponents
```
> Don't forget to remove the repeated attributes from the razor page!
+> Don't forget to remove the `@code` section from the razor page!
### Toolbars
@@ -206,6 +211,10 @@ The **branding component** is a simple component that can be used to display you
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Branding Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyBrandingComponent.razor.cs`, in your blazor application as shown below:
@@ -243,6 +252,10 @@ On websites that have a lot of pages, **breadcrumb navigation** can greatly **en
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Breadcrumbs Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyBreadcrumbsComponent.razor.cs`, in your blazor application as shown below:
@@ -281,6 +294,10 @@ Sidebar menus have been used as **a directory for Related Pages** for a **Servic
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Main Menu Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMainMenu.razor.cs`, in your blazor application as shown below:
@@ -319,6 +336,10 @@ Toolbar items are used to add **extra functionality to the toolbar**. The toolba
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Toolbar Items Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyToolbarItemsComponent.razor.cs`, in your blazor application as shown below:
@@ -357,6 +378,10 @@ Think about a **multi-lingual** website and the first thing that could **hit you
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Language Switch Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyLanguageSwitchComponent.razor.cs`, in your blazor application as shown below:
@@ -395,6 +420,10 @@ The **mobile** **language switch component** is used to switch the language of t
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Mobile Language Switch Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMobilLanguageSwitchComponent.razor.cs`, in your blazor application as shown below:
@@ -433,6 +462,10 @@ The **User Menu** is the **menu** that **drops down** when you **click your name
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My User Menu Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyUserMenuComponent.razor.cs`, in your blazor application as shown below:
@@ -471,6 +504,10 @@ The **mobile user menu component** is used to display the **user menu on mobile
@attribute [Dependency(ReplaceServices = true)]
@Name
+
+@code {
+ string Name = "My Mobile User Menu Component";
+}
```
* If you prefer to use a code-behind file for the C# code of your component, create a razor component, like `MyMobileUserMenuComponent.razor.cs`, in your blazor application as shown below:
diff --git a/docs/en/UI/Angular/CapsLock.directive.md b/docs/en/UI/Angular/Caps-Lock-Directive.md
similarity index 100%
rename from docs/en/UI/Angular/CapsLock.directive.md
rename to docs/en/UI/Angular/Caps-Lock-Directive.md
diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json
index fa0a98915a..23180bdb06 100644
--- a/docs/en/docs-nav.json
+++ b/docs/en/docs-nav.json
@@ -178,7 +178,13 @@
},
{
"text": "Authorization",
- "path": "Authorization.md"
+ "path": "Authorization.md",
+ "items": [
+ {
+ "text": "Dynamic Claims",
+ "path": "Dynamic-Claims.md"
+ }
+ ]
},
{
"text": "Caching",
@@ -1122,6 +1128,14 @@
"text": "Loading Directive",
"path": "UI/Angular/Loading-Directive.md"
},
+ {
+ "text": "Show Password Directive",
+ "path": "UI/Angular/Show-Password-Directive.md"
+ },
+ {
+ "text": "Caps Lock Directive",
+ "path": "UI/Angular/Caps-Lock-Directive.md"
+ },
{
"text": "Toast Overlay",
"path": "UI/Angular/Toaster-Service.md"
diff --git a/docs/zh-Hans/Dapr/Index.md b/docs/zh-Hans/Dapr/Index.md
index 64a9451737..a5237cbb71 100644
--- a/docs/zh-Hans/Dapr/Index.md
+++ b/docs/zh-Hans/Dapr/Index.md
@@ -60,29 +60,6 @@ Configure(options =>
}
````
-### 注入DaprClient
-
-ABP 将 `DaprClient` 类注册到 [依赖注入](../Dependency-Injection.md) 系统中.因此,你可以在需要时注入并使用它:
-
-````csharp
-public class MyService : ITransientDependency
-{
- private readonly DaprClient _daprClient;
-
- public MyService(DaprClient daprClient)
- {
- _daprClient = daprClient;
- }
-
- public async Task DoItAsync()
- {
- // TODO: Use the injected _daprClient object
- }
-}
-````
-
-注入 `DaprClient` 是在应用程序代码中使用它的推荐方法.当你注入它时,将使用 `IAbpDaprClientFactory` 服务创建它,这会在下一节中将进行说明.
-
### IAbpDaprClientFactory
`IAbpDaprClientFactory` 可用于创建 `DaprClient` 或 `HttpClient` 对象来执行对 Dapr 的操作.它使用 `AbpDaprOptions`,因此你可以配置设置.
@@ -113,15 +90,14 @@ public class MyService : ITransientDependency
});
// Create an HttpClient object
- HttpClient httpClient = await _daprClientFactory
- .CreateHttpClientAsync("target-app-id");
+ HttpClient httpClient = await _daprClientFactory.CreateHttpClientAsync("target-app-id");
}
}
````
`CreateHttpClientAsync` 方法还获取可选的 `daprEndpoint` 和 `daprApiToken` 参数.
-> ABP使用`IAbpDaprClientFactory`创建Dapr客户端.你也可以在应用程序中使用Dapr API创建客户端对象.推荐使用`IAbpDaprClientFactory`,但不是必需的.
+> 你可以在应用程序中使用Dapr API创建客户端对象.推荐使用`IAbpDaprClientFactory`,但不是必需的.
## C# API 客户端代理集成
@@ -412,7 +388,7 @@ Configure(options =>
}
````
-一旦你设置了它,它就会在你注入`DaprClient`或使用`IAbpDaprClientFactory`时使用.如果你需要在应用程序中使用该值,你可以注入`IDaprApiTokenProvider`并使用其`GetDaprApiToken()`方法.
+一旦你设置了它,它就会在使用`IAbpDaprClientFactory`时使用.如果你需要在应用程序中使用该值,你可以注入`IDaprApiTokenProvider`并使用其`GetDaprApiToken()`方法.
### App API Token
diff --git a/docs/zh-Hans/Dependency-Injection.md b/docs/zh-Hans/Dependency-Injection.md
index 2c22c123ab..4cc6616f52 100644
--- a/docs/zh-Hans/Dependency-Injection.md
+++ b/docs/zh-Hans/Dependency-Injection.md
@@ -310,6 +310,24 @@ public class AppModule : AbpModule
> 注意, 如果服务类公开了多于一个服务或接口, `OnRegistered` 回调(callback)可能被同一服务类多次调用. 因此, 较安全的方法是使用 `Interceptors.TryAdd` 方法而不是 `Interceptors.Add` 方法. 请参阅动态代理(dynamic proxying)/拦截器 [文档](Dynamic-Proxying-Interceptors.md).
+### IServiceCollection.OnActivated 事件
+
+一旦服务完全构建完成`OnActivated`事件就会触发. 你可以执行依赖于服务已完全构建的的一些任务, 虽然这种情况可能很少见.
+
+````csharp
+var serviceDescriptor = ServiceDescriptor.Transient();
+services.Add(serviceDescriptor);
+if (setIsReadOnly)
+{
+ services.OnActivated(serviceDescriptor, x =>
+ {
+ x.Instance.As().IsReadOnly = true;
+ });
+}
+````
+
+> 注意,`OnActivated`事件可以为一个`ServiceDescriptor`注册多次.
+
## 第三方提供程序
虽然ABP框架没有对任何第三方DI提供程序的核心依赖, 但它必须使用一个提供程序来支持动态代理(dynamic proxying)和一些高级特性以便ABP特性能正常工作.
diff --git a/docs/zh-Hans/Local-Event-Bus.md b/docs/zh-Hans/Local-Event-Bus.md
index 9d7eb4b766..7a842a9e98 100644
--- a/docs/zh-Hans/Local-Event-Bus.md
+++ b/docs/zh-Hans/Local-Event-Bus.md
@@ -197,33 +197,20 @@ namespace AbpDemo
这个类订阅 `EntityCreatedEventData`,它在用户创建后发布. 你可能需要向新用户发送一封"欢迎"电子邮件.
-这些事件有两种类型:过去时态的事件和进行时态的事件.
-
-### 用过去时态事件
-
-当相关工作单元完成且实体更改成功保存到数据库时,将发布带有过去时态的事件. 如果在这些事件处理程序上抛出异常,则**无法回滚**事务,因为事务已经提交.
-
-事件类型;
+有以下预定义的事件类型;
* `EntityCreatedEventData` 当实体创建成功后发布.
* `EntityUpdatedEventData` 当实体更新成功后发布.
* `EntityDeletedEventData` 当实体删除成功后发布.
* `EntityChangedEventData` 当实体创建,更新,删除后发布. 如果你需要监听任何类型的更改,它是一种快捷方式 - 而不是订阅单个事件.
-### 用于进行时态事件
-
-带有进行时态的事件在完成事务之前发布(如果数据库事务由所使用的数据库提供程序支持). 如果在这些事件处理程序上抛出异常,它**会回滚**事务,因为事务还没有完成,更改也没有保存到数据库中.
-
-事件类型;
-
-* `EntityCreatingEventData` 当新实体保存到数据库前发布.
-* `EntityUpdatingEventData` 当已存在实体更新到数据库前发布.
-* `EntityDeletingEventData` 删除实体前发布.
-* `EntityChangingEventData` 当实体创建,更新,删除前发布. 如果你需要监听任何类型的更改,它是一种快捷方式 - 而不是订阅单个事件.
-
-#### 它是如何实现的?
+### 它是如何实现的?
在将更改保存到数据库时发布预构建事件;
* 对于 EF Core, 他们在 `DbContext.SaveChanges` 发布.
* 对于 MongoDB, 在你调用仓储的 `InsertAsync`, `UpdateAsync` 或 `DeleteAsync` 方法发布(因为MongoDB没有更改追踪系统).
+
+## 另请参阅
+
+* [分布式事件总线](Distributed-Event-Bus.md)
\ No newline at end of file
diff --git a/framework/Volo.Abp.abpmdl.json b/framework/Volo.Abp.abpmdl
similarity index 76%
rename from framework/Volo.Abp.abpmdl.json
rename to framework/Volo.Abp.abpmdl
index 68e65c4975..afc52ca801 100644
--- a/framework/Volo.Abp.abpmdl.json
+++ b/framework/Volo.Abp.abpmdl
@@ -7,839 +7,839 @@
},
"packages": {
"AbpTestBase": {
- "path": "test/AbpTestBase/AbpTestBase.abppkg.json",
+ "path": "test/AbpTestBase/AbpTestBase.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore": {
- "path": "src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Tests": {
- "path": "test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.MultiTenancy.Tests": {
- "path": "test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.abppkg.json",
+ "path": "test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.MultiTenancy": {
- "path": "src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.MultiTenancy.Tests": {
- "path": "test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.TestBase": {
- "path": "src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.abppkg",
"folder": "src"
},
"Volo.Abp.EntityFrameworkCore": {
- "path": "src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.abppkg.json",
+ "path": "src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc": {
- "path": "src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.abppkg",
"folder": "src"
},
"Volo.Abp.TestBase": {
- "path": "src/Volo.Abp.TestBase/Volo.Abp.TestBase.abppkg.json",
+ "path": "src/Volo.Abp.TestBase/Volo.Abp.TestBase.abppkg",
"folder": "src"
},
"Volo.Abp.MongoDB": {
- "path": "src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.abppkg.json",
+ "path": "src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI.Bootstrap": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.abppkg",
"folder": "src"
},
"Volo.Abp.Autofac": {
- "path": "src/Volo.Abp.Autofac/Volo.Abp.Autofac.abppkg.json",
+ "path": "src/Volo.Abp.Autofac/Volo.Abp.Autofac.abppkg",
"folder": "src"
},
"Volo.Abp.Castle.Core": {
- "path": "src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.abppkg.json",
+ "path": "src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.abppkg",
"folder": "src"
},
"Volo.Abp.Autofac.Tests": {
- "path": "test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Castle.Core.Tests": {
- "path": "test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AutoMapper": {
- "path": "src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.abppkg.json",
+ "path": "src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.abppkg",
"folder": "src"
},
"Volo.Abp.AutoMapper.Tests": {
- "path": "test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Mvc.Tests": {
- "path": "test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.TestApp": {
- "path": "test/Volo.Abp.TestApp/Volo.Abp.TestApp.abppkg.json",
+ "path": "test/Volo.Abp.TestApp/Volo.Abp.TestApp.abppkg",
"folder": "test"
},
"Volo.Abp.MemoryDb": {
- "path": "src/Volo.Abp.MemoryDb/Volo.Abp.MemoryDb.abppkg.json",
+ "path": "src/Volo.Abp.MemoryDb/Volo.Abp.MemoryDb.abppkg",
"folder": "src"
},
"Volo.Abp.MemoryDb.Tests": {
- "path": "test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.abppkg.json",
+ "path": "test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.TestApp.Tests": {
- "path": "test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.abppkg.json",
+ "path": "test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Http": {
- "path": "src/Volo.Abp.Http/Volo.Abp.Http.abppkg.json",
+ "path": "src/Volo.Abp.Http/Volo.Abp.Http.abppkg",
"folder": "src"
},
"Volo.Abp.Http.Client": {
- "path": "src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.abppkg.json",
+ "path": "src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.abppkg",
"folder": "src"
},
"Volo.Abp.Http.Client.Tests": {
- "path": "test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.EntityFrameworkCore.Tests": {
- "path": "test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.abppkg.json",
+ "path": "test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.abppkg",
"folder": "test"
},
"SimpleConsoleDemo": {
- "path": "test/SimpleConsoleDemo/SimpleConsoleDemo.abppkg.json",
+ "path": "test/SimpleConsoleDemo/SimpleConsoleDemo.abppkg",
"folder": "test"
},
"Volo.Abp.EntityFrameworkCore.Tests.SecondContext": {
- "path": "test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.abppkg.json",
+ "path": "test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Mvc.Versioning.Tests": {
- "path": "test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.VirtualFileSystem": {
- "path": "src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.abppkg.json",
+ "path": "src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.abppkg",
"folder": "src"
},
"Volo.Abp.VirtualFileSystem.Tests": {
- "path": "test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.abppkg.json",
+ "path": "test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Core": {
- "path": "src/Volo.Abp.Core/Volo.Abp.Core.abppkg.json",
+ "path": "src/Volo.Abp.Core/Volo.Abp.Core.abppkg",
"folder": "src"
},
"Volo.Abp.Localization": {
- "path": "src/Volo.Abp.Localization/Volo.Abp.Localization.abppkg.json",
+ "path": "src/Volo.Abp.Localization/Volo.Abp.Localization.abppkg",
"folder": "src"
},
"Volo.Abp.Localization.Tests": {
- "path": "test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Core.Tests": {
- "path": "test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.ApiVersioning.Abstractions": {
- "path": "src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.Data": {
- "path": "src/Volo.Abp.Data/Volo.Abp.Data.abppkg.json",
+ "path": "src/Volo.Abp.Data/Volo.Abp.Data.abppkg",
"folder": "src"
},
"Volo.Abp.Data.Tests": {
- "path": "test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.MultiTenancy": {
- "path": "src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.abppkg.json",
+ "path": "src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.abppkg",
"folder": "src"
},
"Volo.Abp.ObjectMapping": {
- "path": "src/Volo.Abp.ObjectMapping/Volo.Abp.ObjectMapping.abppkg.json",
+ "path": "src/Volo.Abp.ObjectMapping/Volo.Abp.ObjectMapping.abppkg",
"folder": "src"
},
"Volo.Abp.Validation": {
- "path": "src/Volo.Abp.Validation/Volo.Abp.Validation.abppkg.json",
+ "path": "src/Volo.Abp.Validation/Volo.Abp.Validation.abppkg",
"folder": "src"
},
"Volo.Abp.Validation.Tests": {
- "path": "test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Security": {
- "path": "src/Volo.Abp.Security/Volo.Abp.Security.abppkg.json",
+ "path": "src/Volo.Abp.Security/Volo.Abp.Security.abppkg",
"folder": "src"
},
"Volo.Abp.Guids": {
- "path": "src/Volo.Abp.Guids/Volo.Abp.Guids.abppkg.json",
+ "path": "src/Volo.Abp.Guids/Volo.Abp.Guids.abppkg",
"folder": "src"
},
"Volo.Abp.Threading": {
- "path": "src/Volo.Abp.Threading/Volo.Abp.Threading.abppkg.json",
+ "path": "src/Volo.Abp.Threading/Volo.Abp.Threading.abppkg",
"folder": "src"
},
"Volo.Abp.Ddd.Tests": {
- "path": "test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Http.Abstractions": {
- "path": "src/Volo.Abp.Http.Abstractions/Volo.Abp.Http.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.Http.Abstractions/Volo.Abp.Http.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.Authorization": {
- "path": "src/Volo.Abp.Authorization/Volo.Abp.Authorization.abppkg.json",
+ "path": "src/Volo.Abp.Authorization/Volo.Abp.Authorization.abppkg",
"folder": "src"
},
"Volo.Abp.Json": {
- "path": "src/Volo.Abp.Json/Volo.Abp.Json.abppkg.json",
+ "path": "src/Volo.Abp.Json/Volo.Abp.Json.abppkg",
"folder": "src"
},
"Volo.Abp.Timing": {
- "path": "src/Volo.Abp.Timing/Volo.Abp.Timing.abppkg.json",
+ "path": "src/Volo.Abp.Timing/Volo.Abp.Timing.abppkg",
"folder": "src"
},
"Volo.Abp.UI": {
- "path": "src/Volo.Abp.UI/Volo.Abp.UI.abppkg.json",
+ "path": "src/Volo.Abp.UI/Volo.Abp.UI.abppkg",
"folder": "src"
},
"Volo.Abp.UI.Navigation": {
- "path": "src/Volo.Abp.UI.Navigation/Volo.Abp.UI.Navigation.abppkg.json",
+ "path": "src/Volo.Abp.UI.Navigation/Volo.Abp.UI.Navigation.abppkg",
"folder": "src"
},
"Volo.Abp.UI.Navigation.Tests": {
- "path": "test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.abppkg.json",
+ "path": "test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Settings": {
- "path": "src/Volo.Abp.Settings/Volo.Abp.Settings.abppkg.json",
+ "path": "src/Volo.Abp.Settings/Volo.Abp.Settings.abppkg",
"folder": "src"
},
"Volo.Abp.Caching": {
- "path": "src/Volo.Abp.Caching/Volo.Abp.Caching.abppkg.json",
+ "path": "src/Volo.Abp.Caching/Volo.Abp.Caching.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus": {
- "path": "src/Volo.Abp.EventBus/Volo.Abp.EventBus.abppkg.json",
+ "path": "src/Volo.Abp.EventBus/Volo.Abp.EventBus.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus.Tests": {
- "path": "test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.abppkg.json",
+ "path": "test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Caching.Tests": {
- "path": "test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Serialization": {
- "path": "src/Volo.Abp.Serialization/Volo.Abp.Serialization.abppkg.json",
+ "path": "src/Volo.Abp.Serialization/Volo.Abp.Serialization.abppkg",
"folder": "src"
},
"Volo.Abp.Serialization.Tests": {
- "path": "test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Authorization.Tests": {
- "path": "test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Authentication.OAuth": {
- "path": "src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Authentication.OAuth.Tests": {
- "path": "test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Uow": {
- "path": "src/Volo.Abp.Uow/Volo.Abp.Uow.abppkg.json",
+ "path": "src/Volo.Abp.Uow/Volo.Abp.Uow.abppkg",
"folder": "src"
},
"Volo.Abp.Uow.Tests": {
- "path": "test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Ddd.Domain": {
- "path": "src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.abppkg.json",
+ "path": "src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.abppkg",
"folder": "src"
},
"Volo.Abp.Ddd.Application": {
- "path": "src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.abppkg.json",
+ "path": "src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.abppkg",
"folder": "src"
},
"Volo.Abp.Auditing": {
- "path": "src/Volo.Abp.Auditing/Volo.Abp.Auditing.abppkg.json",
+ "path": "src/Volo.Abp.Auditing/Volo.Abp.Auditing.abppkg",
"folder": "src"
},
"Volo.Abp.Auditing.Tests": {
- "path": "test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.MongoDB.Tests": {
- "path": "test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.abppkg.json",
+ "path": "test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.EntityFrameworkCore.SqlServer": {
- "path": "src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.abppkg.json",
+ "path": "src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus.RabbitMQ": {
- "path": "src/Volo.Abp.EventBus.RabbitMQ/Volo.Abp.EventBus.RabbitMQ.abppkg.json",
+ "path": "src/Volo.Abp.EventBus.RabbitMQ/Volo.Abp.EventBus.RabbitMQ.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI.Tests": {
- "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Emailing": {
- "path": "src/Volo.Abp.Emailing/Volo.Abp.Emailing.abppkg.json",
+ "path": "src/Volo.Abp.Emailing/Volo.Abp.Emailing.abppkg",
"folder": "src"
},
"Volo.Abp.Sms": {
- "path": "src/Volo.Abp.Sms/Volo.Abp.Sms.abppkg.json",
+ "path": "src/Volo.Abp.Sms/Volo.Abp.Sms.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI.Bundling": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI.Packages": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.abppkg",
"folder": "src"
},
"Volo.Abp.EntityFrameworkCore.MySQL": {
- "path": "src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.abppkg.json",
+ "path": "src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.abppkg",
"folder": "src"
},
"Volo.Abp.BackgroundJobs": {
- "path": "src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.abppkg",
"folder": "src"
},
"Volo.Abp.BackgroundWorkers": {
- "path": "src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.abppkg",
"folder": "src"
},
"Volo.Abp.BackgroundJobs.Tests": {
- "path": "test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.abppkg.json",
+ "path": "test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.BackgroundJobs.Abstractions": {
- "path": "src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.BackgroundJobs.HangFire": {
- "path": "src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.abppkg",
"folder": "src"
},
"Volo.Abp.HangFire": {
- "path": "src/Volo.Abp.HangFire/Volo.Abp.HangFire.abppkg.json",
+ "path": "src/Volo.Abp.HangFire/Volo.Abp.HangFire.abppkg",
"folder": "src"
},
"Volo.Abp.BackgroundJobs.RabbitMQ": {
- "path": "src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.abppkg",
"folder": "src"
},
"Volo.Abp.RabbitMQ": {
- "path": "src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.abppkg.json",
+ "path": "src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.abppkg",
"folder": "src"
},
"Volo.Abp.Emailing.Tests": {
- "path": "test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.abppkg",
"folder": "src"
},
"Volo.Abp.EntityFrameworkCore.PostgreSql": {
- "path": "src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.abppkg.json",
+ "path": "src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.abppkg",
"folder": "src"
},
"Volo.Abp.Localization.Abstractions": {
- "path": "src/Volo.Abp.Localization.Abstractions/Volo.Abp.Localization.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.Localization.Abstractions/Volo.Abp.Localization.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.Security.Tests": {
- "path": "test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Settings.Tests": {
- "path": "test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Http.Client.IdentityModel": {
- "path": "src/Volo.Abp.Http.Client.IdentityModel/Volo.Abp.Http.Client.IdentityModel.abppkg.json",
+ "path": "src/Volo.Abp.Http.Client.IdentityModel/Volo.Abp.Http.Client.IdentityModel.abppkg",
"folder": "src"
},
"Volo.Abp.IdentityModel": {
- "path": "src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.abppkg.json",
+ "path": "src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.Client": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.Contracts": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.abppkg",
"folder": "src"
},
"Volo.Abp.Features": {
- "path": "src/Volo.Abp.Features/Volo.Abp.Features.abppkg.json",
+ "path": "src/Volo.Abp.Features/Volo.Abp.Features.abppkg",
"folder": "src"
},
"Volo.Abp.Features.Tests": {
- "path": "test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Authentication.JwtBearer": {
- "path": "src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.abppkg",
"folder": "src"
},
"Volo.Abp.Cli": {
- "path": "src/Volo.Abp.Cli/Volo.Abp.Cli.abppkg.json",
+ "path": "src/Volo.Abp.Cli/Volo.Abp.Cli.abppkg",
"folder": "src"
},
"Volo.Abp.FluentValidation": {
- "path": "src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.abppkg.json",
+ "path": "src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.abppkg",
"folder": "src"
},
"Volo.Abp.FluentValidation.Tests": {
- "path": "test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.abppkg.json",
+ "path": "test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.EntityFrameworkCore.Sqlite": {
- "path": "src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.abppkg.json",
+ "path": "src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.abppkg",
"folder": "src"
},
"Volo.Abp.Cli.Core": {
- "path": "src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.abppkg.json",
+ "path": "src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.abppkg",
"folder": "src"
},
"Volo.Abp.Specifications": {
- "path": "src/Volo.Abp.Specifications/Volo.Abp.Specifications.abppkg.json",
+ "path": "src/Volo.Abp.Specifications/Volo.Abp.Specifications.abppkg",
"folder": "src"
},
"Volo.Abp.Specifications.Tests": {
- "path": "test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Cli.Core.Tests": {
- "path": "test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Mvc.UI.Widgets": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.abppkg",
"folder": "src"
},
"Volo.Abp.Ldap": {
- "path": "src/Volo.Abp.Ldap/Volo.Abp.Ldap.abppkg.json",
+ "path": "src/Volo.Abp.Ldap/Volo.Abp.Ldap.abppkg",
"folder": "src"
},
"Volo.Abp.Ldap.Tests": {
- "path": "test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Dapper": {
- "path": "src/Volo.Abp.Dapper/Volo.Abp.Dapper.abppkg.json",
+ "path": "src/Volo.Abp.Dapper/Volo.Abp.Dapper.abppkg",
"folder": "src"
},
"Volo.Abp.Dapper.Tests": {
- "path": "test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.MailKit": {
- "path": "src/Volo.Abp.MailKit/Volo.Abp.MailKit.abppkg.json",
+ "path": "src/Volo.Abp.MailKit/Volo.Abp.MailKit.abppkg",
"folder": "src"
},
"Volo.Abp.MailKit.Tests": {
- "path": "test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.abppkg.json",
+ "path": "test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.ObjectMapping.Tests": {
- "path": "test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.abppkg.json",
+ "path": "test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Ddd.Application.Contracts": {
- "path": "src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.abppkg.json",
+ "path": "src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.abppkg",
"folder": "src"
},
"Volo.Abp.Minify": {
- "path": "src/Volo.Abp.Minify/Volo.Abp.Minify.abppkg.json",
+ "path": "src/Volo.Abp.Minify/Volo.Abp.Minify.abppkg",
"folder": "src"
},
"Volo.Abp.Minify.Tests": {
- "path": "test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Serilog": {
- "path": "src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Serilog.Tests": {
- "path": "test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Http.Client.IdentityModel.Web": {
- "path": "src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.abppkg.json",
+ "path": "src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.abppkg",
"folder": "src"
},
"Volo.Abp.BackgroundJobs.Quartz": {
- "path": "src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.abppkg",
"folder": "src"
},
"Volo.Abp.Quartz": {
- "path": "src/Volo.Abp.Quartz/Volo.Abp.Quartz.abppkg.json",
+ "path": "src/Volo.Abp.Quartz/Volo.Abp.Quartz.abppkg",
"folder": "src"
},
"Volo.Abp.BackgroundWorkers.Quartz": {
- "path": "src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.abppkg",
"folder": "src"
},
"Volo.Abp.Http.Client.IdentityModel.Web.Tests": {
- "path": "test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.ObjectExtending": {
- "path": "src/Volo.Abp.ObjectExtending/Volo.Abp.ObjectExtending.abppkg.json",
+ "path": "src/Volo.Abp.ObjectExtending/Volo.Abp.ObjectExtending.abppkg",
"folder": "src"
},
"Volo.Abp.ObjectExtending.Tests": {
- "path": "test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.abppkg.json",
+ "path": "test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.TextTemplating": {
- "path": "src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.abppkg.json",
+ "path": "src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.abppkg",
"folder": "src"
},
"Volo.Abp.TextTemplating.Tests": {
- "path": "test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.abppkg.json",
+ "path": "test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Validation.Abstractions": {
- "path": "src/Volo.Abp.Validation.Abstractions/Volo.Abp.Validation.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.Validation.Abstractions/Volo.Abp.Validation.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.SignalR": {
- "path": "src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.SignalR.Tests": {
- "path": "test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests": {
- "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.BlobStoring": {
- "path": "src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.abppkg.json",
+ "path": "src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.abppkg",
"folder": "src"
},
"Volo.Abp.BlobStoring.Tests": {
- "path": "test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.abppkg.json",
+ "path": "test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.BlobStoring.FileSystem": {
- "path": "src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.abppkg.json",
+ "path": "src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.abppkg",
"folder": "src"
},
"Volo.Abp.BlobStoring.FileSystem.Tests": {
- "path": "test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.abppkg.json",
+ "path": "test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.EntityFrameworkCore.Oracle.Devart": {
- "path": "src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.abppkg.json",
+ "path": "src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.abppkg",
"folder": "src"
},
"Volo.Abp.BlobStoring.Azure": {
- "path": "src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.abppkg.json",
+ "path": "src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.abppkg",
"folder": "src"
},
"Volo.Abp.BlobStoring.Azure.Tests": {
- "path": "test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.abppkg.json",
+ "path": "test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.BlobStoring.Minio": {
- "path": "src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.abppkg.json",
+ "path": "src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.abppkg",
"folder": "src"
},
"Volo.Abp.BlobStoring.Minio.Tests": {
- "path": "test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.abppkg.json",
+ "path": "test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.EntityFrameworkCore.Oracle": {
- "path": "src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.abppkg.json",
+ "path": "src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.abppkg",
"folder": "src"
},
"Volo.Abp.Caching.StackExchangeRedis": {
- "path": "src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.abppkg.json",
+ "path": "src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.abppkg",
"folder": "src"
},
"Volo.Abp.Caching.StackExchangeRedis.Tests": {
- "path": "test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.BlobStoring.Aliyun": {
- "path": "src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.abppkg.json",
+ "path": "src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.abppkg",
"folder": "src"
},
"Volo.Abp.BlobStoring.Aliyun.Tests": {
- "path": "test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.abppkg.json",
+ "path": "test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.BlobStoring.Aws": {
- "path": "src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.abppkg.json",
+ "path": "src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.abppkg",
"folder": "src"
},
"Volo.Abp.BlobStoring.Aws.Tests": {
- "path": "test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.abppkg.json",
+ "path": "test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Kafka": {
- "path": "src/Volo.Abp.Kafka/Volo.Abp.Kafka.abppkg.json",
+ "path": "src/Volo.Abp.Kafka/Volo.Abp.Kafka.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus.Kafka": {
- "path": "src/Volo.Abp.EventBus.Kafka/Volo.Abp.EventBus.Kafka.abppkg.json",
+ "path": "src/Volo.Abp.EventBus.Kafka/Volo.Abp.EventBus.Kafka.abppkg",
"folder": "src"
},
"Volo.Abp.GlobalFeatures": {
- "path": "src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.abppkg.json",
+ "path": "src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.abppkg",
"folder": "src"
},
"Volo.Abp.GlobalFeatures.Tests": {
- "path": "test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.abppkg.json",
+ "path": "test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.MultiLingualObjects": {
- "path": "src/Volo.Abp.MultiLingualObjects/Volo.Abp.MultiLingualObjects.abppkg.json",
+ "path": "src/Volo.Abp.MultiLingualObjects/Volo.Abp.MultiLingualObjects.abppkg",
"folder": "src"
},
"Volo.Abp.MultiLingualObjects.Tests": {
- "path": "test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.abppkg.json",
+ "path": "test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Http.Client.IdentityModel.WebAssembly": {
- "path": "src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.abppkg.json",
+ "path": "src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.Client.Common": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Components.WebAssembly": {
- "path": "src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Components.WebAssembly.Theming": {
- "path": "src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.abppkg",
"folder": "src"
},
"Volo.Abp.Autofac.WebAssembly": {
- "path": "src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.abppkg.json",
+ "path": "src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Authentication.OpenIdConnect": {
- "path": "src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus.Rebus": {
- "path": "src/Volo.Abp.EventBus.Rebus/Volo.Abp.EventBus.Rebus.abppkg.json",
+ "path": "src/Volo.Abp.EventBus.Rebus/Volo.Abp.EventBus.Rebus.abppkg",
"folder": "src"
},
"Volo.Abp.ExceptionHandling": {
- "path": "src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.abppkg.json",
+ "path": "src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Components": {
- "path": "src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.abppkg",
"folder": "src"
},
"Volo.Abp.Swashbuckle": {
- "path": "src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.abppkg.json",
+ "path": "src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.abppkg",
"folder": "src"
},
"Volo.Abp.Json.Tests": {
- "path": "test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Http.Tests": {
- "path": "test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Components.Web": {
- "path": "src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Components.Web.Theming": {
- "path": "src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus.Abstractions": {
- "path": "src/Volo.Abp.EventBus.Abstractions/Volo.Abp.EventBus.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.EventBus.Abstractions/Volo.Abp.EventBus.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.Sms.Aliyun": {
- "path": "src/Volo.Abp.Sms.Aliyun/Volo.Abp.Sms.Aliyun.abppkg.json",
+ "path": "src/Volo.Abp.Sms.Aliyun/Volo.Abp.Sms.Aliyun.abppkg",
"folder": "src"
},
"Volo.Abp.Sms.Aliyun.Tests": {
- "path": "test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.AspNetCore.Components.Server": {
- "path": "src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Components.Server.Theming": {
- "path": "src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.AzureServiceBus": {
- "path": "src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.abppkg.json",
+ "path": "src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus.Azure": {
- "path": "src/Volo.Abp.EventBus.Azure/Volo.Abp.EventBus.Azure.abppkg.json",
+ "path": "src/Volo.Abp.EventBus.Azure/Volo.Abp.EventBus.Azure.abppkg",
"folder": "src"
},
"Volo.Abp.Authorization.Abstractions": {
- "path": "src/Volo.Abp.Authorization.Abstractions/Volo.Abp.Authorization.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.Authorization.Abstractions/Volo.Abp.Authorization.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.TextTemplating.Core": {
- "path": "src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.abppkg.json",
+ "path": "src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.abppkg",
"folder": "src"
},
"Volo.Abp.TextTemplating.Scriban": {
- "path": "src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.abppkg.json",
+ "path": "src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.abppkg",
"folder": "src"
},
"Volo.Abp.TextTemplating.Razor": {
- "path": "src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.abppkg.json",
+ "path": "src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.abppkg",
"folder": "src"
},
"Volo.Abp.TextTemplating.Razor.Tests": {
- "path": "test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.abppkg.json",
+ "path": "test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.TextTemplating.Scriban.Tests": {
- "path": "test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.abppkg.json",
+ "path": "test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.MongoDB.Tests.SecondContext": {
- "path": "test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.abppkg.json",
+ "path": "test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.abppkg",
"folder": "test"
},
"Volo.Abp.IdentityModel.Tests": {
- "path": "test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.abppkg.json",
+ "path": "test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.Threading.Tests": {
- "path": "test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.abppkg.json",
+ "path": "test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.DistributedLocking": {
- "path": "src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.abppkg.json",
+ "path": "src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.abppkg",
"folder": "src"
},
"Volo.Abp.Auditing.Contracts": {
- "path": "src/Volo.Abp.Auditing.Contracts/Volo.Abp.Auditing.Contracts.abppkg.json",
+ "path": "src/Volo.Abp.Auditing.Contracts/Volo.Abp.Auditing.Contracts.abppkg",
"folder": "src"
},
"Volo.Abp.Http.Client.Web": {
- "path": "src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.abppkg.json",
+ "path": "src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.abppkg",
"folder": "src"
},
"Volo.Abp.DistributedLocking.Abstractions": {
- "path": "src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.DistributedLocking.Abstractions.Tests": {
- "path": "test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.abppkg.json",
+ "path": "test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.abppkg",
"folder": "test"
},
"Volo.Abp.BackgroundWorkers.Hangfire": {
- "path": "src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.abppkg.json",
+ "path": "src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.abppkg",
"folder": "src"
},
"Volo.Abp.Gdpr.Abstractions": {
- "path": "src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.RemoteServices": {
- "path": "src/Volo.Abp.RemoteServices/Volo.Abp.RemoteServices.abppkg.json",
+ "path": "src/Volo.Abp.RemoteServices/Volo.Abp.RemoteServices.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.PlugIn": {
- "path": "test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.abppkg.json",
+ "path": "test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.abppkg",
"folder": "test"
},
"Volo.Abp.Json.Newtonsoft": {
- "path": "src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.abppkg.json",
+ "path": "src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.abppkg",
"folder": "src"
},
"Volo.Abp.Json.SystemTextJson": {
- "path": "src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.abppkg.json",
+ "path": "src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.abppkg",
"folder": "src"
},
"Volo.Abp.Json.Abstractions": {
- "path": "src/Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.abppkg.json",
+ "path": "src/Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.NewtonsoftJson": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.abppkg",
"folder": "src"
},
"Volo.Abp.Dapr": {
- "path": "src/Volo.Abp.Dapr/Volo.Abp.Dapr.abppkg.json",
+ "path": "src/Volo.Abp.Dapr/Volo.Abp.Dapr.abppkg",
"folder": "src"
},
"Volo.Abp.EventBus.Dapr": {
- "path": "src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.abppkg.json",
+ "path": "src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.abppkg",
"folder": "src"
},
"Volo.Abp.Http.Client.Dapr": {
- "path": "src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.abppkg.json",
+ "path": "src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.Dapr": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.abppkg",
"folder": "src"
},
"Volo.Abp.AspNetCore.Mvc.Dapr.EventBus": {
- "path": "src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.abppkg.json",
+ "path": "src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.abppkg",
"folder": "src"
},
"Volo.Abp.DistributedLocking.Dapr": {
- "path": "src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.abppkg.json",
+ "path": "src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.abppkg",
"folder": "src"
}
}
diff --git a/framework/Volo.Abp.abpsln.json b/framework/Volo.Abp.abpsln
similarity index 64%
rename from framework/Volo.Abp.abpsln.json
rename to framework/Volo.Abp.abpsln
index 36a045623e..2f34cdcfbe 100644
--- a/framework/Volo.Abp.abpsln.json
+++ b/framework/Volo.Abp.abpsln
@@ -2,7 +2,7 @@
"template": "empty",
"modules": {
"Volo.Abp": {
- "path": "Volo.Abp.abpmdl.json"
+ "path": "Volo.Abp.abpmdl"
}
}
}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.abppkg.json b/framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.abppkg.json
rename to framework/src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.abppkg
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/Extensions/DependencyInjection/AbpJwtBearerExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/Extensions/DependencyInjection/AbpJwtBearerExtensions.cs
new file mode 100644
index 0000000000..5f48cc92d5
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/Extensions/DependencyInjection/AbpJwtBearerExtensions.cs
@@ -0,0 +1,36 @@
+using System;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Volo.Abp.Security.Claims;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+public static class AbpJwtBearerExtensions
+{
+ public static AuthenticationBuilder AddAbpJwtBearer(this AuthenticationBuilder builder)
+ => builder.AddAbpJwtBearer(JwtBearerDefaults.AuthenticationScheme, _ => { });
+
+ public static AuthenticationBuilder AddAbpJwtBearer(this AuthenticationBuilder builder, Action configureOptions)
+ => builder.AddAbpJwtBearer(JwtBearerDefaults.AuthenticationScheme, configureOptions);
+
+ public static AuthenticationBuilder AddAbpJwtBearer(this AuthenticationBuilder builder, string authenticationScheme, Action configureOptions)
+ => builder.AddAbpJwtBearer(authenticationScheme, "Bearer", configureOptions);
+
+ public static AuthenticationBuilder AddAbpJwtBearer(this AuthenticationBuilder builder, string authenticationScheme, string displayName, Action configureOptions)
+ {
+ builder.Services.Configure(options =>
+ {
+ var jwtBearerOption = new JwtBearerOptions();
+ configureOptions?.Invoke(jwtBearerOption);
+ if (!jwtBearerOption.Authority.IsNullOrEmpty())
+ {
+ options.RemoteRefreshUrl = jwtBearerOption.Authority.RemovePostFix("/") + options.RemoteRefreshUrl;
+ }
+ });
+
+ return builder.AddJwtBearer(authenticationScheme, displayName, options =>
+ {
+ configureOptions?.Invoke(options);
+ });
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.abppkg.json b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.abppkg.json
rename to framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.abppkg
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
index a0f4b31158..d43da06dde 100644
--- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj
@@ -18,10 +18,12 @@
+
+
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs
index 1fa5077a91..89d957fe57 100644
--- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs
@@ -1,10 +1,25 @@
-using Volo.Abp.Modularity;
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.AspNetCore.Authentication.JwtBearer.DynamicClaims;
+using Volo.Abp.Caching;
+using Volo.Abp.Modularity;
using Volo.Abp.Security;
+using Volo.Abp.Security.Claims;
namespace Volo.Abp.AspNetCore.Authentication.JwtBearer;
-[DependsOn(typeof(AbpSecurityModule))]
+[DependsOn(typeof(AbpSecurityModule), typeof(AbpCachingModule))]
public class AbpAspNetCoreAuthenticationJwtBearerModule : AbpModule
{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddHttpClient();
+ context.Services.AddHttpContextAccessor();
+ if (context.Services.ExecutePreConfiguredActions().IsEnabled &&
+ context.Services.ExecutePreConfiguredActions().IsRemoteRefreshEnabled)
+ {
+ context.Services.AddTransient();
+ context.Services.AddTransient();
+ }
+ }
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributor.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributor.cs
new file mode 100644
index 0000000000..454977b4b6
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributor.cs
@@ -0,0 +1,10 @@
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Security.Claims;
+
+namespace Volo.Abp.AspNetCore.Authentication.JwtBearer.DynamicClaims;
+
+[DisableConventionalRegistration]
+public class WebRemoteDynamicClaimsPrincipalContributor : RemoteDynamicClaimsPrincipalContributorBase
+{
+
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributorCache.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributorCache.cs
new file mode 100644
index 0000000000..3a3b16131d
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributorCache.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Net.Http;
+using System.Threading.Tasks;
+using IdentityModel.Client;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using Volo.Abp.Caching;
+using Volo.Abp.Security.Claims;
+
+namespace Volo.Abp.AspNetCore.Authentication.JwtBearer.DynamicClaims;
+
+public class WebRemoteDynamicClaimsPrincipalContributorCache : RemoteDynamicClaimsPrincipalContributorCacheBase
+{
+ public const string HttpClientName = nameof(WebRemoteDynamicClaimsPrincipalContributorCache);
+
+ protected IDistributedCache Cache { get; }
+ protected IHttpClientFactory HttpClientFactory { get; }
+ protected IHttpContextAccessor HttpContextAccessor { get; }
+ protected IOptions Options { get; }
+
+ public WebRemoteDynamicClaimsPrincipalContributorCache(
+ IDistributedCache cache,
+ IHttpClientFactory httpClientFactory,
+ IOptions abpClaimsPrincipalFactoryOptions,
+ IHttpContextAccessor httpContextAccessor,
+ IOptions options)
+ : base(abpClaimsPrincipalFactoryOptions)
+ {
+ Cache = cache;
+ HttpClientFactory = httpClientFactory;
+ HttpContextAccessor = httpContextAccessor;
+ Options = options;
+ }
+
+ protected async override Task GetCacheAsync(Guid userId, Guid? tenantId = null)
+ {
+ return await Cache.GetAsync(AbpDynamicClaimCacheItem.CalculateCacheKey(userId, tenantId));
+ }
+
+ protected async override Task RefreshAsync(Guid userId, Guid? tenantId = null)
+ {
+ try
+ {
+ if (HttpContextAccessor.HttpContext == null)
+ {
+ throw new AbpException($"Failed to refresh remote claims for user: {userId} - HttpContext is null!");
+ }
+
+ var authenticateResult = await HttpContextAccessor.HttpContext.AuthenticateAsync(Options.Value.AuthenticationScheme);
+ if (!authenticateResult.Succeeded)
+ {
+ throw new AbpException($"Failed to refresh remote claims for user: {userId} - authentication failed!");
+ }
+
+ var accessToken = authenticateResult.Properties?.GetTokenValue("access_token");
+ if (accessToken.IsNullOrWhiteSpace())
+ {
+ throw new AbpException($"Failed to refresh remote claims for user: {userId} - access_token is null or empty!");
+ }
+
+ var client = HttpClientFactory.CreateClient(HttpClientName);
+ var requestMessage = new HttpRequestMessage(HttpMethod.Post, AbpClaimsPrincipalFactoryOptions.Value.RemoteRefreshUrl);
+ requestMessage.SetBearerToken(accessToken);
+ var response = await client.SendAsync(requestMessage);
+ response.EnsureSuccessStatusCode();
+ }
+ catch (Exception e)
+ {
+ Logger.LogWarning(e, $"Failed to refresh remote claims for user: {userId}");
+ throw;
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributorOptions.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributorOptions.cs
new file mode 100644
index 0000000000..1d51a29661
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/DynamicClaims/WebRemoteDynamicClaimsPrincipalContributorOptions.cs
@@ -0,0 +1,16 @@
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+
+namespace Volo.Abp.AspNetCore.Authentication.JwtBearer.DynamicClaims;
+
+public class WebRemoteDynamicClaimsPrincipalContributorOptions
+{
+ public bool IsEnabled { get; set; }
+
+ public string AuthenticationScheme { get; set; }
+
+ public WebRemoteDynamicClaimsPrincipalContributorOptions()
+ {
+ IsEnabled = false;
+ AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme;
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.abppkg.json b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.abppkg.json
rename to framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.abppkg
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 7d2c1fe6d6..d07cca857f 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
@@ -8,6 +8,7 @@ using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Volo.Abp.AspNetCore.Authentication.OpenIdConnect;
using Volo.Abp.AspNetCore.MultiTenancy;
+using Volo.Abp.Security.Claims;
namespace Microsoft.Extensions.DependencyInjection;
@@ -24,6 +25,16 @@ public static class AbpOpenIdConnectExtensions
public static AuthenticationBuilder AddAbpOpenIdConnect(this AuthenticationBuilder builder, string authenticationScheme, string displayName, Action configureOptions)
{
+ builder.Services.Configure(options =>
+ {
+ var openIdConnectOptions = new OpenIdConnectOptions();
+ configureOptions?.Invoke(openIdConnectOptions);
+ if (!openIdConnectOptions.Authority.IsNullOrEmpty())
+ {
+ options.RemoteRefreshUrl = openIdConnectOptions.Authority.RemovePostFix("/") + options.RemoteRefreshUrl;
+ }
+ });
+
return builder.AddOpenIdConnect(authenticationScheme, displayName, options =>
{
options.ClaimActions.MapAbpClaimTypes();
@@ -38,7 +49,7 @@ public static class AbpOpenIdConnectExtensions
};
options.AccessDeniedPath = "/";
-
+
options.Events.OnTokenValidated = async (context) =>
{
var client = context.HttpContext.RequestServices.GetRequiredService();
diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.abppkg.json b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.abppkg.json
rename to framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.abppkg
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.abppkg.json b/framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.abppkg.json
rename to framework/src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.abppkg
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.abppkg.json b/framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.abppkg.json
rename to framework/src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.abppkg
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.abppkg.json b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.abppkg.json
rename to framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.abppkg
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.abppkg.json b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.abppkg
similarity index 100%
rename from framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.abppkg.json
rename to framework/src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.abppkg
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 16a0c26e6b..1c461f33aa 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
@@ -20,7 +20,7 @@ public class AbpBlazorMessageLocalizerHelper
{
var argumentsList = arguments?.ToList();
return argumentsList?.Count > 0
- ? stringLocalizer[message, LocalizeMessageArguments(argumentsList)]
+ ? stringLocalizer[message, LocalizeMessageArguments(argumentsList).ToArray()]
: stringLocalizer[message];
}
catch
@@ -29,7 +29,7 @@ public class AbpBlazorMessageLocalizerHelper
}
}
- private IEnumerable LocalizeMessageArguments(List arguments)
+ private IEnumerable