From 78587caa302280d4c9aa1c88d7516febac770885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 14 Oct 2020 16:32:40 +0300 Subject: [PATCH] initial ABP Framework 3.3 RC blog post --- .../2020-10-15 v3_3_Preview/POST.md | 101 ++++++++++++++++++ .../2020-10-15 v3_3_Preview/abp-blazor-ui.png | Bin 0 -> 46802 bytes .../MyProjectNameDomainModule.cs | 20 ++++ 3 files changed, 121 insertions(+) create mode 100644 docs/en/Blog-Posts/2020-10-15 v3_3_Preview/POST.md create mode 100644 docs/en/Blog-Posts/2020-10-15 v3_3_Preview/abp-blazor-ui.png diff --git a/docs/en/Blog-Posts/2020-10-15 v3_3_Preview/POST.md b/docs/en/Blog-Posts/2020-10-15 v3_3_Preview/POST.md new file mode 100644 index 0000000000..748fcd06e3 --- /dev/null +++ b/docs/en/Blog-Posts/2020-10-15 v3_3_Preview/POST.md @@ -0,0 +1,101 @@ +# ABP Framework 3.3 RC Has Been Published + +We have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) `3.3.0-rc.1` today. This blog post introduces the new features and important changes of this new version. + +## What's new with the ABP Framework 3.3 + +### The Blazor UI + +We had released an experimental early preview version of the Blazor UI with the [previous version](https://blog.abp.io/abp/ABP-Framework-ABP-Commercial-3.2-RC-With-The-New-Blazor-UI). In this version, we've completed most of the fundamental infrastructure features and the application modules (like identity and tenant management). + +It currently has almost the same functionalities with the other UI types (Angular & MVC / Razor Pages). + +**Example screenshot**: User management page of the Blazor UI + +![abp-blazor-ui](abp-blazor-ui.png) + +> We've adapted the [Lepton Theme](https://commercial.abp.io/themes) for the ABP Commercial, see the related section below. + +We are still working on the fundamentals. So, the next version may introduce breaking changes for the Blazor UI, while we will work to keep them with minimal effect on your application code. + +#### Breaking Changes on the Blazor UI + +TODO + +### Automatic Validation for AntiForgery Token for HTTP APIs + +Starting with the version 3.3, all your HTTP API endpoints are **automatically protected** against CSRF attacks, unless you disable it for your application. + +[See the documentation](https://github.com/abpframework/abp/blob/dev/docs/en/CSRF-Anti-Forgery.md) to understand why you need it and how ABP Framework solves the problem. + +### Stream Support for the Application Service Methods + +[Application services](https://docs.abp.io/en/abp/latest/Application-Services) are consumed by clients and the parameters and return values (typically [Data Transfer Objects](https://docs.abp.io/en/abp/latest/Data-Transfer-Objects)). In case of the client is a remote application, then these objects should be serialized & deserialized. + +Until the version 3.3, we hadn't suggest to use the `Stream` in the application service contracts, since it is not serializable/deserializable. However, with the version 3.3, ABP Framework properly supports this scenario by introducing the new `IRemoteStreamContent` interface. + +Example: An application service that can get or return streams + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Content; + +namespace MyProject.Test +{ + public interface ITestAppService : IApplicationService + { + Task Upload(Guid id, IRemoteStreamContent streamContent); + Task Download(Guid id); + } +} +```` + +The implementation can be like shown below: + +````csharp +using System; +using System.IO; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Services; +using Volo.Abp.Content; + +namespace MyProject.Test +{ + public class TestAppService : ApplicationService, ITestAppService + { + public Task Download(Guid id) + { + var fs = new FileStream("C:\\Temp\\" + id + ".blob", FileMode.OpenOrCreate); + return Task.FromResult( + (IRemoteStreamContent) new RemoteStreamContent(fs) { + ContentType = "application/octet-stream" + } + ); + } + + public async Task Upload(Guid id, IRemoteStreamContent streamContent) + { + using (var fs = new FileStream("C:\\Temp\\" + id + ".blob", FileMode.Create)) + { + await streamContent.GetStream().CopyToAsync(fs); + await fs.FlushAsync(); + } + } + } +} +```` + +> This is just a demo code. Do it better on a production code :) + +Thanks to [@alexandru-bagu](https://github.com/alexandru-bagu) for the great contribution! + +## What's new with the ABP Commercial 3.3 + +TODO + +## Feedback + +Please try the ABP Framework 3.3.0 RC and [provide feedback](https://github.com/abpframework/abp/issues/new) to help us to release a more stable version. The planned release date for the [3.3.0 final](https://github.com/abpframework/abp/milestone/44) version is October 27th. \ No newline at end of file diff --git a/docs/en/Blog-Posts/2020-10-15 v3_3_Preview/abp-blazor-ui.png b/docs/en/Blog-Posts/2020-10-15 v3_3_Preview/abp-blazor-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..ea61f2a48849d96e17e6de24f422705ae9166c29 GIT binary patch literal 46802 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 literal 0 HcmV?d00001 diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs index 91b05c877d..d0ec8ec127 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs @@ -1,8 +1,12 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using MyCompanyName.MyProjectName.MultiTenancy; +using System; +using System.IO; +using System.Threading.Tasks; using Volo.Abp.AuditLogging; using Volo.Abp.BackgroundJobs; +using Volo.Abp.Content; using Volo.Abp.Emailing; using Volo.Abp.FeatureManagement; using Volo.Abp.Identity; @@ -42,5 +46,21 @@ namespace MyCompanyName.MyProjectName context.Services.Replace(ServiceDescriptor.Singleton()); #endif } + + public async Task Upload(Guid id, IRemoteStreamContent streamContent) + { + using (var fs = new FileStream("C:\\Temp\\" + id + ".blob", FileMode.Create)) + { + await streamContent.GetStream().CopyToAsync(fs); + await fs.FlushAsync(); + } + } + + public Task Download(Guid id) + { + var fs = new FileStream(id + ".blob", FileMode.OpenOrCreate); + return Task.FromResult((IRemoteStreamContent)new RemoteStreamContent(fs) { ContentType = "application/octet-stream" }); + } + } }