@ -1,5 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Buy": "购买" |
|||
} |
|||
} |
|||
@ -0,0 +1,37 @@ |
|||
# Migrating from MS-SQL to Postgresql |
|||
|
|||
 |
|||
|
|||
## Introduction |
|||
|
|||
Database migration is a common practice for organizations that want to move from one database system to another. This can be for a variety of reasons, including cost, performance, and features. In this article, we will discuss the process of migrating a database from MS-SQL to PostgreSQL, the challenges that may arise during the migration, and how to overcome them. And we recently moved the main database of https://abp.io platform from MS-SQL to PostgreSQL. |
|||
|
|||
In our case, we decided to switch our database from Microsoft SQL Server (MS-SQL) to PostgreSQL because we wanted to move our on-premise platform to Azure. We’ve also found out that the cost of the license for MS-SQL on Azure was significantly higher than PostgreSQL. After conducting a cost-benefit analysis, we decided to migrate our database to PostgreSQL to save costs. |
|||
|
|||
Before migrating to Azure, we decided to switch our database from MS-SQL to PostgreSQL on-premise first. This gave us the opportunity to test and fine-tune the migration process before making the final switch to Azure. |
|||
|
|||
## Challenges |
|||
|
|||
Despite using a third-party tool(DBConvert for MySQL & PostgreSQL) for the migration, we faced three main problems when exporting data to PostgreSQL. Firstly, some tables with plain text had utf-8 encoding problems. We overcame this problem by dump-restoring these tables. |
|||
|
|||
 |
|||
|
|||
|
|||
Secondly, our database had to be case-insensitive, but PostgreSQL does not have this as a default configuration. We handled it using `citext` with the ABP migration service. |
|||
|
|||
 |
|||
 |
|||
 |
|||
|
|||
|
|||
While everything was proceeding very smooth, we faced one last problem: importing binary data, such as the content of the NuGet packages. It was hard to understand that the binaries of the NuGet packages were different. Our paid commercial NuGet packages are being stored as binary data in the database. Therefore, it was the most compelling part of this migration to transfer the NuGet packages. Fortunately, we overcame the binary error. And we decided to write a custom .NET tool to move only the binary data from MS-SQL to PostgreSQL, thanks to the ABP Core team! |
|||
|
|||
|
|||
## Conclusion |
|||
|
|||
One of the benefits of using PostgreSQL is the low license costs of the Azure platform. As the main contributors of ABP, we also use ABP Framework under the hood of our abp.io websites, we could easily switch to PostgreSQL. For those who want to switch their ABP project to PostgreSQL, check out [docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL](https://docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL). We had not used any MS-SQL specific function, therefore there was no need to make any changes in the repository classes. This means that the applications that were previously using MS-SQL can seamlessly switch to PostgreSQL without any modifications. |
|||
|
|||
Thanks to the flexibility of ABP, it has [PostgreSQL package](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.PostgreSql) which is 100% compatible with PostgreSQL. This helped us to make this migration very smooth and seamless. |
|||
|
|||
In conclusion, migrating a database from MS-SQL to PostgreSQL can be challenging, but it can bring significant cost savings in the long run. By testing and fine-tuning the migration process before making the final switch, we were able to overcome the challenges we’d faced during the migration process. Thanks to the flexibility of ABP, we were able to make the transition with minimal code changes. Also we didn't see any big performance differences between MS-SQL and PostgreSQL. |
|||
|
|||
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 410 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 32 KiB |
@ -0,0 +1,49 @@ |
|||
|
|||
# On-Prem to Azure: Migration of abp.io Platform to Azure |
|||
|
|||
|
|||
 |
|||
|
|||
Migrating a Kubernetes platform with a database from our own dedicated servers to Azure can be a compelling task, but it can be a necessary one to take advantage of the benefits that the cloud service offers. In this post, we will discuss the reasons for migrating from a on-premise platform to Azure, the steps taken to create and configure the [abp.io platform](https://abp.io) on Azure, and the benefits gained from the migration. |
|||
|
|||
### On-Premise Server: The old platform |
|||
|
|||
There were several reasons for migrating from the old on-premise platform to Azure. First, the Kubernetes cluster and the database were on the same Windows server. Additionally, the Linux virtual machines in Kubernetes were on the Windows server and had limited resources. Furthermore, the Kubernetes maintenance was quite challenging, which was another reason for the migration. |
|||
|
|||
### Reasons for Moving to Azure: The new platform |
|||
|
|||
The decision to move to the cloud was made to eliminate the disadvantages of the old platform. The migration to Azure meant that the resources would be independent of each other but faster in terms of communicating with each other. The platform would also take advantage of cloud security and availability. The managed Kubernetes service that Azure offers comes with autoscaling and loadbalancing, which makes the platform more reliable. Finally, the migration to Azure would provide a better quality service to global customers and the community. |
|||
|
|||
### Before Moving to Azure |
|||
|
|||
Before migrating to Azure, we decided to switch our database from MS-SQL to PostgreSQL on-premise first. This gave us the opportunity to test and fine-tune the migration process before making the final switch to Azure.You can check the details of database migration from this article [Migrating from MS-SQL to Postgresql](https://community.abp.io/posts/migrating-from-mssql-to-postgresql-lbi5anlv). |
|||
|
|||
The platform was tested in a staging environment created on Azure with the same resources as the production environment. The staging environment was used to test and optimize the migration process, including the migration of data from the old platform to Azure, which was tested multiple times to ensure success. |
|||
|
|||
### Creating and Configuring the abp.io Platform on Azure |
|||
|
|||
Several steps were taken to create and configure the abp.io platform on Azure. [Terraform](https://www.terraform.io/) was used to create the infrastructure (VM, Private Network, AKS, Postgresql Flexible Server...), while [Ansible](https://www.ansible.com/) was used to configure the Azure resources like Terraform, Helm, Kubectl, Docker, VPN, Redis, Prometheus, Grafana, ElasticSearch, Kibana and so on.... Azure DevOps pipelines and release were used for AKS deployment. The most time-consuming part in this process was to prepare, test and optimize the terraform and ansible settings files. |
|||
|
|||
To access our platform, which is configured on a private network in Azure, we require a VPN connection. To enable this, we have installed [Wireguard](https://www.wireguard.com/) - an open source VPN service - by creating a virtual machine using Terraform and configuring it with Ansible in Azure. This approach has made the process efficient and streamlined. |
|||
|
|||
 |
|||
|
|||
The most important step was to transfer the data in both the database and Kubernetes of the volumes. rsync (remote sync commands) were used to transfer the data from Kubernetes volumes to Azure NFS through the VPN machine. Additionally, `pg_dump` and `pg_restore` were used to transfer the PostgreSQL database through the machine with VPN. |
|||
|
|||
Before the production environment, the data migration was tested many times for the staging environment. We estimated this migration to take max 1.5 hours. The ABP community was informed that there may be interruptions during the hours designated for the transition to Azure. To inform our customers and community, we created a status page before this migration. The new status page is [status.abp.io](https://status.abp.io). From now on we wil make all the infrastructural announcements on [status.abp.io](https://status.abp.io). We used [Upptime](https://upptime.js.org) which is an open-source uptime monitor and status page provider. During the migration of the production environment, the websites and databases were still up and running. After the data transfer, the only remaining step was to direct the traffic of the already standing abp.io sites to the Azure Kubernetes service via Cloudflare. |
|||
|
|||
We would like to happily state that **we were offline for only 4 minutes** during this transition. |
|||
|
|||
 |
|||
|
|||
|
|||
### Benefits of Moving to Azure |
|||
|
|||
The migration to Azure resulted in several benefits. The platform is now more reliable, scalable, secure, solid with built-in one-click backup and recovery capabilities for abp.io. Additionally, the critical resources are in a private network, making them more secure than the old environment. When we initially compared the speed of our abp.io sites before and after migrating to Azure, we were pleasantly surprised by the significant improvement in performance. To be honest, we did not expect such a speed increase. |
|||
|
|||
 |
|||
|
|||
In conclusion, migrating a Kubernetes platform with a database from on-premise to Azure is a complex process that requires careful planning and execution. However, the benefits gained from the migration make the process worthwhile. By moving to Azure, the abp.io platform now has a more reliable and available infrastructure that is more secure than the old environment. The migration also resulted in significant improvements in connection speeds, which ultimately provides a better service to global customers and the community. |
|||
|
|||
|
|||
|
|||
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 336 KiB |
|
After Width: | Height: | Size: 142 KiB |
@ -0,0 +1,82 @@ |
|||
# ABP.IO Platform 7.1 Final Has Been Released! |
|||
|
|||
[ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) 7.1 versions have been released today. |
|||
|
|||
## What's New With 7.1? |
|||
|
|||
Since all the new features are already explained in detail in the [7.1 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-7.1-RC-Has-Been-Published), I will not repeat all the details again. See the [RC Blog Post](https://blog.abp.io/abp/ABP.IO-Platform-7.1-RC-Has-Been-Published) for all the features and enhancements. |
|||
|
|||
## Getting Started with 7.1 |
|||
|
|||
### Creating New Solutions |
|||
|
|||
You can create a new solution with the ABP Framework version 7.1 by either using the `abp new` command or generating the CLI command on the [get started page](https://abp.io/get-started). |
|||
|
|||
> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for more. |
|||
|
|||
### How to Upgrade an Existing Solution |
|||
|
|||
#### Install/Update the ABP CLI |
|||
|
|||
First of all, install the ABP CLI or upgrade to the latest version. |
|||
|
|||
If you haven't installed it yet: |
|||
|
|||
```bash |
|||
dotnet tool install -g Volo.Abp.Cli |
|||
``` |
|||
|
|||
To update an existing installation: |
|||
|
|||
```bash |
|||
dotnet tool update -g Volo.Abp.Cli |
|||
``` |
|||
|
|||
#### Upgrading Existing Solutions with the ABP Update Command |
|||
|
|||
[ABP CLI](https://docs.abp.io/en/abp/latest/CLI) provides a handy command to update all the ABP related NuGet and NPM packages in your solution with a single command: |
|||
|
|||
```bash |
|||
abp update |
|||
``` |
|||
|
|||
Run this command in the root folder of your solution. |
|||
|
|||
## Migration Guides |
|||
|
|||
This version includes a very minor breaking change and it doesn't affect most of the applications. Check [the migration guide](https://docs.abp.io/en/abp/7.1/Migration-Guides/Abp-7_1) for the details. |
|||
|
|||
## Community News |
|||
|
|||
## ABP Community Talks 2023.2 |
|||
|
|||
The next ABP Community Talks will be done on March 30, at 18:00 (UTC). |
|||
|
|||
 |
|||
|
|||
In this episode, core ABP Framework developers will discuss what are the benefits of using ABP Framework as a .NET developer, instead of creating your own solution from scratch. They will answer most of the common doubts about using ABP and application frameworks in general. You will better understand how ABP makes a developer’s life easier and more enjoyable while cutting production costs. We will also have a question - answer session after the talk, as always. I think this talk will be useful for every .NET developer regardless of whether they use ABP or not. |
|||
|
|||
**[CLICK HERE to register to the event and join us](https://kommunity.com/volosoft/events/abp-community-talks-20232-why-use-abp-framework-as-a-net-developer-e3254183)**. |
|||
|
|||
## Introducing the first ABP .NET Conference! |
|||
|
|||
As the ABP team, we've executed more than 10 [online events](https://community.abp.io/events) and gained a good experience of software talks. In May, we are organizing a full-featured software conference, named **ABP Dotnet Conference 2023**! |
|||
|
|||
 |
|||
|
|||
We are still organizing the speakers, talks and the schedule. There will be 12 sessions about software development and .NET. These will also include a few ABP-related talks. You can **follow https://abp.io/conference website** and buy early bird tickets from now. |
|||
|
|||
### New ABP Community Posts |
|||
|
|||
There are exciting articles contributed by the ABP community as always. I will highlight some of them here: |
|||
|
|||
* [Creating Dockerfile for ABP Applications](https://community.abp.io/posts/creating-dockerfile-for-abp-applications-caj4fkxa) by [Anto Subash](https://community.abp.io/members/antosubash) |
|||
* [IdentityUser Relationship and Extending it](https://community.abp.io/posts/identityuser-relationship-and-extending-it-xtv79mpx) by [Onur Pıçakçı](https://community.abp.io/members/onurpicakci) |
|||
* [Streamline Localization in Your ABP Project](https://community.abp.io/posts/streamline-localization-in-your-abp-project-1t12rmjc) by [Salih Özkara](https://community.abp.io/members/salih) |
|||
* [.Net Microservice template with ABP](https://community.abp.io/posts/.net-microservice-template-with-abp-53r52ryy) by [Anto Subash](https://community.abp.io/members/antosubash) |
|||
|
|||
Thanks to the ABP Community for all the content they have published. You can also [post your ABP related (text or video) content](https://community.abp.io/articles/submit) to the ABP Community. |
|||
|
|||
## About the Next Version |
|||
|
|||
The next feature version will be 7.2. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version. |
|||
|
After Width: | Height: | Size: 160 KiB |
|
After Width: | Height: | Size: 329 KiB |
@ -0,0 +1,44 @@ |
|||
## Streamline Localization in Your ABP Project |
|||
|
|||
Making localization changes to an ABP project can be a daunting task, especially if you're dealing with multiple languages and translations. During development, it's easy to overlook some changes and that leads to inconsistencies across different languages. Fortunately, I have developed a tool that can help streamline the localization process and ensure consistency across different languages. |
|||
|
|||
The tool is a console application that uses JSON files to manage localization keys and their translations. It addresses three common scenarios that can arise during localization: |
|||
|
|||
|
|||
1. When the argument count of a key changes, it can be difficult to update the translations for all languages. My tool solves this problem by scanning all JSON files in the project folder and identifying any keys that have mismatched argument counts. It then offers two options to the user: delete the mismatched translations or export them as a JSON file for manual editing. |
|||
|
|||
2. When a new key is added to the project, forgetting to add its translations to all the other languages is easy. My tool helps to avoid this issue by scanning the default language's JSON file and identifying any keys that don't have translations in other languages. It then exports these keys as a JSON file that can be used to add missing translations. |
|||
|
|||
3. When a key's name is changed, it's important to update its translations in all the other languages. My tool makes this task simple by scanning all the JSON files in the project folder and updating any translations of the old key name with the new one. |
|||
|
|||
The tool also includes an export feature that allows users to modify translations outside of the application and import them back into the JSON files. |
|||
|
|||
## How it Helps |
|||
|
|||
With my Localization Key Synchronizer tool, you can perform complex localization changes more quickly and easily than by manually sifting through files and making changes one-by-one. This can save you significant time and effort, especially if you're working with a large number of languages or translations. |
|||
|
|||
## How it Works |
|||
|
|||
When you run the Localization Key Synchronizer tool, it presents you with three options: |
|||
|
|||
1. Find Asynchronous Keys |
|||
2. Apply Changes in the Exported File |
|||
3. Replace Keys |
|||
|
|||
If you select "Find Asynchronous Keys," the tool prompts you to enter the default language path. Once you've entered the path, the tool displays all of the JSON files in the same folder as a multi-select list. After selecting one or more files, you are asked whether you want to find keys that do not match the number of arguments, missing keys, or both. If you select "Missing Keys," the tool prompts you to enter the absolute path to export the missing keys. After you've entered the path, the export process starts, and the tool closes. |
|||
|
|||
 |
|||
|
|||
If you select "Apply Changes in the Exported File" at the main menu, the tool prompts you to enter the path to the exported file. After you've entered the path, the import process starts, and the tool closes. |
|||
|
|||
 |
|||
|
|||
If you select "Replace Keys," the tool prompts you to enter the localization folder path, the old key, the new key, and the JSON files to apply the changes to. Once you've entered all the required information and made your selections, the tool performs the replacements and closes. |
|||
|
|||
 |
|||
|
|||
## Conclusion |
|||
|
|||
If you're struggling to manage localization changes in an ABP project, give my Localization Key Synchronizer tool a try. It can help streamline your workflow and make the process much more manageable. You can find the tool on [GitHub](https://github.com/abpframework/abp/tree/dev/tools/localization-key-synchronizer). |
|||
|
|||
To use the tool, simply run the console application and follow the prompts. It's a user-friendly solution that helps to ensure localization consistency in your ABP project. Give it a try and let me know what you think! |
|||
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 2.7 MiB |
@ -0,0 +1,37 @@ |
|||
# Migrating from MS-SQL to Postgresql |
|||
|
|||
 |
|||
|
|||
## Introduction |
|||
|
|||
Database migration is a common practice for organizations that want to move from one database system to another. This can be for a variety of reasons, including cost, performance, and features. In this article, we will discuss the process of migrating a database from MS-SQL to PostgreSQL, the challenges that may arise during the migration, and how to overcome them. And we recently moved the main database of https://abp.io platform from MS-SQL to PostgreSQL. |
|||
|
|||
In our case, we decided to switch our database from Microsoft SQL Server (MS-SQL) to PostgreSQL because we wanted to move our on-premise platform to Azure. We’ve also found out that the cost of the license for MS-SQL on Azure was significantly higher than PostgreSQL. After conducting a cost-benefit analysis, we decided to migrate our database to PostgreSQL to save costs. |
|||
|
|||
Before migrating to Azure, we decided to switch our database from MS-SQL to PostgreSQL on-premise first. This gave us the opportunity to test and fine-tune the migration process before making the final switch to Azure. |
|||
|
|||
## Challenges |
|||
|
|||
Despite using a third-party tool(DBConvert for MySQL & PostgreSQL) for the migration, we faced three main problems when exporting data to PostgreSQL. Firstly, some tables with plain text had utf-8 encoding problems. We overcame this problem by dump-restoring these tables. |
|||
|
|||
 |
|||
|
|||
|
|||
Secondly, our database had to be case-insensitive, but PostgreSQL does not have this as a default configuration. We handled it using `citext` with the ABP migration service. |
|||
|
|||
 |
|||
 |
|||
 |
|||
|
|||
|
|||
While everything was proceeding very smooth, we faced one last problem: importing binary data, such as the content of the NuGet packages. It was hard to understand that the binaries of the NuGet packages were different. Our paid commercial NuGet packages are being stored as binary data in the database. Therefore, it was the most compelling part of this migration to transfer the NuGet packages. Fortunately, we overcame the binary error. And we decided to write a custom .NET tool to move only the binary data from MS-SQL to PostgreSQL, thanks to the ABP Core team! |
|||
|
|||
|
|||
## Conclusion |
|||
|
|||
One of the benefits of using PostgreSQL is the low license costs of the Azure platform. As the main contributors of ABP, we also use ABP Framework under the hood of our abp.io websites, we could easily switch to PostgreSQL. For those who want to switch their ABP project to PostgreSQL, check out [docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL](https://docs.abp.io/en/abp/latest/Entity-Framework-Core-PostgreSQL). We had not used any MS-SQL specific function, therefore there was no need to make any changes in the repository classes. This means that the applications that were previously using MS-SQL can seamlessly switch to PostgreSQL without any modifications. |
|||
|
|||
Thanks to the flexibility of ABP, it has [PostgreSQL package](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.PostgreSql) which is 100% compatible with PostgreSQL. This helped us to make this migration very smooth and seamless. |
|||
|
|||
In conclusion, migrating a database from MS-SQL to PostgreSQL can be challenging, but it can bring significant cost savings in the long run. By testing and fine-tuning the migration process before making the final switch, we were able to overcome the challenges we’d faced during the migration process. Thanks to the flexibility of ABP, we were able to make the transition with minimal code changes. Also we didn't see any big performance differences between MS-SQL and PostgreSQL. |
|||
|
|||
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 410 KiB |
|
After Width: | Height: | Size: 32 KiB |
@ -0,0 +1,307 @@ |
|||
## Introduction |
|||
In this article, I will talk about the relationships of IdentityUser in every web application that can be created with the ABP framework. When you read this article, you will learn how to extend the user entity in the applications you develop using the ABP framework with a primitive type, extending the user by associating the user with another entity (User-many-to-one-X). |
|||
|
|||
|
|||
## Creating the Solution |
|||
>For the source code of the application: https://github.com/onurpicakci/Abp-Identity-Relationship |
|||
|
|||
In this article we will use EF Core as the database provider and MVC as the user interface framework. But Angular, Blazor Server and Blazor WebAssembly also work. ABP Framework offers starter templates to get started faster. We can create a new starter template using the ABP CLI: |
|||
|
|||
```bash |
|||
abp new IdentityRelationship |
|||
``` |
|||
|
|||
After the project is created, you can run the `IdentityRelationship.DbMigrator` project to create the database and seed the initial data. You can then run the `IdentityRelationship.Web` project to see our application run. |
|||
|
|||
> The default admin username is **admin** and the password is **1q2w3E\*** |
|||
|
|||
 |
|||
|
|||
## Module Entity Extensions |
|||
|
|||
The module entity extension system is a high level extension system that allows you to define new properties for existing entities of the depended modules. It automatically adds properties to the entity, database, HTTP API and the user interface in a single point. |
|||
|
|||
### Extending the User Entity With a Primitive Type |
|||
|
|||
Open the `IdentityRelationshipModuleExtensionConfigurator` class inside the `Domain.Shared` project of your solution and change the `ConfigureExtraProperties` method as shown below to add an `IdentificationNumber` property to the `IdentityUser` entity of the [Identity Module](https://docs.abp.io/en/abp/latest/Modules/Identity). |
|||
|
|||
```csharp |
|||
public static void ConfigureExtraProperties() |
|||
{ |
|||
OneTimeRunner.Run(() => |
|||
{ |
|||
ObjectExtensionManager.Instance.Modules() |
|||
.ConfigureIdentity(identity => |
|||
{ |
|||
identity.ConfigureUser(user => |
|||
{ |
|||
user.AddOrUpdateProperty<string>( //property type: string |
|||
"IdentificationNumber", //property name |
|||
property => |
|||
{ |
|||
//validation rules |
|||
property.Attributes.Add(string.Empty); |
|||
property.Attributes.Add( |
|||
new StringLengthAttribute(64) { |
|||
MinimumLength = 4 |
|||
} |
|||
); |
|||
|
|||
//...other configurations for this property |
|||
} |
|||
); |
|||
}); |
|||
}); |
|||
}); |
|||
} |
|||
``` |
|||
> This method is called inside the IdentityRelationshipDomainSharedModule at the beginning of the application. OneTimeRunner is a utility class that guarantees to execute this code only one time per application, since multiple calls are unnecessary. |
|||
|
|||
If you want to localize, open the `IdentityRelationship.Domain.Shared` project and create a new localization in your `/Localization/IdentityRelationship/en.json` file. |
|||
|
|||
```json |
|||
"IdentificationNumber": "Identification Number" |
|||
``` |
|||
Once you define a property, it appears in the create and update forms of the related entity: |
|||
|
|||
 |
|||
|
|||
New properties also appear in the data table of the related page: |
|||
|
|||
 |
|||
|
|||
|
|||
## Navigation Properties / Foreign Keys |
|||
|
|||
It is supported to add an extension property to an entity that is the Id of another entity (foreign key). |
|||
|
|||
### Example: Let's associate a department in the database with a user |
|||
|
|||
First, create a `Departments` folder in the `IdentityRelationship.Domain` project and add the `Department` class inside: |
|||
```csharp |
|||
using System; |
|||
using Volo.Abp.Domain.Entities; |
|||
|
|||
namespace IdentityRelationship.Departments; |
|||
|
|||
public class Department : AggregateRoot<Guid> |
|||
{ |
|||
public string Name { get; set; } |
|||
} |
|||
``` |
|||
|
|||
EF Core requires that you relate the entities with your `DbContext`. The easiest way to do so is adding a DbSet property to the `IdentityRelationshipDbContext` class in the `IdentityRelationship.EntityFrameworkCore` project, as shown below: |
|||
|
|||
```csharp |
|||
public DbSet<Department> Departments { get; set; } |
|||
``` |
|||
|
|||
Then in the `IdentityRelationship.EntityFrameworkCore` project of your solution, open the `/EntityFrameworkCore/IdentityRelationshipEfCoreEntityExtensionMappings` class and update your code: |
|||
|
|||
```csharp |
|||
public static class IdentityRelationshipEfCoreEntityExtensionMappings |
|||
{ |
|||
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); |
|||
|
|||
public static void Configure() |
|||
{ |
|||
IdentityRelationshipGlobalFeatureConfigurator.Configure(); |
|||
IdentityRelationshipModuleExtensionConfigurator.Configure(); |
|||
|
|||
OneTimeRunner.Run(() => |
|||
{ |
|||
ObjectExtensionManager.Instance |
|||
.MapEfCoreProperty<IdentityUser, Guid>( |
|||
"DepartmentId", |
|||
(entityBuilder, propertyBuilder) => { propertyBuilder.HasMaxLength(128); } |
|||
); |
|||
|
|||
}); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
This class can be used to map these extra properties to table fields in the database. Please read [this](https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities?_ga=2.21022651.140118448.1679289046-1173891759.1672473062) document to improve your understanding of what we are doing. |
|||
|
|||
We need to create a new migration to see the changes in the database. Open your `EntityFrameworkCore` project in the terminal and run the following command (this depends on the IDE you are using). |
|||
|
|||
 |
|||
|
|||
```bash |
|||
dotnet ef migrations add Create_Department_Entity |
|||
``` |
|||
|
|||
Finally, run the `IdentityRelationship.DbMigrator` project to update the database. |
|||
|
|||
When you look at your database, you can see that the `Department` table has been added and `DepartmentId` has been added to your `AbpUsers` table. |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
> It's good to have some initial data in the database before running the application. This section introduces the [Data Seeding](https://docs.abp.io/en/abp/latest/Data-Seeding) system of the ABP framework. You can skip this section if you don't want to create the data seeding, but it is suggested to follow along and learn this useful ABP Framework feature. |
|||
|
|||
Create a class deriving from the `IDataSeedContributor` in the `IdentityRelationship.Domain` project by copying the following code: |
|||
|
|||
```csharp |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using IdentityRelationship.Departments; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Domain.Repositories; |
|||
|
|||
namespace IdentityRelationship; |
|||
|
|||
public class IdentityRelationshipDataSeederContributor |
|||
: IDataSeedContributor, ITransientDependency |
|||
{ |
|||
private readonly IRepository<Department, Guid> _departmentRepository; |
|||
|
|||
public IdentityRelationshipDataSeederContributor(IRepository<Department, Guid> departmentRepository) |
|||
{ |
|||
_departmentRepository = departmentRepository; |
|||
} |
|||
|
|||
public async Task SeedAsync(DataSeedContext context) |
|||
{ |
|||
if (await _departmentRepository.GetCountAsync() <= 0) |
|||
{ |
|||
await _departmentRepository.InsertAsync( |
|||
new Department |
|||
{ |
|||
Name = "Human Resources" |
|||
}, |
|||
autoSave: true |
|||
); |
|||
|
|||
await _departmentRepository.InsertAsync( |
|||
new Department |
|||
{ |
|||
Name = "Production" |
|||
}, |
|||
autoSave: true |
|||
); |
|||
} |
|||
} |
|||
} |
|||
``` |
|||
- This code simply uses the `IRepository<Department, Guid>` (the default [repository](https://docs.abp.io/en/abp/latest/Repositories)) to insert two books to the database in case there weren't any books in it. |
|||
|
|||
Run the `IdentityRelationship.DbMigrator` application to update the database: |
|||
|
|||
 |
|||
|
|||
Again, open the `IdentityRelationshipModuleExtensionConfigurator` class in the Domain.Shared project and add the following code: |
|||
|
|||
```csharp |
|||
|
|||
user.AddOrUpdateProperty<Guid>( |
|||
"DepartmentId", |
|||
property => |
|||
{ |
|||
property.UI.Lookup.Url = "/api/app/department"; |
|||
property.UI.Lookup.DisplayPropertyName = "name"; |
|||
} |
|||
); |
|||
``` |
|||
|
|||
The `UI.Lookup.Url` option takes a URL to get the list of departments to select on the edit/create forms. This endpoint can be a typical controller, an auto API controller or any type of endpoint that returns a proper JSON response. |
|||
|
|||
To localize, open the `IdentityRelationship.Domain.Shared` project and add it to your `/Localization/IdentityRelationship/en.json` file: |
|||
|
|||
```json |
|||
"DepartmentId": "Department" |
|||
``` |
|||
|
|||
Create a `Departments` folder in the `IdentityRelationship.Application.Contracts` project of your solution and add the `DepartmentDto` class in it |
|||
|
|||
```csharp |
|||
using System; |
|||
using Volo.Abp.Application.Dtos; |
|||
namespace IdentityRelationship.Departments; |
|||
|
|||
public class DepartmentDto : EntityDto<Guid> |
|||
|
|||
{ |
|||
public string Name { get; set; } |
|||
} |
|||
``` |
|||
Now let's create an `IDepartmentAppService` interface in the `Departments` folder |
|||
|
|||
```csharp |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Application.Services; |
|||
|
|||
namespace IdentityRelationship.Departments; |
|||
|
|||
public interface IDepartmentAppService : IApplicationService |
|||
{ |
|||
public Task<ListResultDto<DepartmentDto>> GetAsync(); |
|||
} |
|||
``` |
|||
|
|||
Time to implement the `IDepartmentAppService` interface. Create a `Departments` folder in your `IdentityRelationship.Application` project and add the `DepartmentAppService` class inside. |
|||
|
|||
```csharp |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using IdentityRelationship.Departments; |
|||
using Volo.Abp.Application.Dtos; |
|||
using Volo.Abp.Domain.Repositories; |
|||
|
|||
namespace IdentityRelationship.Department; |
|||
|
|||
public class DepartmentAppService : IdentityRelationshipAppService, IDepartmentAppService |
|||
{ |
|||
private readonly IRepository<Departments.Department, Guid> _departmentRepository; |
|||
|
|||
public DepartmentAppService(IRepository<Departments.Department, Guid> departmentRepository) |
|||
{ |
|||
_departmentRepository = departmentRepository; |
|||
} |
|||
|
|||
public async Task<ListResultDto<DepartmentDto>> GetAsync() |
|||
{ |
|||
var departments = await _departmentRepository.GetListAsync(); |
|||
return new ListResultDto<DepartmentDto>( |
|||
ObjectMapper.Map<List<Departments.Department>, List<DepartmentDto>>(departments)); |
|||
} |
|||
} |
|||
``` |
|||
`DepartmentAppService `is using the `ObjectMapper` to convert the `Department` objects to `DepartmentDto` objects. So, we need to define this mapping in the AutoMapper configuration. |
|||
|
|||
Open the `IdentityRelationshipApplicationAutoMapperProfile` class inside the `IdentityRelationship.Application` project and add the following line to the constructor: |
|||
|
|||
```csharp |
|||
using AutoMapper; |
|||
using IdentityRelationship.Departments; |
|||
|
|||
namespace IdentityRelationship; |
|||
|
|||
public class IdentityRelationshipApplicationAutoMapperProfile : Profile |
|||
{ |
|||
public IdentityRelationshipApplicationAutoMapperProfile() |
|||
{ |
|||
CreateMap<Departments.Department, DepartmentDto>(); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
Run your `IdentityRelationship.Web` project and add a department to one of your users. |
|||
|
|||
 |
|||
|
|||
And it shows the department name on the data table: |
|||
|
|||
 |
|||
|
|||
## Conclusion |
|||
In this article I talked about the use of the IdentityUser relationship and how to extend it. Thank you for reading the article, I hope it was useful. See you soon! |
|||
|
|||
## References |
|||
- https://docs.abp.io/en/abp/latest/Module-Entity-Extensions |
|||
- https://learn.microsoft.com/en-us/ef/core/modeling/relationships |
|||
- https://community.abp.io/posts/how-to-add-custom-properties-to-the-user-entity-rixchoha |
|||
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 273 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 160 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 278 KiB |
@ -0,0 +1,230 @@ |
|||
# Migrating from OpenIddict to IdentityServer4 Step by Step Guide |
|||
|
|||
ABP startup templates use `OpenIddict` OpenID provider from v6.0.0 by default and `IdentityServer` projects are renamed to `AuthServer` in tiered/separated solutions. Since OpenIddict is the default OpenID provider library for ABP templates since v6.0, you may want to keep using [IdentityServer4](https://github.com/IdentityServer/IdentityServer4) library, even it is **archived and no longer maintained by the owners**. ABP doesn't provide support for newer versions of IdentityServer. This guide provides layer-by-layer guidance for migrating your existing [OpenIddict](https://github.com/openiddict/openiddict-core) application to IdentityServer4. |
|||
|
|||
## IdentityServer4 Migration Steps |
|||
|
|||
Use the `abp update` command to update your existing application. See [Upgrading docs](../Upgrading.md) for more info. Apply required migrations by following the [Migration Guides](Index.md) based on your application version. |
|||
|
|||
### Domain.Shared Layer |
|||
|
|||
- In **MyApplication.Domain.Shared.csproj** replace **project reference**: |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.OpenIddict.Domain.Shared" Version="6.0.*" /> |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.IdentityServer.Domain.Shared" Version="6.0.*" /> |
|||
``` |
|||
|
|||
- In **MyApplicationDomainSharedModule.cs** replace usings and **module dependencies:** |
|||
|
|||
```csharp |
|||
using Volo.Abp.OpenIddict; |
|||
... |
|||
typeof(AbpOpenIddictDomainSharedModule) |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
using Volo.Abp.IdentityServer; |
|||
... |
|||
typeof(AbpIdentityServerDomainSharedModule) |
|||
``` |
|||
|
|||
### Domain Layer |
|||
|
|||
- In **MyApplication.Domain.csproj** replace **project references**: |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.OpenIddict.Domain" Version="6.0.*" /> |
|||
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.OpenIddict" Version="6.0.*" /> |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.IdentityServer.Domain" Version="6.0.*" /> |
|||
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" Version="6.0.*" /> |
|||
``` |
|||
|
|||
- In **MyApplicationDomainModule.cs** replace usings and **module dependencies**: |
|||
|
|||
```csharp |
|||
using Volo.Abp.OpenIddict; |
|||
using Volo.Abp.PermissionManagement.OpenIddict; |
|||
... |
|||
typeof(AbpOpenIddictDomainModule), |
|||
typeof(AbpPermissionManagementDomainOpenIddictModule), |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
using Volo.Abp.IdentityServer; |
|||
using Volo.Abp.PermissionManagement.IdentityServer; |
|||
... |
|||
typeof(AbpIdentityServerDomainModule), |
|||
typeof(AbpPermissionManagementDomainIdentityServerModule), |
|||
``` |
|||
|
|||
#### OpenIddictDataSeedContributor |
|||
|
|||
DataSeeder is the most important part for starting the application since it seeds the initial data for both OpenID providers. |
|||
|
|||
- Create a folder named *IdentityServer* under the Domain project and copy the [IdentityServerDataSeedContributor.cs](https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.Domain/IdentityServer/IdentityServerDataSeedContributor.cs) under this folder. **Rename** all the `OpenId2Ids` with your project name. |
|||
- Delete *OpenIddict* folder that contains `OpenIddictDataSeedContributor.cs` which is no longer needed. |
|||
|
|||
### EntityFrameworkCore Layer |
|||
|
|||
If you are using MongoDB, skip this step and check the *MongoDB* layer section. |
|||
|
|||
- In **MyApplication.EntityFrameworkCore.csproj** replace **project reference**: |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.OpenIddict.EntityFrameworkCore" Version="6.0.*" /> |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="6.0.*" /> |
|||
``` |
|||
|
|||
- In **MyApplicationEntityFrameworkCoreModule.cs** replace usings and **module dependencies**: |
|||
|
|||
```csharp |
|||
using Volo.Abp.OpenIddict.EntityFrameworkCore; |
|||
... |
|||
typeof(AbpOpenIddictEntityFrameworkCoreModule), |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
using Volo.Abp.IdentityServer.EntityFrameworkCore; |
|||
... |
|||
typeof(AbpIdentityServerEntityFrameworkCoreModule), |
|||
``` |
|||
|
|||
- In **MyApplicationDbContext.cs** replace usings and **fluent api configurations**: |
|||
|
|||
```csharp |
|||
using Volo.Abp.OpenIddict.EntityFrameworkCore; |
|||
... |
|||
protected override void OnModelCreating(ModelBuilder builder) |
|||
{ |
|||
base.OnModelCreating(builder); |
|||
|
|||
/* Include modules to your migration db context */ |
|||
|
|||
... |
|||
builder.ConfigureOpenIddict(); |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
using Volo.Abp.IdentityServer.EntityFrameworkCore; |
|||
... |
|||
using Volo.Abp.OpenIddict.EntityFrameworkCore; |
|||
... |
|||
protected override void OnModelCreating(ModelBuilder builder) |
|||
{ |
|||
base.OnModelCreating(builder); |
|||
|
|||
/* Include modules to your migration db context */ |
|||
|
|||
... |
|||
builder.ConfigureIdentityServer(); |
|||
``` |
|||
|
|||
> Not: You need to create new migration after updating the fluent api. Navigate to *EntityFrameworkCore* folder and add a new migration. Ex, `dotnet ef migrations add Updated_To_IdentityServer ` |
|||
|
|||
### MongoDB Layer |
|||
|
|||
If you are using EntityFrameworkCore, skip this step and check the *EntityFrameworkCore* layer section. |
|||
|
|||
- In **MyApplication.MongoDB.csproj** replace **project reference**: |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.OpenIddict.MongoDB" Version="6.0.*" /> |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
<PackageReference Include="Volo.Abp.IdentityServer.MongoDB" Version="6.0.*" /> |
|||
``` |
|||
|
|||
- In **MyApplicationMongoDbModule.cs** replace usings and **module dependencies**: |
|||
|
|||
```csharp |
|||
using Volo.Abp.OpenIddict.MongoDB; |
|||
... |
|||
typeof(AbpOpenIddictMongoDbModule), |
|||
``` |
|||
|
|||
with |
|||
|
|||
```csharp |
|||
using Volo.Abp.IdentityServer.MongoDB; |
|||
... |
|||
typeof(AbpIdentityServerMongoDbModule), |
|||
``` |
|||
|
|||
### DbMigrator Project |
|||
|
|||
- In `appsettings.json` **replace OpenIddict section with IdentityServer** since IdentityServerDataSeeder will be using these information for initial data seeding: |
|||
|
|||
```json |
|||
"IdentityServer": { // Rename OpenIddict to IdentityServer |
|||
"Clients ": { // Rename Applications to Clients |
|||
... |
|||
} |
|||
} |
|||
``` |
|||
|
|||
|
|||
### Test Project |
|||
|
|||
- In **MyApplicationTestBaseModule.cs** **add** the IdentityServer related using and PreConfigurations: |
|||
|
|||
```csharp |
|||
using Volo.Abp.IdentityServer; |
|||
``` |
|||
|
|||
and |
|||
|
|||
```csharp |
|||
PreConfigure<AbpIdentityServerBuilderOptions>(options => |
|||
{ |
|||
options.AddDeveloperSigningCredential = false; |
|||
}); |
|||
|
|||
PreConfigure<IIdentityServerBuilder>(identityServerBuilder => |
|||
{ |
|||
identityServerBuilder.AddDeveloperSigningCredential(false, System.Guid.NewGuid().ToString()); |
|||
}); |
|||
``` |
|||
|
|||
to `PreConfigureServices` to run authentication related unit tests. |
|||
|
|||
### UI Layer |
|||
|
|||
You can follow the migrations guides from IdentityServer to OpenIddict in **reverse order** to update your UIs. You can also check the source-code for [Index.cshtml.cs](https://github.com/abpframework/abp-samples/blob/master/OpenId2Ids/src/OpenId2Ids.AuthServer/Pages/Index.cshtml) and [Index.cshtml](https://github.com/abpframework/abp-samples/blob/master/OpenId2Ids/src/OpenId2Ids.AuthServer/Pages/Index.cshtml.cs) files for **AuthServer** project. |
|||
|
|||
- [Angular UI Migration](OpenIddict-Angular.md) |
|||
- [MVC/Razor UI Migration](OpenIddict-Mvc.md) |
|||
- [Blazor-Server UI Migration](OpenIddict-Blazor-Server.md) |
|||
- [Blazor-Wasm UI Migration](OpenIddict-Blazor.md) |
|||
|
|||
## Source code of samples and module |
|||
|
|||
* [Open source tiered & separate auth server application migrate OpenIddict to Identity Server](https://github.com/abpframework/abp-samples/tree/master/OpenId2Ids) |
|||
* [IdentityServer module document](https://docs.abp.io/en/abp/6.0/Modules/IdentityServer) |
|||
* [IdentityServer module source code](https://github.com/abpframework/abp/tree/rel-6.0/modules/identityserver) |
|||
@ -0,0 +1,52 @@ |
|||
# Card Component |
|||
|
|||
The ABP Card Component is a wrapper component for the Bootstrap card class. |
|||
|
|||
## Usage |
|||
|
|||
ABP Card Component is a part of the `ThemeSharedModule` module. If you've imported that module into your module, you don't need to import it again. If not, first import it as shown below: |
|||
|
|||
```ts |
|||
// my-feature.module.ts |
|||
|
|||
import { ThemeSharedModule } from '@abp/ng.theme.shared'; |
|||
import { CardDemoComponent } from './chart-demo.component'; |
|||
|
|||
@NgModule({ |
|||
imports: [ |
|||
ThemeSharedModule , |
|||
// ... |
|||
], |
|||
declarations: [CardDemoComponent], |
|||
// ... |
|||
}) |
|||
export class MyFeatureModule {} |
|||
|
|||
``` |
|||
|
|||
Then, the `abp-card` component can be used. See the example below: |
|||
```ts |
|||
|
|||
// card-demo.component.ts |
|||
|
|||
import { Component } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'app-card-demo', |
|||
template: ` |
|||
<abp-card [cardStyle]="{width: '18rem'}"> |
|||
<abp-card-body> |
|||
<abp-card-title>Lorem Ipsum</abp-card-title> |
|||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla commodo condimentum ligula, sed varius nibh eleifend sit amet. Maecenas facilisis vel arcu nec maximus. |
|||
</abp-card-body> |
|||
</abp-card> |
|||
`, |
|||
}) |
|||
export class CardDemoComponent { } |
|||
``` |
|||
|
|||
See the result below: |
|||
|
|||
 |
|||
|
|||
As you can see in the example above, you can customize your card component's style with the `cardStyle` input. You can also add your custom classes with the `cardClass` input. |
|||
|
After Width: | Height: | Size: 26 KiB |
@ -0,0 +1,846 @@ |
|||
{ |
|||
"folders": { |
|||
"items": { |
|||
"test": {}, |
|||
"src": {} |
|||
} |
|||
}, |
|||
"packages": { |
|||
"AbpTestBase": { |
|||
"path": "test/AbpTestBase/AbpTestBase.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore": { |
|||
"path": "src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.MultiTenancy.Tests": { |
|||
"path": "test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.MultiTenancy": { |
|||
"path": "src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.MultiTenancy.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.TestBase": { |
|||
"path": "src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore": { |
|||
"path": "src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.TestBase": { |
|||
"path": "src/Volo.Abp.TestBase/Volo.Abp.TestBase.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.MongoDB": { |
|||
"path": "src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.UI": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.UI.Bootstrap": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Autofac": { |
|||
"path": "src/Volo.Abp.Autofac/Volo.Abp.Autofac.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Castle.Core": { |
|||
"path": "src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Autofac.Tests": { |
|||
"path": "test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Castle.Core.Tests": { |
|||
"path": "test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AutoMapper": { |
|||
"path": "src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AutoMapper.Tests": { |
|||
"path": "test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.TestApp": { |
|||
"path": "test/Volo.Abp.TestApp/Volo.Abp.TestApp.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.MemoryDb": { |
|||
"path": "src/Volo.Abp.MemoryDb/Volo.Abp.MemoryDb.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.MemoryDb.Tests": { |
|||
"path": "test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.TestApp.Tests": { |
|||
"path": "test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Http": { |
|||
"path": "src/Volo.Abp.Http/Volo.Abp.Http.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Http.Client": { |
|||
"path": "src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Http.Client.Tests": { |
|||
"path": "test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.Tests": { |
|||
"path": "test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"SimpleConsoleDemo": { |
|||
"path": "test/SimpleConsoleDemo/SimpleConsoleDemo.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.Tests.SecondContext": { |
|||
"path": "test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.Versioning.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.VirtualFileSystem": { |
|||
"path": "src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.VirtualFileSystem.Tests": { |
|||
"path": "test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Core": { |
|||
"path": "src/Volo.Abp.Core/Volo.Abp.Core.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Localization": { |
|||
"path": "src/Volo.Abp.Localization/Volo.Abp.Localization.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Localization.Tests": { |
|||
"path": "test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Core.Tests": { |
|||
"path": "test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.ApiVersioning.Abstractions": { |
|||
"path": "src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Data": { |
|||
"path": "src/Volo.Abp.Data/Volo.Abp.Data.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Data.Tests": { |
|||
"path": "test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.MultiTenancy": { |
|||
"path": "src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.ObjectMapping": { |
|||
"path": "src/Volo.Abp.ObjectMapping/Volo.Abp.ObjectMapping.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Validation": { |
|||
"path": "src/Volo.Abp.Validation/Volo.Abp.Validation.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Validation.Tests": { |
|||
"path": "test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Security": { |
|||
"path": "src/Volo.Abp.Security/Volo.Abp.Security.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Guids": { |
|||
"path": "src/Volo.Abp.Guids/Volo.Abp.Guids.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Threading": { |
|||
"path": "src/Volo.Abp.Threading/Volo.Abp.Threading.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Ddd.Tests": { |
|||
"path": "test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Http.Abstractions": { |
|||
"path": "src/Volo.Abp.Http.Abstractions/Volo.Abp.Http.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Authorization": { |
|||
"path": "src/Volo.Abp.Authorization/Volo.Abp.Authorization.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Json": { |
|||
"path": "src/Volo.Abp.Json/Volo.Abp.Json.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Timing": { |
|||
"path": "src/Volo.Abp.Timing/Volo.Abp.Timing.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.UI": { |
|||
"path": "src/Volo.Abp.UI/Volo.Abp.UI.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.UI.Navigation": { |
|||
"path": "src/Volo.Abp.UI.Navigation/Volo.Abp.UI.Navigation.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.UI.Navigation.Tests": { |
|||
"path": "test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Settings": { |
|||
"path": "src/Volo.Abp.Settings/Volo.Abp.Settings.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Caching": { |
|||
"path": "src/Volo.Abp.Caching/Volo.Abp.Caching.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus": { |
|||
"path": "src/Volo.Abp.EventBus/Volo.Abp.EventBus.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus.Tests": { |
|||
"path": "test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Caching.Tests": { |
|||
"path": "test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Serialization": { |
|||
"path": "src/Volo.Abp.Serialization/Volo.Abp.Serialization.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Serialization.Tests": { |
|||
"path": "test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Authorization.Tests": { |
|||
"path": "test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Authentication.OAuth": { |
|||
"path": "src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Authentication.OAuth.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Uow": { |
|||
"path": "src/Volo.Abp.Uow/Volo.Abp.Uow.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Uow.Tests": { |
|||
"path": "test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Ddd.Domain": { |
|||
"path": "src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Ddd.Application": { |
|||
"path": "src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Auditing": { |
|||
"path": "src/Volo.Abp.Auditing/Volo.Abp.Auditing.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Auditing.Tests": { |
|||
"path": "test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.MongoDB.Tests": { |
|||
"path": "test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.SqlServer": { |
|||
"path": "src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus.RabbitMQ": { |
|||
"path": "src/Volo.Abp.EventBus.RabbitMQ/Volo.Abp.EventBus.RabbitMQ.abppkg.json", |
|||
"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", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.UI.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Emailing": { |
|||
"path": "src/Volo.Abp.Emailing/Volo.Abp.Emailing.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Sms": { |
|||
"path": "src/Volo.Abp.Sms/Volo.Abp.Sms.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.UI.Bundling": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.UI.Packages": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.MySQL": { |
|||
"path": "src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BackgroundJobs": { |
|||
"path": "src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BackgroundWorkers": { |
|||
"path": "src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BackgroundJobs.Tests": { |
|||
"path": "test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.BackgroundJobs.Abstractions": { |
|||
"path": "src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BackgroundJobs.HangFire": { |
|||
"path": "src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.HangFire": { |
|||
"path": "src/Volo.Abp.HangFire/Volo.Abp.HangFire.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BackgroundJobs.RabbitMQ": { |
|||
"path": "src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.RabbitMQ": { |
|||
"path": "src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Emailing.Tests": { |
|||
"path": "test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.PostgreSql": { |
|||
"path": "src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Localization.Abstractions": { |
|||
"path": "src/Volo.Abp.Localization.Abstractions/Volo.Abp.Localization.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Security.Tests": { |
|||
"path": "test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Settings.Tests": { |
|||
"path": "test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Http.Client.IdentityModel": { |
|||
"path": "src/Volo.Abp.Http.Client.IdentityModel/Volo.Abp.Http.Client.IdentityModel.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.IdentityModel": { |
|||
"path": "src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.Client": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.Contracts": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Features": { |
|||
"path": "src/Volo.Abp.Features/Volo.Abp.Features.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Features.Tests": { |
|||
"path": "test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Authentication.JwtBearer": { |
|||
"path": "src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Cli": { |
|||
"path": "src/Volo.Abp.Cli/Volo.Abp.Cli.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.FluentValidation": { |
|||
"path": "src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.FluentValidation.Tests": { |
|||
"path": "test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.Sqlite": { |
|||
"path": "src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Cli.Core": { |
|||
"path": "src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Specifications": { |
|||
"path": "src/Volo.Abp.Specifications/Volo.Abp.Specifications.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Specifications.Tests": { |
|||
"path": "test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Cli.Core.Tests": { |
|||
"path": "test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.UI.Widgets": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Ldap": { |
|||
"path": "src/Volo.Abp.Ldap/Volo.Abp.Ldap.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Ldap.Tests": { |
|||
"path": "test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Dapper": { |
|||
"path": "src/Volo.Abp.Dapper/Volo.Abp.Dapper.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Dapper.Tests": { |
|||
"path": "test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.MailKit": { |
|||
"path": "src/Volo.Abp.MailKit/Volo.Abp.MailKit.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.MailKit.Tests": { |
|||
"path": "test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.ObjectMapping.Tests": { |
|||
"path": "test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Ddd.Application.Contracts": { |
|||
"path": "src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Minify": { |
|||
"path": "src/Volo.Abp.Minify/Volo.Abp.Minify.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Minify.Tests": { |
|||
"path": "test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Serilog": { |
|||
"path": "src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Serilog.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Http.Client.IdentityModel.Web": { |
|||
"path": "src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BackgroundJobs.Quartz": { |
|||
"path": "src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Quartz": { |
|||
"path": "src/Volo.Abp.Quartz/Volo.Abp.Quartz.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BackgroundWorkers.Quartz": { |
|||
"path": "src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.abppkg.json", |
|||
"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", |
|||
"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", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.ObjectExtending": { |
|||
"path": "src/Volo.Abp.ObjectExtending/Volo.Abp.ObjectExtending.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.ObjectExtending.Tests": { |
|||
"path": "test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.TextTemplating": { |
|||
"path": "src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.TextTemplating.Tests": { |
|||
"path": "test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Validation.Abstractions": { |
|||
"path": "src/Volo.Abp.Validation.Abstractions/Volo.Abp.Validation.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.SignalR": { |
|||
"path": "src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.SignalR.Tests": { |
|||
"path": "test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.abppkg.json", |
|||
"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", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.BlobStoring": { |
|||
"path": "src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Tests": { |
|||
"path": "test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.BlobStoring.FileSystem": { |
|||
"path": "src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BlobStoring.FileSystem.Tests": { |
|||
"path": "test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.Oracle.Devart": { |
|||
"path": "src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Azure": { |
|||
"path": "src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Azure.Tests": { |
|||
"path": "test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Minio": { |
|||
"path": "src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Minio.Tests": { |
|||
"path": "test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.EntityFrameworkCore.Oracle": { |
|||
"path": "src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Caching.StackExchangeRedis": { |
|||
"path": "src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Caching.StackExchangeRedis.Tests": { |
|||
"path": "test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Aliyun": { |
|||
"path": "src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Aliyun.Tests": { |
|||
"path": "test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Aws": { |
|||
"path": "src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.BlobStoring.Aws.Tests": { |
|||
"path": "test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Kafka": { |
|||
"path": "src/Volo.Abp.Kafka/Volo.Abp.Kafka.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus.Kafka": { |
|||
"path": "src/Volo.Abp.EventBus.Kafka/Volo.Abp.EventBus.Kafka.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.GlobalFeatures": { |
|||
"path": "src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.GlobalFeatures.Tests": { |
|||
"path": "test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.MultiLingualObjects": { |
|||
"path": "src/Volo.Abp.MultiLingualObjects/Volo.Abp.MultiLingualObjects.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.MultiLingualObjects.Tests": { |
|||
"path": "test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Http.Client.IdentityModel.WebAssembly": { |
|||
"path": "src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.Client.Common": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Components.WebAssembly": { |
|||
"path": "src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Components.WebAssembly.Theming": { |
|||
"path": "src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Autofac.WebAssembly": { |
|||
"path": "src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Authentication.OpenIdConnect": { |
|||
"path": "src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus.Rebus": { |
|||
"path": "src/Volo.Abp.EventBus.Rebus/Volo.Abp.EventBus.Rebus.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.ExceptionHandling": { |
|||
"path": "src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Components": { |
|||
"path": "src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Swashbuckle": { |
|||
"path": "src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Json.Tests": { |
|||
"path": "test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Http.Tests": { |
|||
"path": "test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Components.Web": { |
|||
"path": "src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Components.Web.Theming": { |
|||
"path": "src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus.Abstractions": { |
|||
"path": "src/Volo.Abp.EventBus.Abstractions/Volo.Abp.EventBus.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Sms.Aliyun": { |
|||
"path": "src/Volo.Abp.Sms.Aliyun/Volo.Abp.Sms.Aliyun.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Sms.Aliyun.Tests": { |
|||
"path": "test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Components.Server": { |
|||
"path": "src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Components.Server.Theming": { |
|||
"path": "src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.abppkg.json", |
|||
"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", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AzureServiceBus": { |
|||
"path": "src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus.Azure": { |
|||
"path": "src/Volo.Abp.EventBus.Azure/Volo.Abp.EventBus.Azure.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Authorization.Abstractions": { |
|||
"path": "src/Volo.Abp.Authorization.Abstractions/Volo.Abp.Authorization.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.TextTemplating.Core": { |
|||
"path": "src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.TextTemplating.Scriban": { |
|||
"path": "src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.TextTemplating.Razor": { |
|||
"path": "src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.TextTemplating.Razor.Tests": { |
|||
"path": "test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.TextTemplating.Scriban.Tests": { |
|||
"path": "test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.MongoDB.Tests.SecondContext": { |
|||
"path": "test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.IdentityModel.Tests": { |
|||
"path": "test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Threading.Tests": { |
|||
"path": "test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.DistributedLocking": { |
|||
"path": "src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Auditing.Contracts": { |
|||
"path": "src/Volo.Abp.Auditing.Contracts/Volo.Abp.Auditing.Contracts.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Http.Client.Web": { |
|||
"path": "src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.DistributedLocking.Abstractions": { |
|||
"path": "src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.DistributedLocking.Abstractions.Tests": { |
|||
"path": "test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.BackgroundWorkers.Hangfire": { |
|||
"path": "src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Gdpr.Abstractions": { |
|||
"path": "src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.RemoteServices": { |
|||
"path": "src/Volo.Abp.RemoteServices/Volo.Abp.RemoteServices.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.PlugIn": { |
|||
"path": "test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.abppkg.json", |
|||
"folder": "test" |
|||
}, |
|||
"Volo.Abp.Json.Newtonsoft": { |
|||
"path": "src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Json.SystemTextJson": { |
|||
"path": "src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Json.Abstractions": { |
|||
"path": "src/Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.NewtonsoftJson": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Dapr": { |
|||
"path": "src/Volo.Abp.Dapr/Volo.Abp.Dapr.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.EventBus.Dapr": { |
|||
"path": "src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.Http.Client.Dapr": { |
|||
"path": "src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.Dapr": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.AspNetCore.Mvc.Dapr.EventBus": { |
|||
"path": "src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.abppkg.json", |
|||
"folder": "src" |
|||
}, |
|||
"Volo.Abp.DistributedLocking.Dapr": { |
|||
"path": "src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.abppkg.json", |
|||
"folder": "src" |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
{ |
|||
"template": "empty", |
|||
"modules": { |
|||
"Volo.Abp": { |
|||
"path": "Volo.Abp.abpmdl.json" |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,57 @@ |
|||
{ |
|||
"name": "Volo.Abp.ApiVersioning.Abstractions", |
|||
"hash": "", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.ApiVersioning", |
|||
"dependsOnModules": [], |
|||
"implementingInterfaces": [ |
|||
{ |
|||
"name": "IAbpModule", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IAbpModule" |
|||
}, |
|||
{ |
|||
"name": "IOnPreApplicationInitialization", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnApplicationInitialization", |
|||
"namespace": "Volo.Abp", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.IOnApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnPostApplicationInitialization", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnApplicationShutdown", |
|||
"namespace": "Volo.Abp", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.IOnApplicationShutdown" |
|||
}, |
|||
{ |
|||
"name": "IPreConfigureServices", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IPreConfigureServices" |
|||
}, |
|||
{ |
|||
"name": "IPostConfigureServices", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IPostConfigureServices" |
|||
} |
|||
], |
|||
"contentType": "abpModule", |
|||
"name": "AbpApiVersioningAbstractionsModule", |
|||
"summary": null |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,63 @@ |
|||
{ |
|||
"name": "Volo.Abp.AspNetCore.Authentication.JwtBearer", |
|||
"hash": "", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.AspNetCore.Authentication.JwtBearer", |
|||
"dependsOnModules": [ |
|||
{ |
|||
"declaringAssemblyName": "Volo.Abp.Security", |
|||
"namespace": "Volo.Abp.Security", |
|||
"name": "AbpSecurityModule" |
|||
} |
|||
], |
|||
"implementingInterfaces": [ |
|||
{ |
|||
"name": "IAbpModule", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IAbpModule" |
|||
}, |
|||
{ |
|||
"name": "IOnPreApplicationInitialization", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnApplicationInitialization", |
|||
"namespace": "Volo.Abp", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.IOnApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnPostApplicationInitialization", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnApplicationShutdown", |
|||
"namespace": "Volo.Abp", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.IOnApplicationShutdown" |
|||
}, |
|||
{ |
|||
"name": "IPreConfigureServices", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IPreConfigureServices" |
|||
}, |
|||
{ |
|||
"name": "IPostConfigureServices", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IPostConfigureServices" |
|||
} |
|||
], |
|||
"contentType": "abpModule", |
|||
"name": "AbpAspNetCoreAuthenticationJwtBearerModule", |
|||
"summary": null |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,73 @@ |
|||
{ |
|||
"name": "Volo.Abp.AspNetCore.Authentication.OpenIdConnect", |
|||
"hash": "", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.AspNetCore.Authentication.OpenIdConnect", |
|||
"dependsOnModules": [ |
|||
{ |
|||
"declaringAssemblyName": "Volo.Abp.MultiTenancy", |
|||
"namespace": "Volo.Abp.MultiTenancy", |
|||
"name": "AbpMultiTenancyModule" |
|||
}, |
|||
{ |
|||
"declaringAssemblyName": "Volo.Abp.AspNetCore.Authentication.OAuth", |
|||
"namespace": "Volo.Abp.AspNetCore.Authentication.OAuth", |
|||
"name": "AbpAspNetCoreAuthenticationOAuthModule" |
|||
}, |
|||
{ |
|||
"declaringAssemblyName": "Volo.Abp.RemoteServices", |
|||
"namespace": "Volo.Abp.RemoteServices", |
|||
"name": "AbpRemoteServicesModule" |
|||
} |
|||
], |
|||
"implementingInterfaces": [ |
|||
{ |
|||
"name": "IAbpModule", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IAbpModule" |
|||
}, |
|||
{ |
|||
"name": "IOnPreApplicationInitialization", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IOnPreApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnApplicationInitialization", |
|||
"namespace": "Volo.Abp", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.IOnApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnPostApplicationInitialization", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IOnPostApplicationInitialization" |
|||
}, |
|||
{ |
|||
"name": "IOnApplicationShutdown", |
|||
"namespace": "Volo.Abp", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.IOnApplicationShutdown" |
|||
}, |
|||
{ |
|||
"name": "IPreConfigureServices", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IPreConfigureServices" |
|||
}, |
|||
{ |
|||
"name": "IPostConfigureServices", |
|||
"namespace": "Volo.Abp.Modularity", |
|||
"declaringAssemblyName": "Volo.Abp.Core", |
|||
"fullName": "Volo.Abp.Modularity.IPostConfigureServices" |
|||
} |
|||
], |
|||
"contentType": "abpModule", |
|||
"name": "AbpAspNetCoreAuthenticationOpenIdConnectModule", |
|||
"summary": null |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,56 @@ |
|||
using System; |
|||
using IdentityModel.Client; |
|||
using Microsoft.AspNetCore.Authentication.OpenIdConnect; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Options; |
|||
|
|||
namespace Microsoft.AspNetCore.Authentication.Cookies; |
|||
|
|||
public static class CookieAuthenticationOptionsExtensions |
|||
{ |
|||
/// <summary>
|
|||
/// Introspect access token on validating the principal.
|
|||
/// </summary>
|
|||
/// <param name="options"></param>
|
|||
/// <param name="oidcAuthenticationScheme"></param>
|
|||
/// <returns></returns>
|
|||
public static CookieAuthenticationOptions IntrospectAccessToken(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc") |
|||
{ |
|||
var originalHandler = options.Events.OnValidatePrincipal; |
|||
options.Events.OnValidatePrincipal = async principalContext => |
|||
{ |
|||
originalHandler?.Invoke(principalContext); |
|||
|
|||
if (principalContext.Principal != null && principalContext.Principal.Identity != null && principalContext.Principal.Identity.IsAuthenticated) |
|||
{ |
|||
var accessToken = principalContext.Properties.GetTokenValue("access_token"); |
|||
if (!accessToken.IsNullOrWhiteSpace()) |
|||
{ |
|||
var openIdConnectOptions = principalContext.HttpContext.RequestServices.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>().Get(oidcAuthenticationScheme); |
|||
if (openIdConnectOptions.Configuration == null && openIdConnectOptions.ConfigurationManager != null) |
|||
{ |
|||
openIdConnectOptions.Configuration = await openIdConnectOptions.ConfigurationManager.GetConfigurationAsync(principalContext.HttpContext.RequestAborted); |
|||
} |
|||
|
|||
var response = await openIdConnectOptions.Backchannel.IntrospectTokenAsync(new TokenIntrospectionRequest |
|||
{ |
|||
Address = openIdConnectOptions.Configuration?.IntrospectionEndpoint ?? openIdConnectOptions.Authority.EnsureEndsWith('/') + "connect/introspect", |
|||
ClientId = openIdConnectOptions.ClientId, |
|||
ClientSecret = openIdConnectOptions.ClientSecret, |
|||
Token = accessToken |
|||
}); |
|||
|
|||
if (response.IsActive) |
|||
{ |
|||
return; |
|||
} |
|||
} |
|||
|
|||
principalContext.RejectPrincipal(); |
|||
await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name); |
|||
} |
|||
}; |
|||
|
|||
return options; |
|||
} |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.AspNetCore.Components.Web.Configuration; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Components.WebAssembly.Configuration; |
|||
|
|||
[Dependency(ReplaceServices = true)] |
|||
public class BlazorWebAssemblyCurrentApplicationConfigurationCacheResetService : |
|||
ICurrentApplicationConfigurationCacheResetService, |
|||
ITransientDependency |
|||
{ |
|||
private readonly WebAssemblyCachedApplicationConfigurationClient _webAssemblyCachedApplicationConfigurationClient; |
|||
|
|||
public BlazorWebAssemblyCurrentApplicationConfigurationCacheResetService(WebAssemblyCachedApplicationConfigurationClient webAssemblyCachedApplicationConfigurationClient) |
|||
{ |
|||
_webAssemblyCachedApplicationConfigurationClient = webAssemblyCachedApplicationConfigurationClient; |
|||
} |
|||
|
|||
public async Task ResetAsync() |
|||
{ |
|||
await _webAssemblyCachedApplicationConfigurationClient.InitializeAsync(); |
|||
} |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||