diff --git a/Directory.Packages.props b/Directory.Packages.props index 447399045d..bda9794bab 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -123,7 +123,7 @@ - + diff --git a/configureawait.props b/configureawait.props index 4356600b62..a38cc8a80f 100644 --- a/configureawait.props +++ b/configureawait.props @@ -6,4 +6,22 @@ runtime; build; native; contentfiles; analyzers + + + + false + + + + + + + + + + diff --git a/docs/en/Blog-Posts/2024-07-31 v8_3_Preview/post.md b/docs/en/Blog-Posts/2024-07-31 v8_3_Preview/post.md index fc3590b0d5..dff0e1fdae 100644 --- a/docs/en/Blog-Posts/2024-07-31 v8_3_Preview/post.md +++ b/docs/en/Blog-Posts/2024-07-31 v8_3_Preview/post.md @@ -165,7 +165,7 @@ There are exciting articles contributed by the ABP community as always. I will h * [Create a Generic HTTP Service to Consume a Web API](https://abp.io/community/articles/create-a-generic-http-service-to-consume-a-web-api-yidme2kq) by [Bart Van Hoey](https://github.com/bartvanhoey) * [Use User-Defined Function Mapping for Global Filter](https://abp.io/community/articles/use-userdefined-function-mapping-for-global-filter-pht26l07) by [Liming Ma](https://github.com/maliming) -* [How to use .NET Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk) by [Berkan Şaşmaz](https://twitter.com/berkansasmazz) +* [How to use Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk) by [Berkan Şaşmaz](https://twitter.com/berkansasmazz) * [Exciting New Feature in ABP.IO CMS Kit: Marked Item System](https://abp.io/community/articles/exciting-new-feature-in-abp.io-cms-kit-marked-item-system.-2hvpq0me) by [Suhaib Mousa](https://abp.io/community/members/suhaibmousa032@gmail.com) Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/create) to the ABP Community. diff --git a/docs/en/Blog-Posts/2024-09-17-My-Impressions-at-DotNext-2024-Conference/post.md b/docs/en/Blog-Posts/2024-09-17-My-Impressions-at-DotNext-2024-Conference/post.md index c6ac51d273..c426dad0c6 100644 --- a/docs/en/Blog-Posts/2024-09-17-My-Impressions-at-DotNext-2024-Conference/post.md +++ b/docs/en/Blog-Posts/2024-09-17-My-Impressions-at-DotNext-2024-Conference/post.md @@ -14,7 +14,7 @@ Last week, I had the chance of being a speaker at **DotNext 2024** in Moscow. [J One of the standout aspects of the conference was its strong technical focus, particularly on deep-dive .NET topics. Talks covered subjects like **low-level optimizations**, architecture, performance, and platform internals. -The conference started with Sergei Benzenko's talk "What's New in .NET 9". There are important topics like ".NET Aspire in Action", "AI-Driven Software Development", "DDD and Strategic Design" and "OAuth 2.0 User-Managed Access in ASP.NET Core with Keycloak". +The conference started with Sergei Benzenko's talk "What's New in .NET 9". There are important topics like "Aspire in Action", "AI-Driven Software Development", "DDD and Strategic Design" and "OAuth 2.0 User-Managed Access in ASP.NET Core with Keycloak". ![DotNext 2024 Speakers](speakers.png) diff --git a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/POST.md b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/POST.md index db52eed7d5..79b50c3d6b 100644 --- a/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/POST.md +++ b/docs/en/Blog-Posts/2024-10-23 v9_0_Preview/POST.md @@ -209,7 +209,7 @@ There are exciting articles contributed by the ABP community as always. I will h * [Mohammad AlMohammad AlMahmoud](https://abp.io/community/members/Mohammad97Dev) has created **two** new community articles: * [Implementing Multi-Language Functionality With ABP Framework](https://abp.io/community/articles/implementing-multilanguage-functionality-with-abp-framework-loq7kfx4) * [Configure Quartz.Net in Abp FrameWork](https://abp.io/community/articles/configure-quartz.net-in-abp-framework-3bveq4y1) -* [.NET Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l) by [Halil İbrahim Kalkan](https://twitter.com/hibrahimkalkan) +* [Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l) by [Halil İbrahim Kalkan](https://twitter.com/hibrahimkalkan) * [PoC of using GrapesJS for ABPs CMS Kit](https://abp.io/community/articles/poc-of-using-grapesjs-for-abps-cms-kit-1rmv4q41) by [Jack Fistelmann](https://abp.io/community/members/jfistelmann) * [ABP-Powered Web App with Inertia.js, React, and Vite](https://abp.io/community/articles/abppowered-web-app-with-inertia.js-react-and-vite-j7cccvad) by [Anto Subash](https://antosubash.com/) * [Multi-Tenancy Support in Angular Apps with ABP.IO](https://abp.io/community/articles/multitenancy-support-in-angular-apps-with-abp.io-lw9l36c5) by [HeadChannel Team](https://headchannel.co.uk/) diff --git a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md index 8b37325e7e..38ccce7748 100644 --- a/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md +++ b/docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md @@ -87,7 +87,7 @@ We will keep releasing new versions with exciting features based on our roadmap - **OpenTelemetry Integration:** We'll be integrating OpenTelemetry support directly into the startup templates, making distributed tracing and observability a seamless part of your application from day one. - **LeptonX Theme Builder**: Allowing users to determine styling, colour palette and easily override their project's theme styles. - **Monitor dashboards of the tools used in the solution (e.g. Kubernetes, Redis, Grafana, etc...)** -- **Pre-configured .NET Aspire for the Microservice Startup Template** +- **Pre-configured Aspire for the Microservice Startup Template** - **and more...** We are incredibly excited about the future of ABP Studio and can't wait to share the next set of features with you. Your comments and suggestions are invaluable to us. If you have any feedback, please drop a comment below. diff --git a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/POST.md b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/POST.md index a56dd5a464..7ef2be8c6b 100644 --- a/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/POST.md +++ b/docs/en/Blog-Posts/2025-12-24-Announcing-Aspire-For-Microservice-Template/POST.md @@ -1,8 +1,8 @@ -# Announcing .NET Aspire Integration for ABP Microservice Template +# Announcing Aspire Integration for ABP Microservice Template -We are excited to announce the integration of **.NET Aspire** into the ABP microservice solution, available starting with **ABP Studio v2.0.0**. This integration brings a unified development experience for building, running, debugging, and deploying distributed applications. With Aspire, you can now orchestrate your entire microservice ecosystem with a single command, eliminating complex configurations and making local development effortless. +We are excited to announce the integration of **Aspire** into the ABP microservice solution, available starting with **ABP Studio v2.0.0**. This integration brings a unified development experience for building, running, debugging, and deploying distributed applications. With Aspire, you can now orchestrate your entire microservice ecosystem with a single command, eliminating complex configurations and making local development effortless. -## What is .NET Aspire? +## What is Aspire? [Aspire](https://aspire.dev/get-started/what-is-aspire/) is a cloud-ready stack designed to streamline the development of distributed applications. It provides: @@ -14,7 +14,7 @@ We are excited to announce the integration of **.NET Aspire** into the ABP micro ## How Does It Work with ABP? -When you enable .NET Aspire in an ABP microservice solution, you get a fully integrated development experience where: +When you enable Aspire in an ABP microservice solution, you get a fully integrated development experience where: - All microservices, gateways, and applications are orchestrated through a single entry point (AppHost). - Infrastructure containers (databases, Redis, RabbitMQ, Elasticsearch, etc.) are managed as code. @@ -24,8 +24,8 @@ When you enable .NET Aspire in an ABP microservice solution, you get a fully int When creating a new microservice solution via ABP Studio: -1. In the solution creation wizard, look for the **".NET Aspire Integration"** step. -2. Toggle the option to **enable .NET Aspire**. +1. In the solution creation wizard, look for the **"Aspire Integration"** step. +2. Toggle the option to **enable Aspire**. 3. Complete the wizard—Aspire projects will be generated along with your solution. ![Enable Aspire in ABP Studio](aspire-configuration.png) @@ -38,7 +38,7 @@ When Aspire is enabled, two additional projects are added to your solution: ### AppHost (Orchestrator) -[`AppHost`](https://aspire.dev/get-started/app-host/) is the .NET Aspire orchestrator project that declares all resources (services, databases, containers, applications) and their dependencies in C# code. It provides: +[`AppHost`](https://aspire.dev/get-started/app-host/) is the Aspire orchestrator project that declares all resources (services, databases, containers, applications) and their dependencies in C# code. It provides: - **Centralized orchestration**: Start your entire microservice ecosystem with a single command. - **Code-first infrastructure**: Databases, Redis, RabbitMQ, Elasticsearch, and observability tools are defined programmatically. @@ -162,9 +162,9 @@ The database management admin tool varies by database type: ## Get Started Today -Ready to experience the power of .NET Aspire with ABP? Create a new microservice solution in ABP Studio and enable the .NET Aspire integration option. For detailed documentation, visit our [.NET Aspire Integration documentation](https://abp.io/docs/latest/solution-templates/microservice/aspire-integration). +Ready to experience the power of Aspire with ABP? Create a new microservice solution in ABP Studio and enable the Aspire integration option. For detailed documentation, visit our [Aspire Integration documentation](https://abp.io/docs/latest/solution-templates/microservice/aspire-integration). -To learn more about .NET Aspire, visit: [https://aspire.dev](https://aspire.dev/get-started/what-is-aspire/) +To learn more about Aspire, visit: [https://aspire.dev](https://aspire.dev/get-started/what-is-aspire/) We are excited to bring this integration to you and can't wait to hear your feedback. If you have any questions or suggestions, please drop a comment below. diff --git a/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md b/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md index c6a37d85cd..f9aa44aa2e 100644 --- a/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md +++ b/docs/en/Community-Articles/2024-01-15-Abp-Supports-NET8/Post.md @@ -7,9 +7,9 @@ Here's the summary of .NET 8 features and enhancements: ## What's new in .NET 8 -### .NET Aspire +### Aspire -[.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/) is a tool to observe and manage distributed web applications. It's still preview version. You can manage your containers, executables, logs, traces and metrics of your running web application. For more information see this article https://devblogs.microsoft.com/dotnet/introducing-dotnet-aspire-simplifying-cloud-native-development-with-dotnet-8/ +[Aspire](https://aspire.dev/) is a tool to observe and manage distributed web applications. It's still preview version. You can manage your containers, executables, logs, traces and metrics of your running web application. For more information see this article https://devblogs.microsoft.com/dotnet/introducing-dotnet-aspire-simplifying-cloud-native-development-with-dotnet-8/ ### Serialization diff --git a/docs/en/Community-Articles/2024-03-19-join-abpio-at-modern-net-web-day/post.md b/docs/en/Community-Articles/2024-03-19-join-abpio-at-modern-net-web-day/post.md index df8844f18a..d8a7dc0a9e 100644 --- a/docs/en/Community-Articles/2024-03-19-join-abpio-at-modern-net-web-day/post.md +++ b/docs/en/Community-Articles/2024-03-19-join-abpio-at-modern-net-web-day/post.md @@ -11,7 +11,7 @@ Join us dive into the magic of .NET 8 at the community live stream event, "Moder Topics that will be covered include: * *ASP.NET Core*: Crafting Maintainable Microservices -* *Cloud Native development with .NET Aspire* +* *Cloud Native development with Aspire* * *Developer Productivity with Visual Studio and .NET* * *GitHub Copilot configuration, extension, tips and tricks* * *User Experience and Front-End Development*: Delve into responsive design, accessibility, and performance optimization. Discuss modern front-end frameworks (Blazor, React, Angular, etc.) in the .NET ecosystem. Share strategies for creating delightful user interfaces. diff --git a/docs/en/Community-Articles/2024-04-16-welcome-to-abp-dotnet-conf24-a-decade-of-net-innovation/post.md b/docs/en/Community-Articles/2024-04-16-welcome-to-abp-dotnet-conf24-a-decade-of-net-innovation/post.md index 92635c6f7e..f878d9ce2d 100644 --- a/docs/en/Community-Articles/2024-04-16-welcome-to-abp-dotnet-conf24-a-decade-of-net-innovation/post.md +++ b/docs/en/Community-Articles/2024-04-16-welcome-to-abp-dotnet-conf24-a-decade-of-net-innovation/post.md @@ -50,7 +50,7 @@ As we always be careful with topics we choose on our regular **[ABP Community Ta * 🎙️[Adora Nwodo](https://abp.io/conference/2024/speakers/adora-nwodo), Designing Secure Cloud Native Apps with .NET and Azure * 🎙️[Nicola Iarocci](https://abp.io/conference/2024/speakers/nicola-iarocci), C# 12 What's new and interesting * 🎙️[Jimmy Engström](https://abp.io/conference/2024/speakers/jimmy-engstrom), Connecting gadgets to Blazor -* 🎙️[Juergen Gutsch](https://abp.io/conference/2024/speakers/juergen-gutsch), Building cloud native applications with .NET Aspire +* 🎙️[Juergen Gutsch](https://abp.io/conference/2024/speakers/juergen-gutsch), Building cloud native applications with Aspire * 🎙️[Halil Ibrahim Kalkan](https://abp.io/conference/2024/speakers/halil-ibrahim-kalkan), Designing Modular Monolith for Microservice Architecture * 🎙️[Shaun Lawrence](https://abp.io/conference/2024/speakers/shaun-lawrance), Building games in .NET MAUI * 🎙️[Jamie Taylor](https://abp.io/conference/2024/speakers/jamie-taylor), Empathy, Sympathy and Compassion diff --git a/docs/en/Community-Articles/2024-05-16-abp-dotnet-conference-2024-wrap-up/post.md b/docs/en/Community-Articles/2024-05-16-abp-dotnet-conference-2024-wrap-up/post.md index 426b01639c..1d509fadd4 100644 --- a/docs/en/Community-Articles/2024-05-16-abp-dotnet-conference-2024-wrap-up/post.md +++ b/docs/en/Community-Articles/2024-05-16-abp-dotnet-conference-2024-wrap-up/post.md @@ -33,7 +33,7 @@ The success of ABP Dotnet Conference 2024 would not have been possible without t * 🎙️[Adora Nwodo](https://abp.io/conference/2024/speakers/adora-nwodo), Designing Secure Cloud Native Apps with .NET and Azure * 🎙️[Nicola Iarocci](https://abp.io/conference/2024/speakers/nicola-iarocci), C# 12 What's new and interesting * 🎙️[Jimmy Engström](https://abp.io/conference/2024/speakers/jimmy-engstrom), Connecting gadgets to Blazor -* 🎙️[Juergen Gutsch](https://abp.io/conference/2024/speakers/juergen-gutsch), Building cloud native applications with .NET Aspire +* 🎙️[Juergen Gutsch](https://abp.io/conference/2024/speakers/juergen-gutsch), Building cloud native applications with Aspire * 🎙️[Halil Ibrahim Kalkan](https://abp.io/conference/2024/speakers/halil-ibrahim-kalkan), Designing Modular Monolith for Microservice Architecture * 🎙️[Shaun Lawrence](https://abp.io/conference/2024/speakers/shaun-lawrance), Building games in .NET MAUI * 🎙️[Jamie Taylor](https://abp.io/conference/2024/speakers/jamie-taylor), Empathy, Sympathy and Compassion diff --git a/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md b/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md index 4afe83c7c9..c5529d2de2 100644 --- a/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md +++ b/docs/en/Community-Articles/2024-06-27-how-to-use-Aspire-with-ABP-framework/How to use Aspire with ABP framework.md @@ -1,17 +1,17 @@ -# How to use .NET Aspire with ABP framework +# How to use Aspire with ABP framework -[.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/get-started/aspire-overview) is an opinionated, cloud-ready stack designed for building observable, production-ready, and distributed applications. On the other hand, the [ABP framework](https://docs.abp.io/en/abp/latest) offers a complete, modular and layered software architecture based on Domain Driven Design principles and patterns. This guide explores how to combine .NET Aspire with ABP, enabling developers to create observable, and feature-rich applications. +[Aspire](https://aspire.dev/get-started/what-is-aspire/) is an opinionated, cloud-ready stack designed for building observable, production-ready, and distributed applications. On the other hand, the [ABP framework](https://docs.abp.io/en/abp/latest) offers a complete, modular and layered software architecture based on Domain Driven Design principles and patterns. This guide explores how to combine Aspire with ABP, enabling developers to create observable, and feature-rich applications. -## When to Use .NET Aspire? +## When to Use Aspire? -Using .NET Aspire with the ABP framework can be beneficial in various scenarios where you need to combine the strengths of both technologies. Here are some situations when using .NET Aspire with ABP can be advantageous: +Using Aspire with the ABP framework can be beneficial in various scenarios where you need to combine the strengths of both technologies. Here are some situations when using Aspire with ABP can be advantageous: -- **Enterprise Web Applications:** ABP is well-suited for building enterprise web applications with its opinionated architecture and best practices. When combined with .NET Aspire, you can leverage ABP's features for rapid development of user interfaces, backend services, and business logic while benefiting from .NET Aspire's cloud-native capabilities and observability features. -- **Observability and Monitoring:** .NET Aspire's emphasis on observability, including logging, monitoring, and tracing, can enhance ABP applications by providing deeper insights into system behavior, performance metrics, and diagnostics, which is key for maintaining and optimizing enterprise-grade applications. +- **Enterprise Web Applications:** ABP is well-suited for building enterprise web applications with its opinionated architecture and best practices. When combined with Aspire, you can leverage ABP's features for rapid development of user interfaces, backend services, and business logic while benefiting from Aspire's cloud-native capabilities and observability features. +- **Observability and Monitoring:** Aspire's emphasis on observability, including logging, monitoring, and tracing, can enhance ABP applications by providing deeper insights into system behavior, performance metrics, and diagnostics, which is key for maintaining and optimizing enterprise-grade applications. ## Creating a new ABP Solution -To demonstrate the usage of .NET Aspire with the ABP framework, I've created an ABP solution. If you want to create the same solution from scratch, follow the steps below: +To demonstrate the usage of Aspire with the ABP framework, I've created an ABP solution. If you want to create the same solution from scratch, follow the steps below: Install the ABP CLI if you haven't installed it before: @@ -27,12 +27,12 @@ abp new AspirationalAbp -u mvc --database-provider ef -dbms PostgreSQL --csf --t > The startup template selection matters for this article. I chose these options so that the demo solution can cover complex scenarios. -**Disclaimer-I:** This article is based on version `8.0.1` of .NET Aspire and version `8.2.0` of ABP Framework. +**Disclaimer-I:** This article is based on version `8.0.1` of Aspire and version `8.2.0` of ABP Framework. -**Disclaimer-II:** ABP and .NET Aspire may not be fully compatible in some respects. This article aims to explain how these two technologies can be used together in the simplest way possible, even if they are not fully compatible. -## Add .NET Aspire +**Disclaimer-II:** ABP and Aspire may not be fully compatible in some respects. This article aims to explain how these two technologies can be used together in the simplest way possible, even if they are not fully compatible. +## Add Aspire -After creating the solution, run the following commands in the `src` folder of your solution to add .NET Aspire: +After creating the solution, run the following commands in the `src` folder of your solution to add Aspire: ```bash // Adding AppHost @@ -46,11 +46,11 @@ dotnet sln ../AspirationalAbp.sln add ./AspirationalAbp.ServiceDefaults/Aspirati These commands add two new projects to the solution: - **AspirationalAbp.AppHost**: An orchestrator project designed to connect and configure the different projects and services of your app. -- **AspirationalAbp.ServiceDefaults**: A .NET Aspire shared project to manage configurations that are reused across the projects in your solution related to [resilience](https://learn.microsoft.com/en-us/dotnet/core/resilience/http-resilience), [service discovery](https://learn.microsoft.com/en-us/dotnet/aspire/service-discovery/overview), and [telemetry](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/telemetry). +- **AspirationalAbp.ServiceDefaults**: An Aspire shared project to manage configurations that are reused across the projects in your solution related to [resilience](https://learn.microsoft.com/en-us/dotnet/core/resilience/http-resilience), [service discovery](https://aspire.dev/fundamentals/service-discovery/), and [telemetry](https://aspire.dev/fundamentals/telemetry/). -We have added .NET Aspire to our ABP based solution, but we have not registered our projects in the .NET Aspire orchestration. Now, let's enroll our projects, which implement the db migrator, web user interface, API, and auth, in .NET Aspire orchestration. +We have added Aspire to our ABP based solution, but we have not registered our projects in the Aspire orchestration. Now, let's enroll our projects, which implement the db migrator, web user interface, API, and auth, in Aspire orchestration. -## Registering projects to .NET Aspire orchestration +## Registering projects to Aspire orchestration First of all, we need to add the reference of related projects to the `AspirationalAbp.AppHost` project. For this, add the following `ItemGroups` to the `AspirationalAbp.AppHost/AspirationalAbp.AppHost.csproj` file: @@ -130,11 +130,11 @@ With the code above, the following operations were performed below: 7. Adds the `Web` project, referencing Redis. 8. Builds and runs the application. -Now let's make the projects we added to the app host compatible with .NET Aspire. +Now let's make the projects we added to the app host compatible with Aspire. ## Configuring Projects for Aspire -To make the `AspirationalAbp.DbMigrator`, `AspirationalAbp.AuthServer`, `AspirationalAbp.HttpApi.Host`, and `AspirationalAbp.Web` projects compatible with .NET Aspire, we need to add and configure several packages. For that, we need to add the `Aspire.StackExchange.Redis` package to all these projects and the `Aspire.Npgsql.EntityFrameworkCore.PostgreSQL` package to the `AspirationalAbp.EntityFrameworkCore` project. Additionally, we will add the `AspirationalAbp.ServiceDefaults` reference to host projects except `AspirationalAbp.DbMigrator`. Also, we need to convert [Serilog](https://serilog.net/) events into [OpenTelemetry](https://opentelemetry.io/) `LogRecord`s, for that we will add a `Serilog.Sinks.OpenTelemetry` reference to host projects. Let's begin with configuring `AspirationalAbp.DbMigrator`. +To make the `AspirationalAbp.DbMigrator`, `AspirationalAbp.AuthServer`, `AspirationalAbp.HttpApi.Host`, and `AspirationalAbp.Web` projects compatible with Aspire, we need to add and configure several packages. For that, we need to add the `Aspire.StackExchange.Redis` package to all these projects and the `Aspire.Npgsql.EntityFrameworkCore.PostgreSQL` package to the `AspirationalAbp.EntityFrameworkCore` project. Additionally, we will add the `AspirationalAbp.ServiceDefaults` reference to host projects except `AspirationalAbp.DbMigrator`. Also, we need to convert [Serilog](https://serilog.net/) events into [OpenTelemetry](https://opentelemetry.io/) `LogRecord`s, for that we will add a `Serilog.Sinks.OpenTelemetry` reference to host projects. Let's begin with configuring `AspirationalAbp.DbMigrator`. ### AspirationalAbp.DbMigrator @@ -211,7 +211,7 @@ To use the **OpenTelemetry** sink we have installed the `Serilog.Sinks.OpenTelem /// .CreateLogger(); ``` -So far we have made `AspirationalAbp.DbMigrator`, `AspirationalAbp.EntityFrameworkCore`, and `AspirationalAbp.AuthServer` compatible with .NET Aspire. Now let's continue with `AspirationalAbp.HttpApi.Host`. +So far we have made `AspirationalAbp.DbMigrator`, `AspirationalAbp.EntityFrameworkCore`, and `AspirationalAbp.AuthServer` compatible with Aspire. Now let's continue with `AspirationalAbp.HttpApi.Host`. ### AspirationalAbp.HttpApi.Host @@ -253,7 +253,7 @@ To use the **OpenTelemetry** sink we have installed the `Serilog.Sinks.OpenTelem /// .CreateLogger(); ``` -Finally, let's make `AspirationalAbp.Web` compatible with .NET Aspire. +Finally, let's make `AspirationalAbp.Web` compatible with Aspire. ### AspirationalAbp.Web @@ -299,8 +299,8 @@ After making all our changes, we can run the `AspirationalAbp.AppHost` project. ## Conclusion -Combining .NET Aspire with the ABP framework creates a powerful setup for building robust, observable, and feature-rich applications. By integrating Aspire's observability and cloud capabilities with ABP's approach of focusing on your business without repeating yourself, you can develop feature-rich, scalable applications with enhanced monitoring and seamless cloud integration. This guide provides a clear path to set up and configure these technologies, ensuring your applications are well-structured, maintainable, and ready for modern cloud environments. +Combining Aspire with the ABP framework creates a powerful setup for building robust, observable, and feature-rich applications. By integrating Aspire's observability and cloud capabilities with ABP's approach of focusing on your business without repeating yourself, you can develop feature-rich, scalable applications with enhanced monitoring and seamless cloud integration. This guide provides a clear path to set up and configure these technologies, ensuring your applications are well-structured, maintainable, and ready for modern cloud environments. ## See Also -* [.NET Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l) +* [Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l) diff --git a/docs/en/Community-Articles/2024-08-01-abpio-platform-83-rc-has-been-published/post.md b/docs/en/Community-Articles/2024-08-01-abpio-platform-83-rc-has-been-published/post.md index 4ddd247a63..9ddf93d189 100644 --- a/docs/en/Community-Articles/2024-08-01-abpio-platform-83-rc-has-been-published/post.md +++ b/docs/en/Community-Articles/2024-08-01-abpio-platform-83-rc-has-been-published/post.md @@ -162,7 +162,7 @@ There are exciting articles contributed by the ABP community as always. I will h * [Create a Generic HTTP Service to Consume a Web API](https://abp.io/community/articles/create-a-generic-http-service-to-consume-a-web-api-yidme2kq) by [Bart Van Hoey](https://github.com/bartvanhoey) * [Use User-Defined Function Mapping for Global Filter](https://abp.io/community/articles/use-userdefined-function-mapping-for-global-filter-pht26l07) by [Liming Ma](https://github.com/maliming) -* [How to use .NET Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk) by [Berkan Şaşmaz](https://twitter.com/berkansasmazz) +* [How to use Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk) by [Berkan Şaşmaz](https://twitter.com/berkansasmazz) * [Exciting New Feature in ABP.IO CMS Kit: Marked Item System](https://abp.io/community/articles/exciting-new-feature-in-abp.io-cms-kit-marked-item-system.-2hvpq0me) by [Suhaib Mousa](https://abp.io/community/members/suhaibmousa032@gmail.com) Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/create) to the ABP Community. diff --git a/docs/en/Community-Articles/2024-08-12-join-abp-at-net-conf-focus-on-ai/post.md b/docs/en/Community-Articles/2024-08-12-join-abp-at-net-conf-focus-on-ai/post.md index 432ece093c..f1a4f979fa 100644 --- a/docs/en/Community-Articles/2024-08-12-join-abp-at-net-conf-focus-on-ai/post.md +++ b/docs/en/Community-Articles/2024-08-12-join-abp-at-net-conf-focus-on-ai/post.md @@ -17,7 +17,7 @@ Get ready for deep dives into AI integration, practical examples, and insights f ### Session Highlights * **Getting Started with AI in .NET** by *Stephen Toub* -* **NET Aspire and Semantic Kernel** by *Steve Sanderson* and *Matthew Bolanos* +* **Aspire and Semantic Kernel** by *Steve Sanderson* and *Matthew Bolanos* * **Interactive AI with Blazor and .NET** by *Dan Roth* * **AI Models in .NET: From Local to Cloud** by *Bruno Capuano* * **RAG with .NET and Azure SQL** by *Davide Mauri* diff --git a/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md index c92e38f764..e662dd5231 100644 --- a/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md +++ b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md @@ -44,7 +44,7 @@ public class MyHub : Hub ### Better Diagnostics and Telemetry -Microsoft focuses mainly on .NET Aspire nowadays. That’s why SignalR now integrates more deeply with the .NET Activity API, which is commonly used for distributed tracing. The enhancement is implemented for better monitoring in [.NET Aspire Dashboard](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/overview?tabs=bash#using-the-dashboard-with-net-aspire-projects). To support this feature: +Microsoft focuses mainly on Aspire nowadays. That’s why SignalR now integrates more deeply with the .NET Activity API, which is commonly used for distributed tracing. The enhancement is implemented for better monitoring in [Aspire Dashboard](https://aspire.dev/dashboard/overview/). To support this feature: 1- Add these packages to your`csproj`: @@ -76,9 +76,9 @@ builder builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter()); ``` -Finally, you’ll see the **SignalR Hub** events on the [Aspire Dashboard](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/overview): +Finally, you’ll see the **SignalR Hub** events on the [Aspire Dashboard](https://aspire.dev/dashboard/overview/): -![.NET Aspire Activity Dashboard](signalr-activity-dashboard.png) +![Aspire Activity Dashboard](signalr-activity-dashboard.png) diff --git a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md index fe7b706b5a..db3eacbd9c 100644 --- a/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md +++ b/docs/en/Community-Articles/2024-10-11-NET-Aspire-vs-ABP-Studio/POST.md @@ -1,18 +1,18 @@ -# .NET Aspire vs ABP Studio: Side by Side +# Aspire vs ABP Studio: Side by Side -In this article, I will compare [.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/) by [ABP Studio](https://abp.io/docs/latest/studio) by explaining their similarities and differences. +In this article, I will compare [Aspire](https://aspire.dev/) by [ABP Studio](https://abp.io/docs/latest/studio) by explaining their similarities and differences. ## Introduction -While .NET Aspire and ABP Studio are tools for different purpose with different scope and they have different approaches to solve the problems, many developers still may confuse since they also have some similar functionalities and solves some common problems. +While Aspire and ABP Studio are tools for different purpose with different scope and they have different approaches to solve the problems, many developers still may confuse since they also have some similar functionalities and solves some common problems. -In this article, I will clarify all, and you will have a clear understanding of what are the similarities and differences of them. Let's start by briefly define what are .NET Aspire and ABP Studio. +In this article, I will clarify all, and you will have a clear understanding of what are the similarities and differences of them. Let's start by briefly define what are Aspire and ABP Studio. -### What is .NET Aspire? +### What is Aspire? -**[.NET Aspire](https://learn.microsoft.com/en-us/dotnet/aspire/)** is a **cloud-ready framework** designed to simplify building distributed, observable, and production-ready applications. It provides a set of opinionated tools and NuGet packages tailored for cloud-native concerns like **orchestration**, **service integration** (e.g., Redis, PostgreSQL), and **telemetry**. Aspire focuses on the **local development experience**, making it easier to manage complex, multi-service apps by **abstracting away configuration details**. +**[Aspire](https://aspire.dev/)** is a **cloud-ready framework** designed to simplify building distributed, observable, and production-ready applications. It provides a set of opinionated tools and NuGet packages tailored for cloud-native concerns like **orchestration**, **service integration** (e.g., Redis, PostgreSQL), and **telemetry**. Aspire focuses on the **local development experience**, making it easier to manage complex, multi-service apps by **abstracting away configuration details**. -Here, a screenshot from [.NET Aspire dashboard](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/overview) that is used for application monitoring and inspection: +Here, a screenshot from [Aspire dashboard](https://aspire.dev/dashboard/overview/) that is used for application monitoring and inspection: ![dotnet-aspire-dashboard](dotnet-aspire-dashboard.png) @@ -26,7 +26,7 @@ Here, a screenshot from the ABP Studio [Solution Runner panel](https://abp.io/do ## A Brief Comparison -Before deep diving details, I want to show a **table of features** to compare ABP Studio and .NET Aspire side by side: +Before deep diving details, I want to show a **table of features** to compare ABP Studio and Aspire side by side: ![abp-studio-vs-net-aspire-comparison-table](abp-studio-vs-dotnet-aspire-comparison-table.png) @@ -36,30 +36,30 @@ In the next sections, I will go through each feature and explain differences and ### Integration Packages -ABP Framework has tens of integration packages to 3rd-party libraries and services. .NET Aspire also has some library integrations. But these integrations have different purposes: +ABP Framework has tens of integration packages to 3rd-party libraries and services. Aspire also has some library integrations. But these integrations have different purposes: * **ABP Framework**'s integrations (like [MongoDB](https://abp.io/docs/latest/framework/data/mongodb), [RabbitMQ](https://abp.io/docs/latest/framework/infrastructure/background-jobs/rabbitmq), [Dapr](https://abp.io/docs/latest/framework/dapr), etc) are integrations for its abstractions and aimed to be **used directly by your application code**. They are complete and sophisticated integrations with the ABP Framework and your codebase. -* **.NET Aspire**'s integrations (like [MongoDB](https://learn.microsoft.com/en-us/dotnet/aspire/database/mongodb-integration), [RabbitMQ](https://learn.microsoft.com/en-us/dotnet/aspire/messaging/rabbitmq-integration), [Dapr](https://learn.microsoft.com/en-us/dotnet/aspire/frameworks/dapr), etc), on the other hand, for simplifying configuration, service discovery, orchestration and monitoring of these tools within .NET Aspire host. Basically, these are mostly for **integrating to .NET Aspire**, not for integrating to your application. +* **Aspire**'s integrations (like [MongoDB](https://aspire.dev/integrations/databases/mongodb/), [RabbitMQ](https://aspire.dev/integrations/messaging/rabbitmq/), [Dapr](https://aspire.dev/integrations/frameworks/dapr/), etc), on the other hand, for simplifying configuration, service discovery, orchestration and monitoring of these tools within Aspire host. Basically, these are mostly for **integrating to Aspire**, not for integrating to your application. For example, ABP's [MongoDB](https://abp.io/docs/latest/framework/data/mongodb) integration allows you to use MongoDB over [repository services](https://abp.io/docs/latest/framework/architecture/domain-driven-design/repositories), automatically handles database transactions, [audit logs](https://abp.io/docs/latest/framework/infrastructure/audit-logging), [event publishing](https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed) on data saves, dynamic [connection string](https://abp.io/docs/latest/framework/fundamentals/connection-strings) management, [multi-tenancy](https://abp.io/docs/latest/framework/architecture/multi-tenancy) integration and so on. -On the other hand, .NET Aspire's [MongoDB](https://learn.microsoft.com/en-us/dotnet/aspire/database/mongodb-integration) integration basically adds [MongoDB driver library](https://www.nuget.org/packages/MongoDB.Driver/) to your .NET Aspire host application and configures it so you can discover MongoDB server on runtime, use a MongoDB Docker container and see its health status, logs and traces on .NET Aspire dashboard. +On the other hand, Aspire's [MongoDB](https://aspire.dev/integrations/databases/mongodb/) integration basically adds [MongoDB driver library](https://www.nuget.org/packages/MongoDB.Driver/) to your Aspire host application and configures it so you can discover MongoDB server on runtime, use a MongoDB Docker container and see its health status, logs and traces on Aspire dashboard. ### Starter Templates -Both of ABP Studio and .NET Aspire provide **startup solution templates for new applications**. However, there are huge differences between these startup solution templates and their purpose are completely different. +Both of ABP Studio and Aspire provide **startup solution templates for new applications**. However, there are huge differences between these startup solution templates and their purpose are completely different. * ABP Studio provides **production-ready** and [advanced solution templates](https://abp.io/docs/latest/solution-templates) for **layered**, **modular** or **microservice** solution development. They are well configured for **local development** and deploying to **Kubernetes** and other **production environments**. They provide different **UI and database options**, many optional modules and configuration. For example, you can check the [microservice solution template](https://abp.io/docs/latest/solution-templates/microservice/overview) to see how **sophisticated** it is. -* .NET Aspire's [project templates](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/setup-tooling?tabs=windows&pivots=visual-studio#net-aspire-project-templates)' main purpose is to provide a minimal application structure that is **pre-integrated to .NET Aspire** libraries and configured for **local development** environment. +* Aspire's [project templates](https://aspire.dev/get-started/aspire-sdk-templates/)' main purpose is to provide a minimal application structure that is **pre-integrated to Aspire** libraries and configured for **local development** environment. -So, when you start with .NET Aspire project template, you will need to deal with a lot of work to make your solution production and enterprise ready. On the other hand, ABP Studio's solution templates are ready to launch your system from the first day and they provide you a perfect starting point for your new business idea. +So, when you start with Aspire project template, you will need to deal with a lot of work to make your solution production and enterprise ready. On the other hand, ABP Studio's solution templates are ready to launch your system from the first day and they provide you a perfect starting point for your new business idea. ### Monitoring & Application Running -Monitoring applications and services is an important requirement for building **complex distributed systems**. Both of ABP Studio and .NET Aspire provide **excellent tools** for that purpose. +Monitoring applications and services is an important requirement for building **complex distributed systems**. Both of ABP Studio and Aspire provide **excellent tools** for that purpose. * ABP Studio's [Solution Runner panel](https://abp.io/docs/latest/studio/running-applications) provides a powerful UI to run and monitor applications and services. You can see all HTTP requests, distributed events, exceptions and detailed application logs, trace and find problems in your system. You can use its fully functional built-in browser to navigate application UIs easily. You can also create multiple profiles to group and configure the applications for different teams. -* .NET Aspire's [dashboard](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/overview) can be used to see the states of the running applications and containers, explore their console output, logs, traces and metrics to understand what is happing in your distributed system. +* Aspire's [dashboard](https://aspire.dev/dashboard/overview/) can be used to see the states of the running applications and containers, explore their console output, logs, traces and metrics to understand what is happing in your distributed system. Both tools are pretty useful for monitoring. In addition to monitoring, **ABP Studio offers an advanced UI to control the running applications**, build, start and stop individually or by a group of applications. @@ -85,7 +85,7 @@ Here a screenshot that shows how to add new microservices, API gateways or web a ![abp-studio-add-new-microservice](abp-studio-add-new-microservice.png) -.NET Aspire has no such a feature and has no such a plan to provide that kind of architectural solution building experience. +Aspire has no such a feature and has no such a plan to provide that kind of architectural solution building experience. ### Kubernetes Integration @@ -99,11 +99,11 @@ Here, a few tasks you can accomplish using ABP Studio's Kubernetes integration: * **Monitor** services and applications that are running in your Kubernetes cluster * **Intercept traffic** of a service and redirect requests to your local machine. In that way, you can develop, test and run individual services or applications in your local computer that is **fully integrated** to other services and applications running in Kubernetes. -ABP Studio's Kubernetes Integration makes microservice development so easy and comfortable. On the other hand, .NET Aspire has no such a Kubernetes integrated development experience. +ABP Studio's Kubernetes Integration makes microservice development so easy and comfortable. On the other hand, Aspire has no such a Kubernetes integrated development experience. ## The ABP Platform -Until now, I directly compared ABP Studio and .NET Aspire features. .NET Aspire is directly built on .NET and ASP.NET Core. However, ABP Studio is not a standalone tool that is built on .NET and ASP.NET Core. It is built on the [ABP Platform](https://abp.io/) (which is built on .NET and ASP.NET Core). +Until now, I directly compared ABP Studio and Aspire features. Aspire is directly built on .NET and ASP.NET Core. However, ABP Studio is not a standalone tool that is built on .NET and ASP.NET Core. It is built on the [ABP Platform](https://abp.io/) (which is built on .NET and ASP.NET Core). The following diagram shows ABP Platform components at a glance: @@ -111,26 +111,26 @@ The following diagram shows ABP Platform components at a glance: So, when you use ABP Studio, you also take full power of the [open source ABP Framework](https://github.com/abpframework/abp) and other ABP Platform features. -## ABP and .NET Aspire Integration +## ABP and Aspire Integration -I have a good news to you. It is actually possible and pretty easy to make ABP Platform and .NET Aspire working together. +I have a good news to you. It is actually possible and pretty easy to make ABP Platform and Aspire working together. -You can check [@berkansasmaz](https://abp.io/community/members/berkansasmaz)'s great article: **[How to use .NET Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk)**. +You can check [@berkansasmaz](https://abp.io/community/members/berkansasmaz)'s great article: **[How to use Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk)**. ## Licensing ABP Studio has a Community Edition which is completely free and available to everyone. It includes many of the features I mentioned here. There is also a commercial edition that is included in [commercial ABP licenses](https://abp.io/pricing). You can [check that blog post](https://abp.io/blog/announcing-abp-studio-general-availability) which clearly explains the license differences and introduces the fundamental ABP Studio features. -On the other hand, .NET Aspire is a free tool developed and published by Microsoft. It has no commercial version. +On the other hand, Aspire is a free tool developed and published by Microsoft. It has no commercial version. ## Conclusion -Both .NET Aspire and ABP Studio serve distinct purposes, catering to different types of development environments. While .NET Aspire excels in simplifying cloud-native application setups and observability, ABP Studio provides a comprehensive framework for modular monoliths and microservice architectures with full-fledged enterprise level production-ready startup solution templates and integrated tools. +Both Aspire and ABP Studio serve distinct purposes, catering to different types of development environments. While Aspire excels in simplifying cloud-native application setups and observability, ABP Studio provides a comprehensive framework for modular monoliths and microservice architectures with full-fledged enterprise level production-ready startup solution templates and integrated tools. -In the previous section, it was mentioned that it is possible to [use them together](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk). You don't have to select one of them. However, in my opinion, when you use ABP Studio, you won't need .NET Aspire since ABP Studio can do everything and much more. If you have budget, I suggest to purchase a commercial ABP Studio [license](https://abp.io/pricing) so you can fully unlock its power. +In the previous section, it was mentioned that it is possible to [use them together](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk). You don't have to select one of them. However, in my opinion, when you use ABP Studio, you won't need Aspire since ABP Studio can do everything and much more. If you have budget, I suggest to purchase a commercial ABP Studio [license](https://abp.io/pricing) so you can fully unlock its power. ## Resources / Further Reading * [ABP Studio documentation](https://abp.io/docs/latest/studio) -* [.NET Aspire documentation](https://learn.microsoft.com/en-us/dotnet/aspire/) -* [How to use .NET Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk) +* [Aspire documentation](https://aspire.dev/) +* [How to use Aspire with ABP framework](https://abp.io/community/articles/how-to-use-.net-aspire-with-abp-framework-h29km4kk) diff --git a/docs/en/Community-Articles/2024-10-23-abpio-platform-90-rc-has-been-published/post.md b/docs/en/Community-Articles/2024-10-23-abpio-platform-90-rc-has-been-published/post.md index a7dfa896bd..3cdec2269e 100644 --- a/docs/en/Community-Articles/2024-10-23-abpio-platform-90-rc-has-been-published/post.md +++ b/docs/en/Community-Articles/2024-10-23-abpio-platform-90-rc-has-been-published/post.md @@ -205,7 +205,7 @@ There are exciting articles contributed by the ABP community as always. I will h * [Mohammad AlMohammad AlMahmoud](https://abp.io/community/members/Mohammad97Dev) has created **two** new community articles: * [Implementing Multi-Language Functionality With ABP Framework](https://abp.io/community/articles/implementing-multilanguage-functionality-with-abp-framework-loq7kfx4) * [Configure Quartz.Net in Abp FrameWork](https://abp.io/community/articles/configure-quartz.net-in-abp-framework-3bveq4y1) -* [.NET Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l) by [Halil İbrahim Kalkan](https://twitter.com/hibrahimkalkan) +* [Aspire vs ABP Studio: Side by Side](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l) by [Halil İbrahim Kalkan](https://twitter.com/hibrahimkalkan) * [PoC of using GrapesJS for ABPs CMS Kit](https://abp.io/community/articles/poc-of-using-grapesjs-for-abps-cms-kit-1rmv4q41) by [Jack Fistelmann](https://abp.io/community/members/jfistelmann) * [ABP-Powered Web App with Inertia.js, React, and Vite](https://abp.io/community/articles/abppowered-web-app-with-inertia.js-react-and-vite-j7cccvad) by [Anto Subash](https://antosubash.com/) * [Multi-Tenancy Support in Angular Apps with ABP.IO](https://abp.io/community/articles/multitenancy-support-in-angular-apps-with-abp.io-lw9l36c5) by [HeadChannel Team](https://headchannel.co.uk/) diff --git a/docs/en/Community-Articles/2024-11-05-.NET Aspire 9.0 Features/Post.md b/docs/en/Community-Articles/2024-11-05-.NET Aspire 9.0 Features/Post.md index 174aca756d..91008416df 100644 --- a/docs/en/Community-Articles/2024-11-05-.NET Aspire 9.0 Features/Post.md +++ b/docs/en/Community-Articles/2024-11-05-.NET Aspire 9.0 Features/Post.md @@ -1,27 +1,27 @@ -# .NET Aspire 9.0 Features +# Aspire 9.0 Features -.NET Aspire 9.0 is the next major release, supporting both .NET 8 and .NET 9. This version includes new features and improvements. +Aspire 9.0 is the next major release, supporting both .NET 8 and .NET 9. This version includes new features and improvements. -## Upgrade to .NET Aspire +## Upgrade to Aspire -Now, you don't need workloads to develop .NET Aspire applications. In your project, you can add an SDK reference to `Aspire.AppHost.Sdk`. -For more information, you can check out [https://learn.microsoft.com/en-us/dotnet/aspire/whats-new/dotnet-aspire-9?tabs=windows#upgrade-to-net-aspire-9](https://learn.microsoft.com/en-us/dotnet/aspire/whats-new/dotnet-aspire-9?tabs=windows#upgrade-to-net-aspire-9) which explains upgrading an existing project in details. +Now, you don't need workloads to develop Aspire applications. In your project, you can add an SDK reference to `Aspire.AppHost.Sdk`. +For more information, you can check out [https://aspire.dev/whats-new/aspire-9/#upgrade-to-aspire-9](https://aspire.dev/whats-new/aspire-9/#upgrade-to-aspire-9) which explains upgrading an existing project in details. ## Dashboard -.NET Aspire offers a nice dashboard for developers to observe the performance and behavior of their applications. In this version, there are some enhancements; +Aspire offers a nice dashboard for developers to observe the performance and behavior of their applications. In this version, there are some enhancements; * **Manage resource lifecycle**: You can stop, start, and restart resources. -* **Mobile and responsive support**: The .NET Aspire dashboard is now mobile-friendly. +* **Mobile and responsive support**: The Aspire dashboard is now mobile-friendly. * **Sensitive properties**: Properties can be marked as sensitive, automatically masking them in the dashboard UI. * **Volumes**: Configured container volumes are listed in resource details. -* **Health checks**: .NET Aspire 9 adds support for health checks. +* **Health checks**: Aspire 9 adds support for health checks. ![Resource Lifecycle](./aspire_resource_lifecycle.jpg) ## Telemetry -.NET Aspire 9 comes with many new features to the Telemetry service. +Aspire 9 comes with many new features to the Telemetry service. * **Improve telemetry filtering**: Telemetry data can now be filtered by attribute values. * **Combine telemetry from multiple resources**: If a resource has multiple replicas, you can now filter telemetry data to view from all instances. @@ -32,23 +32,23 @@ For more information, you can check out [https://learn.microsoft.com/en-us/dotne ## Orchestration The .NET App Host is a core component of the .NET runtime that helps launch and execute .NET applications. -.NET Aspire 9 introduces many new features to the app host. Let's take a look; +Aspire 9 introduces many new features to the app host. Let's take a look; * **Waiting for dependencies**: You can configure a resource to wait for another resource to start before starting. * **Resource health checks**: The `Waiting for dependencies` feature uses health checks to determine if a resource is ready. ## Integrations -.NET Aspire has integrations with some services and tools that make it easy to get started. New integrations are coming with .NET Aspire 9. +Aspire has integrations with some services and tools that make it easy to get started. New integrations are coming with Aspire 9. * Redis Insight * OpenAI (Preview) * MongoDB * Azure -For Azure part, it is better to check the official documentation here [https://learn.microsoft.com/en-us/dotnet/aspire/whats-new/dotnet-aspire-9-release-candidate-1?tabs=windows&pivots=visual-studio#azure](https://learn.microsoft.com/en-us/dotnet/aspire/whats-new/dotnet-aspire-9-release-candidate-1?tabs=windows&pivots=visual-studio#azure) because it has a very detailed explanation. +For Azure part, it is better to check the official documentation here [https://aspire.dev/whats-new/aspire-9/#important-azure-improvements](https://aspire.dev/whats-new/aspire-9/#important-azure-improvements) because it has a very detailed explanation. ## ABP Studio -.NET Aspire and [ABP Studio](https://abp.io/studio) are tools for different purposes with different scopes, and they have different approaches to solving problems; many developers may still be confused since they also have some similar functionalities and solve some common problems. You can check the comparison of .NET Aspire and ABP Studio in this [article](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l). +Aspire and [ABP Studio](https://abp.io/studio) are tools for different purposes with different scopes, and they have different approaches to solving problems; many developers may still be confused since they also have some similar functionalities and solve some common problems. You can check the comparison of Aspire and ABP Studio in this [article](https://abp.io/community/articles/.net-aspire-vs-abp-studio-side-by-side-t1c73d1l). diff --git a/docs/en/Community-Articles/2025-11-30-NET-Conf-China-2025/POST.md b/docs/en/Community-Articles/2025-11-30-NET-Conf-China-2025/POST.md index 6f8dfb96a1..94602b4188 100644 --- a/docs/en/Community-Articles/2025-11-30-NET-Conf-China-2025/POST.md +++ b/docs/en/Community-Articles/2025-11-30-NET-Conf-China-2025/POST.md @@ -10,9 +10,9 @@ This year’s conference focused on three main themes: performance improvements, ### Opening Keynote -Scott Hanselman kicked off .NET Conf China 2025 with a video keynote, announcing that .NET 10 is now available on the official website. He framed the release around four pillars—AI, cloud-native, cross-platform, and performance—including integration with the Microsoft Agent Framework for building and orchestrating multi-agent systems in .NET/C#, industry-leading container and Kubernetes support with .NET Aspire simplifying local containerized development, a richer cross-platform desktop ecosystem (.NET MAUI, Avalonia, Uno Platform), and major performance gains such as Native AOT and single-file publishing for faster startup and easier distribution across platforms. +Scott Hanselman kicked off .NET Conf China 2025 with a video keynote, announcing that .NET 10 is now available on the official website. He framed the release around four pillars—AI, cloud-native, cross-platform, and performance—including integration with the Microsoft Agent Framework for building and orchestrating multi-agent systems in .NET/C#, industry-leading container and Kubernetes support with Aspire simplifying local containerized development, a richer cross-platform desktop ecosystem (.NET MAUI, Avalonia, Uno Platform), and major performance gains such as Native AOT and single-file publishing for faster startup and easier distribution across platforms. -He underscored China’s importance as .NET’s second-largest market, with roughly 13% of users, and noted that generative AI usage in China has doubled in 2025. The local community is seeing strong momentum around ML.NET, .NET Aspire, and the C# Dev Kit in VS Code. Reflecting on his Baby Smash game written 20 years ago, which now runs cross-platform on .NET 10, he called on developers to modernize: move existing Web, WinForms, and WPF apps to the cloud, improve performance, ship as a single executable, and weave in AI capabilities. +He underscored China’s importance as .NET’s second-largest market, with roughly 13% of users, and noted that generative AI usage in China has doubled in 2025. The local community is seeing strong momentum around ML.NET, Aspire, and the C# Dev Kit in VS Code. Reflecting on his Baby Smash game written 20 years ago, which now runs cross-platform on .NET 10, he called on developers to modernize: move existing Web, WinForms, and WPF apps to the cloud, improve performance, ship as a single executable, and weave in AI capabilities. On AI, he emphasized a human-centered stance: AI and agents should augment, not replace, developers. In the future, developers will orchestrate and govern agents, and human judgment will matter more than ever. He closed by thanking the open-source community for its many proposals and pull requests, stressing that .NET is an open-source platform built together by Microsoft and the community, and wishing everyone an inspiring conference and a joyful journey with .NET 10. @@ -28,7 +28,7 @@ The roundtable discussion, titled “Empowering with AI, Breaking Through Cross- The afternoon featured four breakout sessions, covering a wide range of topics with deep dives into both foundational technologies and real-world project reviews: -- **Frontend and Cross-Platform:** Focused on the progress of Avalonia, Blazor, and WebAssembly, as well as the integrated experience of .NET Aspire in multi-service applications. Speakers shared insights on reusing core logic between desktop and web, shortening cold start times with incremental compilation and resource trimming, and performance profiling and optimization in WASM scenarios. +- **Frontend and Cross-Platform:** Focused on the progress of Avalonia, Blazor, and WebAssembly, as well as the integrated experience of Aspire in multi-service applications. Speakers shared insights on reusing core logic between desktop and web, shortening cold start times with incremental compilation and resource trimming, and performance profiling and optimization in WASM scenarios. - **AI Agents and Enterprise Adoption:** Discussed multi-agent orchestration, the MCP plugin ecosystem, and enterprise data compliance. From common pitfalls of “demo-level” AI to the “five-step method” for moving from POC to production, the session covered use cases like knowledge retrieval, process automation, intelligent customer service, and developer assistants, emphasizing evaluation metrics, prompt engineering, and monitoring governance. - **.NET Practices and Engineering:** Focused on the latest capabilities and performance practices of EF Core, the boundaries of NativeAOT, automated testing strategies, and observability implementation. Discussions included database migration strategies, caching and concurrency control for hot paths, end-to-end tracing, and structured logging. - **Solutions and Case Studies:** From Clean Architecture/DDD to AI-powered business evolution, topics included application modernization, SaaS transformation, and edge-cloud collaboration in AIoT. Speakers broke down modular governance, team collaboration, and release strategies for complex systems, putting “delivering value continuously” at the center stage. diff --git a/docs/en/deployment/forwarded-headers.md b/docs/en/deployment/forwarded-headers.md index 54abd43bfc..479ab45bd8 100644 --- a/docs/en/deployment/forwarded-headers.md +++ b/docs/en/deployment/forwarded-headers.md @@ -56,10 +56,14 @@ public override void ConfigureServices(ServiceConfigurationContext context) context.Services.Configure(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + options.KnownNetworks.Clear(); + options.KnownProxies.Clear(); }); } ``` +> `ForwardedHeadersOptions` trusts only loopback addresses out of the box: `KnownNetworks` contains `127.0.0.0/8` and `KnownProxies` contains the IPv6 loopback. When the reverse proxy connects from any other address, the middleware ignores the forwarded headers without raising an error and `HttpContext.Connection.RemoteIpAddress` keeps returning the address of the proxy. Clearing both lists as above is the usual choice for container and PaaS deployments, where the proxy address is assigned dynamically and the application is only reachable through that proxy. If the proxy has a stable address, add it to `KnownProxies` (or its network to `KnownNetworks`) instead of clearing the lists. Once both lists are empty the middleware stops checking who it received the request from, so it accepts `X-Forwarded-For` from anything that can reach the application. Only clear them when the application is not reachable except through the proxy, otherwise a caller that bypasses the proxy can spoof its client IP address. + 2. In the `OnApplicationInitialization` method of your module, add the middleware: > Forwarded Headers Middleware should run before other middleware. This ordering ensures that the middleware relying on forwarded headers information can consume the header values for processing. Forwarded Headers Middleware can run after diagnostics and error handling, but it must be run before calling UseHsts: diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 567ea6f387..0d1ab82103 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -2153,6 +2153,18 @@ "text": "Low-Code Designer", "path": "low-code/designer.md" }, + { + "text": "Data Modeling and Page Behavior", + "path": "low-code/data-modeling.md" + }, + { + "text": "Data Import", + "path": "low-code/data-import.md" + }, + { + "text": "Model History and Recovery", + "path": "low-code/model-history.md" + }, { "text": "Calculated and Rollup Properties", "path": "low-code/formula-properties.md" @@ -2577,7 +2589,7 @@ "path": "solution-templates/microservice/helm-charts-and-kubernetes.md" }, { - "text": ".NET Aspire Integration", + "text": "Aspire Integration", "path": "solution-templates/microservice/aspire-integration.md" }, { diff --git a/docs/en/framework/fundamentals/fluent-validation.md b/docs/en/framework/fundamentals/fluent-validation.md index 8270e65b72..7a73396ab8 100644 --- a/docs/en/framework/fundamentals/fluent-validation.md +++ b/docs/en/framework/fundamentals/fluent-validation.md @@ -60,6 +60,74 @@ public class CreateUpdateBookDtoValidator : AbstractValidator A `Range` attribute that writes its limits as strings, like `[Range(typeof(decimal), "1.5", "9.5")]`, reads them in the culture of the request unless it sets `ParseLimitsInInvariantCulture`. Set it, so that the limit means the same thing to the server and to the api definition on every request. + +When a rule and an attribute constrain the same property, the stricter bound is used: the higher minimum and the lower maximum. When both bounds have the same value, the exclusive one is used. The exclusivity always comes from the bound that is used, so `[Range(0, 100)]` with `GreaterThan(-5)` results in an inclusive `Minimum = 0`. A non-numeric bound, like a `Range` attribute on a `DateTime` property, is kept as-is. An existing `Regex` is also kept, because a single value can not express two patterns that both have to match. + +### Rules That Are Not Mapped + +The following rules are not mapped, because they don't apply to every instance of the DTO: + +* Rules under `When(...)` / `Unless(...)` (both the chained and the block form) and their async variants, because the same property can be required for one instance and optional for another. +* Rules that only belong to a non-default rule set, because ABP validates with FluentValidation's default selector, which does not run them. +* `RuleForEach(...)` rules, because they constrain the items of a collection rather than the collection property. +* Comparisons on a property that is not a number, and comparisons against another property. `Minimum` and `Maximum` are numeric bounds, so the ordinal comparison of two strings can not be published there. + +### Rules That Are Not Fully Expressed + +The following rules are not fully expressed in the API definition: + +* A zero length bound, from `MaximumLength(0)` or `Length(0, 0)`, is not published. Every length rule has a `Func` form that reports the same zero on the descriptor, so the two can not be told apart. +* Rules that come from an `Include(...)` call are not published, because FluentValidation does not expose the included validator on its descriptor. +* A validator of a derived DTO can not add rules to a property declared by its base class, because each type describes only its own properties. +* A rule on a nested object, like `RuleFor(x => x.Address.City)`, is not published either. The nested type is described on its own, with its own validator, and its model is shared by every DTO that uses it. +* A validator of a closed generic DTO is not used, because the API definition describes the generic type definition, which is shared by all of its instantiations. +* `InclusiveBetween(...)` and `ExclusiveBetween(...)` with their own `IComparer` are only published when their bounds still read as an interval in the natural order. FluentValidation does not expose the comparer, so a rule that orders its values differently can not be recognised. +* `Matches(pattern, RegexOptions)` publishes the pattern without the options. This is the one case where a client can be stricter than the server, so avoid the overload if the client should not reject what the server accepts. + +> The API definition describes a type, while the server runs the validation per action. So, a DTO that is only used as a return value, or that is sent to an action which doesn't validate its parameters, still declares its constraints here. This is also how the data annotation attributes have always been reported. + ## See Also * [Validation System](./validation.md) \ No newline at end of file diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md index ec2d4eb513..41d61647f2 100644 --- a/docs/en/get-started/microservice.md +++ b/docs/en/get-started/microservice.md @@ -110,11 +110,11 @@ In this step, you can choose which languages your application will support. * Click Add Custom Language if you want to add a language that is not listed. -Click the Next button to see *.NET Aspire* configuration selection: +Click the Next button to see *Aspire* configuration selection: ![abp-studio-new-solution-dialog-aspire-configuration](images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png) -In this step, you can enable or disable the .NET Aspire integration for your solution. If you enable it, the solution will be pre-configured to work with .NET Aspire for easier microservice development and deployment. See the [Aspire Integration](../solution-templates/microservice/aspire-integration.md) document for more information about this feature. +In this step, you can enable or disable the Aspire integration for your solution. If you enable it, the solution will be pre-configured to work with Aspire for easier microservice development and deployment. See the [Aspire Integration](../solution-templates/microservice/aspire-integration.md) document for more information about this feature. Click the Next button to see *Additional Options* selection: diff --git a/docs/en/low-code/custom-endpoints.md b/docs/en/low-code/custom-endpoints.md index c75f92461f..c3fe842f10 100644 --- a/docs/en/low-code/custom-endpoints.md +++ b/docs/en/low-code/custom-endpoints.md @@ -41,9 +41,16 @@ Custom endpoints are defined in JSON descriptor files or through the Low-Code De | `javascript` | string | Required | JavaScript handler code | | `description` | string | null | Optional designer/documentation text | | `requireAuthentication` | bool | `true` | Whether the caller must be authenticated | +| `useResourceAuthorization` | bool | `false` | Whether execution is granted per endpoint name through ABP resource permissions | | `requiredPermissions` | string[] | null | Permission names required to call the endpoint | -Permission checks require an authorized user even when `requireAuthentication` is set to `false`. Keep endpoints authenticated by default and use `requireAuthentication: false` only for intentionally public APIs without `requiredPermissions`. +Authorization is resolved in this order: + +1. When `requiredPermissions` contains values, every named permission is required. +2. Otherwise, `useResourceAuthorization: true` requires the endpoint execute resource permission scoped to the endpoint name, with the global Low-Code endpoint permission as fallback. +3. Otherwise, `requireAuthentication` selects authenticated or public access. + +Permission checks require an authorized user even when `requireAuthentication` is set to `false`. Keep endpoints authenticated by default and use `requireAuthentication: false` only for intentionally public APIs without named or resource authorization. ## Route and Request Data @@ -223,7 +230,7 @@ Default blocked headers also include hop-by-hop headers such as `Connection`, `T ## Security Notes * Prefer authenticated endpoints with explicit `requiredPermissions`. -* Treat endpoints with `requireAuthentication: false` and no `requiredPermissions` as public API surface. +* Treat endpoints with `requireAuthentication: false`, no `requiredPermissions`, and `useResourceAuthorization: false` as public API surface. * Keep endpoint scripts small and focused. * Validate route, query, and body input before using it. * Use `take()` for list queries. diff --git a/docs/en/low-code/data-import.md b/docs/en/low-code/data-import.md new file mode 100644 index 0000000000..de4120749a --- /dev/null +++ b/docs/en/low-code/data-import.md @@ -0,0 +1,116 @@ +```json +//[doc-seo] +{ + "Description": "Import Excel or CSV data into ABP Low-Code pages with guided mapping, append or merge behavior, foreign-key matching, remote files, and invalid-row downloads." +} +``` + +# Data Import + +The React Low-Code runtime can import Excel and CSV files into a dynamic page. The import wizard previews the file in the browser, maps source columns to entity properties, reviews the operation, and sends the file plus the confirmed mapping to the backend. + +Import is enabled by default for pages and can be disabled per page with `importEnabled: false`. + +## Import Workflow + +1. Open a dynamic data page and select **Import**. +2. Upload an Excel or CSV file, or download a sample file for the page. +3. Review the detected columns and map each source column to one target property. +4. Choose **Append** or **Merge**. +5. Review required fields, conversions, relation matching, and file/image sources. +6. Run the import and download the invalid-row file if any rows fail. + +Column names are matched automatically when a source header equals a property name or display label after normalizing spaces, underscores, hyphens, dots, and letter casing. Review every automatic mapping before import. + +The wizard reports mappings as compatible, convertible, warning, or incompatible. The backend remains authoritative and validates each converted value, entity rule, and mapped property. + +## Append and Merge + +**Append** creates a new record for every valid row. The `Id` column is not accepted in append mode. + +**Merge** uses one mapped property as the match key: + +* A matching record is updated. +* A non-matching row creates a record. +* The match property must be included in the column mapping. +* When the selected property can match multiple records, choose either **Error** or **Use first**. **Use first** also requires a deterministic sort property and direction. + +Use an ID or unique business key whenever possible. A non-unique merge key makes the result depend on the selected multiple-match rule. + +## Foreign-Key Mapping + +A foreign-key column can contain the related record ID or another allowed match property such as a unique username or code. The wizard exposes the supported related-entity match fields for that property. + +If a foreign-key lookup can return multiple records, the same rules apply: + +* **Error** rejects the row. +* **Use first** requires an explicit sort property and direction. + +This decision is per mapped foreign-key column, independent of the main append or merge mode. + +## Value Extraction + +Use a source-value regular expression when a cell contains extra text around the value that should be imported. The expression must contain a named `value` capture group: + +```text +Order: (?[A-Z]+-\d+) +``` + +The server compiles and executes the expression with bounded input, evaluation count, and elapsed-time budgets. A structurally valid client preview does not replace server validation. + +## File and Image URLs + +File and image properties can import remote files referenced by spreadsheet text. Source modes are: + +| Mode | Use it when | +|------|-------------| +| `auto` | The runtime should detect a supported URL shape | +| `fullUrl` | The whole cell is the URL | +| `fileNameAndUrl` | The cell contains a file name and URL | +| `extractUrlFromText` | The URL is embedded in surrounding text | +| `customRegex` | A custom expression extracts a named `url` group | + +Remote downloads are performed by the backend, not by the browser. The verified defaults require HTTPS on port `443`, allow only public network destinations, follow at most three redirects, and reject private, link-local, multicast, and loopback destinations. Development loopback HTTP is available only when both the environment is Development and `AllowLoopbackHttpInDevelopment` is enabled. + +Restrict production destinations with `LowCode:Import:RemoteFiles:AllowedHosts` when imports should fetch only from known hosts. Download count, per-file bytes, aggregate bytes, concurrency, redirects, and timeout are all bounded by `LowCode:Import:RemoteFiles` options. + +Remote files are staged before row persistence. A failed row or failed merge does not replace an existing stored file with an incomplete download. + +## Partial Failures + +Import continues after row-scoped validation or conversion failures. The result reports: + +* Total rows +* Succeeded and failed rows +* Created and updated records +* A short-lived invalid-row download token when failures exist + +The invalid-row file contains the original row values plus failure details so the rows can be corrected and imported again. The verified default token lifetime is 600 seconds. + +Failures that make the whole request unsafe, such as an invalid archive, exceeded global file budget, or blocked remote destination, stop the import before normal row processing. + +## Limits and Configuration + +Important verified defaults are: + +| Setting | Default | +|---------|---------| +| `LowCode:Import:MaxRows` | `10000` | +| `LowCode:Import:MaxColumns` | `256` | +| `LowCode:Import:InvalidRowsTokenLifetimeSeconds` | `600` | +| `LowCode:Import:RemoteFiles:Enabled` | `true` | +| `LowCode:Import:RemoteFiles:RequestTimeoutSeconds` | `15` | +| `LowCode:Import:RemoteFiles:MaxConcurrentDownloads` | `4` | +| `LowCode:Import:RemoteFiles:MaxFilesPerImport` | `500` | +| `LowCode:Import:RemoteFiles:MaxFileBytes` | `10485760` | +| `LowCode:Import:RemoteFiles:MaxTotalBytesPerImport` | `104857600` | +| `LowCode:Import:RemoteFiles:AllowedPorts` | `[443]` | + +The options validators reject non-positive, inconsistent, or above-ceiling values. Keep imports page-scoped and use the existing limits instead of accepting arbitrary workbook sizes. + +## See Also + +* [React Runtime](react-runtime.md) +* [Data Modeling and Page Behavior](data-modeling.md) +* [Model Descriptor Files](model-json.md) +* [Foreign Access](foreign-access.md) diff --git a/docs/en/low-code/data-modeling.md b/docs/en/low-code/data-modeling.md new file mode 100644 index 0000000000..8c3de52d6e --- /dev/null +++ b/docs/en/low-code/data-modeling.md @@ -0,0 +1,247 @@ +```json +//[doc-seo] +{ + "Description": "Model Low-Code property storage, primitive collections, related fields, presentations, backend filters, and page or relationship permissions." +} +``` + +# Data Modeling and Page Behavior + +The Low-Code Designer can model more than scalar fields and basic CRUD pages. This page covers the data and page features that affect storage, queries, presentation, and authorization. + +## Property Storage + +Scalar properties use one of two storage shapes: + +* `isMappedToDbField: true` maps the property to its own physical column. +* An omitted or `false` `isMappedToDbField` stores the property through the entity's dynamic data mapping. + +By default, dynamic data mapping uses the entity's JSON `Data` column. Applications that need individual columns for those properties can disable JSON data storage while configuring EF Core: + +```csharp +builder.ConfigureDynamicEntities(useJsonDataStorage: false); +``` + +The equivalent module option is `AbpLowCodeEntityFrameworkCoreOptions.UseJsonDataStorage`. Its verified default is `true`. + +Changing the storage mode or `isMappedToDbField` affects the physical schema. Decide the storage strategy before creating production tables, then use the normal migration or runtime schema workflow for later changes. Formulas and rollups are virtual and do not create physical scalar columns. + +Source-model and runtime-model dynamic tables can use separate prefixes: + +```csharp +LowCodeDbProperties.JsonModelTablePrefix = "Src_"; +LowCodeDbProperties.RuntimeTablePrefix = "Runtime_"; +``` + +Configure prefixes before the dynamic model is initialized. Changing a prefix after tables exist requires renaming or migrating those tables. + +## Primitive Collections + +A primitive collection keeps an ordered list of values on one property. Supported element types are `string`, `int`, `long`, `decimal`, `dateTime`, `boolean`, `guid`, `enum`, `date`, `time`, `money`, `file`, and `image`. + +```json +{ + "name": "Tags", + "type": "string", + "collection": { + "maxCount": 25, + "uniqueItems": true + } +} +``` + +Collection rules: + +* `maxCount` is optional, but must be greater than zero when supplied. +* `uniqueItems` is required and controls duplicate-value validation. +* The effective item limit is the lower of `maxCount` and `LowCode:PrimitiveCollections:MaximumItemsPerProperty`. The verified global default is `1000`. +* Collection table names are derived from the entity and property names. Developer JSON, Designer, MCP, and code-layer definitions do not require an internal collection identifier. +* A collection property cannot also be a foreign key, formula, or rollup. + +Collections are stored in normalized rows rather than inside the owner JSON payload. The React runtime returns them as ordered arrays and uses collection-aware controls for scalar, enum, file, and image values. + +## Related Fields and Self-Relations + +Page columns and filters can follow foreign keys by using dot-separated property paths: + +```json +{ + "columns": [ + { "propertyName": "CustomerId.Name", "label": "Customer" }, + { "propertyName": "CustomerId.CountryId.Name", "label": "Country" } + ], + "filters": [ + { "propertyName": "CustomerId.CountryId.RegionId.Name" } + ] +} +``` + +Only requested related fields are projected into the response. The same paths can be used by page filtering and export, including registered reference entities. + +Self-relations are supported. For example, an employee page can use `ManagerId.ManagerId.Name` to follow the same relation more than once. Every path is still limited by the configured maximum foreign-key depth exposed by the Low-Code query capabilities. + +## Reverse Relationships + +A foreign key defines the schema direction. A page relationship defines how records that point back to the host record are shown and edited: + +```json +{ + "name": "Authors", + "entityName": "Acme.Authors.Author", + "relationships": [ + { + "id": "author-books", + "sourceEntityName": "Acme.Books.Book", + "sourcePropertyName": "AuthorId", + "access": "edit", + "relatedPageMode": "page", + "relatedPageName": "Books", + "createFormMode": "generated", + "editFormMode": "form", + "editFormName": "BookEditForAuthor" + } + ] +} +``` + +`access` can be `none`, `view`, or `edit`. The generated modes build the related page or form from the source entity; the explicit modes reuse named page and form descriptors. + +See [Foreign Access](foreign-access.md) for the runtime APIs and UI behavior used by these relationships. + +## Enum and Boolean Presentation + +Enum values can define reusable display metadata: + +```json +{ + "name": "Acme.Orders.OrderStatus", + "values": [ + { + "name": "Pending", + "value": 10, + "displayName": "Waiting", + "presentation": "badge", + "color": "#F59E0B" + } + ] +} +``` + +Enum presentation supports `text`, `badge`, and `iconOnly`. Pages can override the display name, presentation, color, or icon for one property without changing the shared enum: + +```json +{ + "enumPresentations": [ + { + "propertyName": "Status", + "values": [ + { "value": 10, "displayName": "Awaiting review", "presentation": "badge", "color": "#F59E0B" } + ] + } + ] +} +``` + +Boolean columns support `text`, `checkbox`, `badge`, and `iconOnly`, with separate metadata for `true`, `false`, and `null`: + +```json +{ + "propertyName": "IsActive", + "booleanPresentation": "badge", + "booleanValues": { + "true": { "displayName": "Active", "color": "#16A34A" }, + "false": { "displayName": "Inactive", "color": "#DC2626" }, + "null": { "displayName": "Not set", "color": "#6B7280" } + } +} +``` + +Icons can reference a CSS class, stored blob, data URL, or application path. Runtime-layer writes apply stricter icon validation than source-controlled descriptors. + +## Backend Filters + +Visible page filters are controlled by the user. A backend filter is always applied by the server and is useful for tenant, ownership, role, or workflow scoping. + +```json +{ + "backendFilter": { + "items": [ + { + "propertyName": "Status", + "operator": "equal", + "value": "Active" + }, + { + "logic": "or", + "items": [ + { + "propertyName": "CreatorId", + "operator": "equal", + "valueProvider": "CurrentUserId" + }, + { + "logic": "and", + "propertyName": "AllowedRole", + "operator": "in", + "valueProvider": "CurrentUserRoles" + } + ] + } + ] + } +} +``` + +A filter value can be: + +* Static through `value`. +* Resolved by JavaScript through `javaScript`. +* Resolved by a registered provider through `valueProvider`. + +Built-in providers cover the current user ID, username, first name, surname, email, email verification, phone number, phone verification, roles, and current tenant ID. Applications can register additional typed providers with `AbpLowCodePageBackendFilterOptions`. + +Backend filters are combined with search and user-selected filters. They are not sent as editable client state, so do not replace them with a hidden React filter when the rule is security-sensitive. + +## Page and Relationship Permissions + +Pages use resource-based authorization by default. `permissionConfig` can keep that generated default, require a named permission, allow any authenticated user, or make an operation public: + +```json +{ + "permissionConfig": { + "view": "default", + "create": "Acme.Orders.Create", + "update": "authenticated", + "delete": "Acme.Orders.Delete" + } +} +``` + +For generated reverse relationships, enable separate authorization when child access must not inherit the host page decision: + +```json +{ + "id": "author-books", + "sourceEntityName": "Acme.Books.Book", + "sourcePropertyName": "AuthorId", + "access": "edit", + "useSeparatePermission": true, + "permissionConfig": { + "view": "default", + "create": "Acme.Books.Create", + "update": "Acme.Books.Update", + "delete": "Acme.Books.Delete" + } +} +``` + +When `useSeparatePermission` is `true`, generated relationship permissions are scoped to the host page and relationship ID. Create, update, and delete also require relationship view access. + +## See Also + +* [Low-Code Designer](designer.md) +* [Model Descriptor Files](model-json.md) +* [Calculated and Rollup Properties](formula-properties.md) +* [Data Import](data-import.md) +* [Foreign Access](foreign-access.md) +* [React Runtime](react-runtime.md) diff --git a/docs/en/low-code/designer.md b/docs/en/low-code/designer.md index ad3e9f5aaf..c1ea0fa6cb 100644 --- a/docs/en/low-code/designer.md +++ b/docs/en/low-code/designer.md @@ -40,9 +40,9 @@ The selected layer controls whether the designer can save changes. Read-only lay Use **Data** to define the domain model. -Entities contain properties, display names, display property configuration, inherited audit fields, relations, and optional interceptors. Enums are created once and then used by enum properties. +Entities contain properties, display names, display property configuration, inherited audit fields, relations, primitive collections, and optional interceptors. Enums are created once and then used by enum properties. Enum and boolean values can also carry text, badge, color, and icon presentation metadata. -For virtual fields derived from the current record or related records, see [Calculated and Rollup Properties](formula-properties.md). For the supported scalar formula syntax, see the [Low-Code Expression Language](expression-language.md) reference. +For storage choices, primitive collections, related-field paths, presentations, and backend filters, see [Data Modeling and Page Behavior](data-modeling.md). For virtual fields derived from the current record or related records, see [Calculated and Rollup Properties](formula-properties.md). For the supported scalar formula syntax, see the [Low-Code Expression Language](expression-language.md) reference. ![Entity summary in the designer](images/designer-entity.png) @@ -50,7 +50,7 @@ For virtual fields derived from the current record or related records, see [Calc ### Relations -Relations are driven by foreign key properties. The designer shows direct N to 1 relations and many-to-many relations that are modeled through junction entities. +Relations are driven by foreign key properties. The designer shows direct N to 1 relations, self-relations, and many-to-many relations that are modeled through junction entities. Page columns, filters, and exports can select related fields through foreign-key paths, and reverse page relationships can use generated or named pages/forms with view or edit access. ![Relation overview](images/designer-relations.png) @@ -73,6 +73,8 @@ Pages can define data grid, kanban, calendar, gallery, standalone form, and dash * Field labels and column widths * Default sorting * Filter fields and defaults +* Always-on backend filters with static, JavaScript, or registered-provider values +* Guided Excel and CSV import, including append or merge behavior * File/image export defaults when the page has exportable file fields * Whether file bundle ZIP export is allowed @@ -86,6 +88,8 @@ The **View Fields** section controls what users see in the runtime view. The sep Open **Export Fields > More settings** only when you need custom export details. If **Use default export settings** is enabled, export uses display labels, the view field order, file name output, and file bundle export enabled. Turn it off to customize export labels, assign a separate export order, choose **Default File/Image Output**, or disable **Allow file bundle export**. File/image output controls appear only when the page has file or image fields, and they stay inactive until at least one file/image field is exportable. +Use [Data Import](data-import.md) for the runtime import wizard, column mapping, merge keys, foreign-key matching, remote file/image sources, and invalid-row downloads. + ## Forms Use **Forms** to define create and edit experiences. @@ -147,12 +151,16 @@ Filters are configured per page and rendered by the React runtime. The runtime u The URL query parameter keeps the existing `lcFilters` format, so bookmarked filtered pages continue to work. +Backend filters are different from the visible filters above: the server always combines them with the user's query. Use them for ownership, tenant, role, and workflow scopes that must not be removable from the client. See [Data Modeling and Page Behavior](data-modeling.md#backend-filters). + ## Permissions -Dynamic permissions are generated for entities and pages. Use the **Permissions** section to review names and grant access through the normal ABP permission management UI. +Dynamic permissions are generated for entities, pages, custom endpoints, and optionally individual page relationships. Use the **Permissions** section to review names and grant access through the normal ABP permission management UI. Generated pages and menus are permission-aware. If a user cannot access a page, the runtime does not show the menu item and API calls remain protected by backend authorization. +Pages use resource permissions by default and can override each operation with `default`, `public`, `authenticated`, or a named permission. Generated reverse relationships can enable separate view/create/update/delete authorization. See [Data Modeling and Page Behavior](data-modeling.md#page-and-relationship-permissions). + ## Actions and Scripts Use **Actions** only when descriptor metadata and standard CRUD behavior are not enough. The scripting surface can define custom HTTP endpoints, distributed event handlers, background jobs, and scheduled background workers. Scripts run server-side and use the [Scripting API](scripting-api.md). @@ -165,9 +173,15 @@ Endpoint and event handler editors include **Test JavaScript**. Dry-run executio Use **Health** before shipping changes. It helps catch missing display properties, invalid relation targets, form/page references, script problems, and other model issues that would otherwise surface at runtime. See [Health](health.md) for the selected-layer snapshot scope and the typical problem classes it helps you review. +## History and Recovery + +When **Runtime JSON** is selected, the Designer exposes runtime model undo, redo, history details, comparisons, and save points. History actions are previewed against a concurrency stamp and require explicit confirmation before destructive physical schema changes. + +Entity deletion also uses a reviewed plan. You must resolve dependent relationships and choose whether Designer-managed physical data is kept or deleted. An entity deleted with retained physical data can be restored only from a fresh schema and concurrency preview. See [Model History and Recovery](model-history.md). + ## MCP Integration -The Designer and the low-code MCP surface overlap when the selected layer is **Runtime JSON**, but they are not the same editing surface. The Designer can inspect source-controlled and runtime layers, while [MCP Integration](mcp.md) is a remote HTTP MCP endpoint that is intentionally runtime-only and targets the database-backed model. Use the Designer when you want interactive editing and visual feedback. Use MCP when an authenticated agent or script needs repeatable runtime automation. +The Designer and the low-code MCP surface overlap when the selected layer is **Runtime JSON**, but they are not the same editing surface. The Designer can inspect source-controlled and runtime layers, while [MCP Integration](mcp.md) is a remote HTTP MCP endpoint that is intentionally runtime-only and targets the database-backed model. MCP exposes the same model-management semantics documented in the general Low-Code feature pages; it is not a separate feature model. Use the Designer when you want interactive editing and visual feedback. Use MCP when an authenticated agent or script needs repeatable runtime automation. After MCP-driven changes, reopen the relevant Designer section or review [Health](health.md) before reporting the model as ready. diff --git a/docs/en/low-code/foreign-access.md b/docs/en/low-code/foreign-access.md index 4c6f87e956..44b04e9584 100644 --- a/docs/en/low-code/foreign-access.md +++ b/docs/en/low-code/foreign-access.md @@ -13,6 +13,8 @@ Use the [Low-Code Designer](designer.md) to review relation metadata visually. T Foreign Access controls how related **dynamic entities** can be accessed through foreign key relationships. It determines whether users can view or manage related data directly from the **target entity's** UI. +The foreign key defines the schema relation and default reverse-access level. A page can additionally define a page-specific relationship that selects generated or named related pages/forms and separate authorization. See [Data Modeling and Page Behavior](data-modeling.md#reverse-relationships). + > **Important:** Foreign Access only works between **dynamic entities**. It does not apply to [reference entities](reference-entities.md) because they are read-only and don't have UI pages. ## Access Levels @@ -126,10 +128,14 @@ An **action menu item** appears on the target entity's data grid row (e.g., an " No action menu item is added. The foreign key exists only for data integrity and lookup display. +Self-relations are supported. For example, an `Employee.ManagerId` foreign key can expose direct reports on the employee page, while page columns and filters can follow paths such as `ManagerId.ManagerId.Name` within the configured query-depth limit. + ## Permission Control Foreign access actions respect the **entity permissions** of the source entity (the entity with the foreign key). For example, if a user does not have the `Delete` permission for `Order`, the delete button will not appear in the foreign access modal, even if the access level is `Edit`. +A generated page relationship can set `useSeparatePermission: true`. In that mode, view/create/update/delete access is resolved for the host page and relationship ID instead of relying only on the source entity permission. Relationship create, update, and delete also require relationship view access. + ## How It Works The `ForeignAccessRelation` class stores the relationship metadata: @@ -146,5 +152,6 @@ The `DynamicEntityAppService` checks these relations when building entity action ## See Also * [Model Descriptor Files](model-json.md) +* [Data Modeling and Page Behavior](data-modeling.md) * [Reference Entities](reference-entities.md) * [Attributes & Fluent API](fluent-api.md) diff --git a/docs/en/low-code/health.md b/docs/en/low-code/health.md index dd209d3b7a..03a57de3c7 100644 --- a/docs/en/low-code/health.md +++ b/docs/en/low-code/health.md @@ -41,20 +41,26 @@ Typical problem classes include: * Form layout issues where fields exist but valid placements do not * Permission and page configuration mismatches that would affect runtime visibility or access * Script assets that exist in the model but still need review in the broader context of entities, pages, and permissions +* Orphaned upper-layer descriptors whose lower-layer base was removed or disabled Some of these issues are also enforced by runtime validation and mutation rules. Health gives you a selected-layer review point before users discover the problem in the runtime UI. +When orphan warnings are present, preview the matching inactive-override or disabled-override cleanup before applying it. Cleanup removes only the affected authored deltas from the selected writable layer; review the preview because enabled sibling deltas on the same descriptor are preserved. + ## Use It When Use Health in these moments: * After changing entities, pages, forms, page groups, or permissions in the Designer * After applying MCP-driven runtime mutations +* After undo, redo, save-point restore, retained-entity restore, or override cleanup * Before publishing a set of runtime changes * After copying or importing source-controlled descriptors into an application If you automate low-code changes through [MCP Integration](mcp.md), re-read the health snapshot after apply and treat that review as part of the success criteria. +For runtime history, safe entity deletion, and retained-data restoration, see [Model History and Recovery](model-history.md). + ## Health and Source-Controlled Models Health is not a replacement for source-controlled file validation. @@ -78,6 +84,7 @@ A useful example is form layout drift: a descriptor can still pass `--check-lowc * [Low-Code Designer](designer.md) * [MCP Integration](mcp.md) +* [Model History and Recovery](model-history.md) * [Model Descriptor Files](model-json.md) * [Dashboards](dashboards.md) * [Page Groups](page-groups.md) diff --git a/docs/en/low-code/index.md b/docs/en/low-code/index.md index 11bda617d9..c84d696679 100644 --- a/docs/en/low-code/index.md +++ b/docs/en/low-code/index.md @@ -22,6 +22,7 @@ Use the designer to model entities, enums, properties, relations, pages, forms, * React data grid, kanban, calendar, gallery, form, and dashboard pages * Create and edit forms * Advanced filters +* Guided Excel and CSV import with append or merge behavior * Excel, CSV, and file bundle export No DTO, repository, application service, controller, or React CRUD page is required for the standard flow. @@ -98,13 +99,15 @@ The generated startup project accepts `--model-directory