docs/en/Blog-Posts/2020-07-01 v3_0_Release/Post.md
We are excited to announce that the ABP Framework & and the ABP Commercial version 3.0 have been released. As different than the regular release lifecycle, which is 2-weeks, this version has taken 4-weeks with 119 issues closed, 89 pull requests merged and 798 commits done in the main framework repository.
Since this is a major version, it also includes some breaking changes. Don't panic, the changes are easy to adapt and will be explained below.
See the GitHub release notes for a detailed change log.
This post will only cover the important features/changes. You can see all the changes on the GitHub release notes.
Angular version 10 has just been released and we've immediately migrated the startup templates to Angular 10! So, when you create a new solution with the Angular UI, you will take the advantage of the new Angular.
We've prepared a migration guide for the projects created an older version and want to migrate to Angular 10.
We had created an integration package for the Oracle for EF Core based applications using the Devart's library since the official Oracle EF Core package was not supporting the EF Core 3.1. It now supports as a beta release. While it is in beta, we've created the integration package, so you can use it in your application.
See the documentation for details.
We had created a BLOB storing system in the previous version with a file system and database storage provider. This release introduces the Azure BLOB Storage provider. See the documentation.
The standard IDistributeCache interface of the ASP.NET Core doesn't contain bulk operations, like setting multiple items with a single method/server call. ABP Framework introduces new methods those can be used for bulk operations on the ABP's IDistributedCache<T> interface:
Then we needed to implement these new methods for Redis cache and had to create a Redis integration package which extends the Microsoft's implementation.
These methods are also used by the ABP Framework to cache settings, features and permissions for a user/role/tenant and brings a significant performance improvement.
See the caching document for details.
Virtual File System now supports to use GenerateEmbeddedFilesManifest in your projects to add the real file/directory structure of your embedded resources in the compiled assembly. So, you can now access to the files without any file name restriction (previously, some special chars like . in the directory names was a problem in some cases)
See the documentation to learn how to take the advantage of new system.
Based on the requests from the community, we've prepared two new sample applications:
The standard StringLength and MaxLength data annotation attributes is useful to validate properties of a class when the class is used as a Model or DTO. However, just like any other attribute, the length values should be literal (constant) values known at compile time.
Example: Using the StringLength
public class CreateBookDto
{
public const int MaxNameLength = 128; //CONSTANT!
[StringLength(MaxNameLength)]
public string Name { get; set; }
}
ABP Framework now has the DynamicStringLength & DynamicMaxLength properties to allow to determine the lengths at runtime.
Example: Using the DynamicStringLength
public class CreateBookDto
{
public static int MaxNameLength { get; set; } = 128;
[DynamicStringLength(typeof(CreateBookDto), nameof(MaxNameLength))]
public string Name { get; set; }
}
DynamicStringLength gets a class type and the name of a static property on this class to read the max length (there is also a minimum length option just like the StringLength).
This allows you to get the max value from a configuration and set on the application startup (generally, in the PreConfigureServices method of your module):
CreateBookDto.MaxNameLength = 200;
This feature is used by the pre-built application modules, so you can now override the max lengths of the properties defined in these modules.
ABP can automatically publish distributed events for all entities on their create, update and delete events. That's pretty useful since you commonly interest in these basic events in a distributed system.
This feature is mature and documented with the v3.0. You can easily configure some or all the entities to be published.
When you work with LINQ extension methods, you need to call ToListAsync(), FirstOrDefaultAsync()... methods on your queries. Unfortunately, these methods are not standard LINQ extension methods. They are defined in the Microsoft.EntityFrameworkCore package (or in the MongoDB.Driver package if you are using the MongoDB).
So, you need to depend on this package if you want to use the async extension methods. That breaks the layering and makes your application or domain layer depends on the EF Core / MongoDB package.
IAsyncQueryableExecuter is a service defined by the ABP Framework to execute queries asynchronously without depending the specific provider (EF Core / MongoDB) package.
See the documentation to read the details and learn our recommendations.
We are now publishing API documents for the ABP Framework and modules in every release. So, you can explore the ABP Framework classes much more easier than before. Click the the API Documentation link on the navigation menu of the documentation.
We have created a page to list all the ABP-related official NuGet and NPM packages.
abp.currentUser (CurrentUser service in the Angular UI) now has a roles array that contains role names of the current user.ReadOnlyAppService base class (which has only the get operations) in addition to the CrudAppService base class (which has get, create, update and delete operations).See the GitHub release notes for others updates.
In addition to all the features coming with the ABP Framework, the ABP Commercial has additional features with this release, as always. This section covers the ABP Commercial highlights in the version 2.9.
We've created a new module that is used to store and manage files in your application. This new module is based on the BLOB Storing system, so it can use different storage providers to store the file contents.
Example screenshot
You can upload, download and organize files in a hierarchical folder structure. It is also compatible to multi-tenancy and you can determine total size limit for your tenants. In the next versions, we will be working on a "share" system to share files between users in a more controlled way or share your files with your customers with a public link.
File Management module is currently available only for the MVC / Razor Pages UI. We are working on the Angular UI and it will be released in the next versions.
Since this is a major version, we've redesigned some APIs and introduced a few "easy to fix" breaking changes.
DynamicStringLength as explained above.ConcurrencyStamp max length to 40. You need to add a database migration and update your database after upgrading the ABP Framework.~ instead of ^ for NPM package dependencies anymore, to be more stable.theme1.png, theme1-reverse.png, theme2.png, theme2-reverse.png (... 6). Now, we have only two logo files: logo-light.png and logo-dark.png. So, rename your logo in the wwwroot/images/logo/ folder for the MVC UI and /src/assets/images/logo/ folder for the Angular UI.Also, see the migration guide for Angular UI.
We will continue to release a new minor/feature version in every two weeks. So, the next expected release date is 2020-07-16 for the version 3.1.
In the next few versions, we will be focused on the Blazor UI, as promised on the road map. We will continue to improve the documentation, create samples, add other new features and enhancements. Follow the ABP Framework Twitter account for the latest news...
Beside developing our products, our team are constantly writing articles/tutorials on various topics. You may want to check the latest articles: