|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 261 KiB |
@ -0,0 +1,77 @@ |
|||
# ABP.IO Platform 8.3 Final Has Been Released! |
|||
|
|||
 |
|||
|
|||
[ABP](https://abp.io/) 8.3 stable version has been released today. |
|||
|
|||
## What's New With Version 8.3? |
|||
|
|||
All the new features were explained in detail in the [8.3 RC Announcement Post](https://blog.abp.io/abp/announcing-abp-8-3-release-candidate), so there is no need to review them again. You can check it out for more details. |
|||
|
|||
## Getting Started with 8.3 |
|||
|
|||
### Creating New Solutions |
|||
|
|||
You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli) to create new solutions. |
|||
|
|||
By default, ABP Studio uses stable versions to create solutions. Therefore, it will be creating the solution with the latest stable version, which is v8.3 for now, so you don't need to specify the version. |
|||
|
|||
### How to Upgrade an Existing Solution |
|||
|
|||
You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained: |
|||
|
|||
### Upgrading via ABP Studio |
|||
|
|||
If you are already using the ABP Studio, you can upgrade it to the latest version to align it with ABP v8.3. ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info. |
|||
|
|||
After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Switch to stable** action button to instantly upgrade your solution: |
|||
|
|||
 |
|||
|
|||
### Upgrading via ABP CLI |
|||
|
|||
Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version. |
|||
|
|||
If you haven't installed it yet, you can run the following command: |
|||
|
|||
```bash |
|||
dotnet tool install -g Volo.Abp.Studio.Cli |
|||
``` |
|||
|
|||
Or to update the existing CLI, you can run the following command: |
|||
|
|||
```bash |
|||
dotnet tool update -g Volo.Abp.Studio.Cli |
|||
``` |
|||
|
|||
After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows: |
|||
|
|||
```bash |
|||
abp update |
|||
``` |
|||
|
|||
> You can run this command in the root folder of your solution. |
|||
|
|||
## Migration Guides |
|||
|
|||
There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v8.2 or earlier: [ABP Version 8.3 Migration Guide](https://abp.io/docs/8.3/release-info/migration-guides/abp-8-3) |
|||
|
|||
## Community News |
|||
|
|||
### New ABP Community Posts |
|||
|
|||
As always, exciting articles have been contributed by the ABP community. I will highlight some of them here: |
|||
|
|||
* [Alper Ebicoglu](https://twitter.com/alperebicoglu) has created **three** new community articles: |
|||
* [Do You Really Need Multi-tenancy?](https://abp.io/community/articles/do-you-really-need-multitenancy-hpwn44r3) |
|||
* [What is Angular Schematics?](https://abp.io/community/articles/what-is-angular-schematics-2z4jusf5) |
|||
* [Understanding Angular AOT vs JIT Compilations](https://abp.io/community/articles/understanding-angular-aot-vs-jit-compilations-0r0a0a3f) |
|||
* [Dynamic Widget Communication](https://abp.io/community/articles/dynamic-widget-communication-uvun7q23) by [Suhaib Mousa](https://suhaibmousa.com/) |
|||
* [Introducing the Google Cloud Storage BLOB Provider](https://abp.io/community/articles/introducing-the-google-cloud-storage-blob-provider-yrt6azc0) by [Engincan Veske](https://twitter.com/EngincanVeske) |
|||
* [Switching Between Organization Units](https://abp.io/community/articles/switching-between-organization-units-i5tokpzt) by [Liming Ma](https://github.com/maliming) |
|||
|
|||
Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/submit) to the ABP Community. |
|||
|
|||
## About the Next Version |
|||
|
|||
The next feature version will be 9.0. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version. |
|||
|
After Width: | Height: | Size: 6.9 MiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 4.9 MiB |
|
After Width: | Height: | Size: 4.4 MiB |
|
After Width: | Height: | Size: 422 KiB |
|
After Width: | Height: | Size: 3.4 MiB |
|
After Width: | Height: | Size: 171 KiB |
|
After Width: | Height: | Size: 274 KiB |
|
After Width: | Height: | Size: 3.4 MiB |
|
After Width: | Height: | Size: 58 KiB |
@ -0,0 +1,87 @@ |
|||
# DotNext 2024 Conference: A Speaker’s Impressions |
|||
|
|||
 |
|||
|
|||
Last week, I had the chance of being a speaker at **DotNext 2024** in Moscow. [JUG Ru Group](https://jugru.org/en/) is arranging the DotNext Conferences since [2014](https://dotnext.ru/archive/). It's a specific conference for .NET developers held at the [MonArch Moscow Hotel](https://www.moscowmonarch.com/) on 10, 11 September 2024. This event brought together over **600 developers on-site, 200 developers online**, with around **35 speakers** delivering more than **30 talks**, making it one of the largest gatherings of the .NET community in Russia. |
|||
|
|||
 |
|||
|
|||
--- |
|||
|
|||
|
|||
|
|||
## Key Highlights & Popular Sessions |
|||
|
|||
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". |
|||
|
|||
 |
|||
|
|||
There were two international speakers: me and Halil Ibrahim Kalkan from ABP Core Team. Halil's topic was **Implementing Domain-Driven Design as a Pragmatic Developer**. In his session, he gave practical real world examples of bad and best practices of DDD development. |
|||
|
|||
 |
|||
|
|||
|
|||
--- |
|||
|
|||
|
|||
|
|||
## My Talk |
|||
|
|||
My presentation topic was **Building Multi-Tenant ASP.NET Core Applications** was part of this technical deep dive, and I was thrilled to see so much interest in scalable multi-tenant solutions. I generally talked about meta data in SaaS development and explained how to identify the active tenant, how to isolate the data in the same database, how to set `TenantId` automatically for new entities, how to select DB connection for the active tenant, how to change the active tenant when needed, how to disable multi-tenancy temporarily, how to handle database migrations and lastly feature system. These features are major multi-tenancy features, and you'll learn how they are implemented in an open-source web app framework. |
|||
|
|||
 |
|||
|
|||
 |
|||
|
|||
- My presentation 🌐https://github.com/ebicoglu/presentations/tree/main. |
|||
|
|||
- My conf profile🌐 https://dotnext.ru/en/persons/cbe6e4b2cc214a47bfc3752cdb0b1f88/ |
|||
|
|||
|
|||
 |
|||
|
|||
--- |
|||
|
|||
|
|||
|
|||
## Venue and Atmosphere |
|||
|
|||
The MonArch Moscow Hotel provided a great venue, combining spacious halls for sessions with cozy areas for networking. There were also afterparty events, which added a fun, informal touch to the otherwise highly technical environment. The setup allowed plenty of opportunities for spontaneous discussions with attendees and experts, both during and after the sessions. |
|||
|
|||
 |
|||
|
|||
|
|||
--- |
|||
|
|||
|
|||
|
|||
## Boat Tour on Moscow River |
|||
|
|||
After the conference ended, the organizing team took all the speakers on a boat tour on the Moscow River. It was a great open buffet dinner in a nice boat. We had a chance to chat with other speakers. |
|||
|
|||
 |
|||
|
|||
--- |
|||
|
|||
|
|||
|
|||
## Networking and Community |
|||
|
|||
DotNext 2024 provided an excellent platform for connecting with fellow developers and industry leaders. In addition to presentations, there were plenty of opportunities to interact with other participants, including representatives from Microsoft, Volosoft, and local Russian tech giants like Ozon and beeline. The exhibition hall was filled with partner stands, including those from PVS-Studio, Kontur, Eremex and OzonTech which offered interactive displays and demos. |
|||
|
|||
--- |
|||
|
|||
|
|||
|
|||
## Conclusion |
|||
|
|||
Overall, DotNext 2024 lived up to its reputation as a key event for .NET developers. From highly technical talks to networking opportunities, it was a fantastic experience, and I came away with new insights into both the technical and community aspects of the .NET ecosystem. If you’re a .NET developer looking to stay ahead in your field, DotNext is definitely a conference worth attending! |
|||
|
|||
Looking forward to come again! |
|||
|
|||
|
|||
Lastly, I took some beautiful photos of Moscow, here are a few... |
|||
|
|||
 |
|||
|
After Width: | Height: | Size: 274 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 297 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 58 KiB |
@ -1,8 +1,23 @@ |
|||
namespace Volo.Abp.AspNetCore.ExceptionHandling; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace Volo.Abp.AspNetCore.ExceptionHandling; |
|||
|
|||
public class AbpExceptionHandlingOptions |
|||
{ |
|||
public bool SendExceptionsDetailsToClients { get; set; } = false; |
|||
public bool SendExceptionsDetailsToClients { get; set; } |
|||
|
|||
public bool SendStackTraceToClients { get; set; } |
|||
|
|||
public List<Type> SendExceptionDataToClientTypes { get; set; } |
|||
|
|||
public bool SendStackTraceToClients { get; set; } = true; |
|||
public AbpExceptionHandlingOptions() |
|||
{ |
|||
SendExceptionsDetailsToClients = false; |
|||
SendStackTraceToClients = true; |
|||
SendExceptionDataToClientTypes = |
|||
[ |
|||
typeof(IBusinessException) |
|||
]; |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,17 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\..\common.test.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net8.0</TargetFramework> |
|||
<RootNamespace /> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" /> |
|||
<ProjectReference Include="..\..\src\Volo.Abp.ExceptionHandling\Volo.Abp.ExceptionHandling.csproj" /> |
|||
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" /> |
|||
<PackageReference Include="Microsoft.NET.Test.Sdk" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,11 @@ |
|||
using Volo.Abp.Testing; |
|||
|
|||
namespace Volo.Abp.ExceptionHandling; |
|||
|
|||
public class AbpExceptionHandlingTestBase : AbpIntegratedTest<AbpExceptionHandlingTestModule> |
|||
{ |
|||
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) |
|||
{ |
|||
options.UseAutofac(); |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
using Volo.Abp.Autofac; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace Volo.Abp.ExceptionHandling; |
|||
|
|||
[DependsOn( |
|||
typeof(AbpExceptionHandlingModule), |
|||
typeof(AbpTestBaseModule), |
|||
typeof(AbpAutofacModule) |
|||
)] |
|||
public class AbpExceptionHandlingTestModule : AbpModule |
|||
{ |
|||
|
|||
} |
|||
@ -0,0 +1,53 @@ |
|||
using Shouldly; |
|||
using Volo.Abp.AspNetCore.ExceptionHandling; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.ExceptionHandling; |
|||
|
|||
public class ExceptionToErrorInfoConverter_Tests : AbpExceptionHandlingTestBase |
|||
{ |
|||
private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter; |
|||
|
|||
public ExceptionToErrorInfoConverter_Tests() |
|||
{ |
|||
_exceptionToErrorInfoConverter = GetRequiredService<IExceptionToErrorInfoConverter>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public void SendExceptionDataToClientTypes_Test() |
|||
{ |
|||
var exception = new AbpException("test message") |
|||
{ |
|||
Data = |
|||
{ |
|||
["my_data"] = "my_data_value", |
|||
["my_data2"] = 42 |
|||
} |
|||
}; |
|||
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception); |
|||
errorInfo.Data.ShouldBeNull(); |
|||
|
|||
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, options => |
|||
{ |
|||
options.SendExceptionDataToClientTypes.Add(typeof(AbpException)); |
|||
}); |
|||
errorInfo.Data.ShouldNotBeNull(); |
|||
errorInfo.Data.Keys.Count.ShouldBe(2); |
|||
errorInfo.Data["my_data"].ShouldBe("my_data_value"); |
|||
errorInfo.Data["my_data2"].ShouldBe(42); |
|||
|
|||
var businessException = new BusinessException("test message") |
|||
{ |
|||
Data = |
|||
{ |
|||
["my_data"] = "my_data_value", |
|||
["my_data2"] = 42 |
|||
} |
|||
}; |
|||
errorInfo = _exceptionToErrorInfoConverter.Convert(businessException); |
|||
errorInfo.Data.ShouldNotBeNull(); |
|||
errorInfo.Data.Keys.Count.ShouldBe(2); |
|||
errorInfo.Data["my_data"].ShouldBe("my_data_value"); |
|||
errorInfo.Data["my_data2"].ShouldBe(42); |
|||
} |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using Volo.Abp.EventBus; |
|||
|
|||
namespace Volo.Abp.PermissionManagement; |
|||
|
|||
[Serializable] |
|||
[EventName("abp.permission-management.dynamic-permission-definitions-changed")] |
|||
public class DynamicPermissionDefinitionsChangedEto |
|||
{ |
|||
public List<string> Permissions { get; set; } |
|||
} |
|||