天天看點

[譯]ABP架構v2.9已經釋出

ABP架構v2.9已經釋出

ABP架構和ABP商業版2.9已經釋出,這是3.0之前的最後一個版本!這篇文章将涵蓋本次釋出中的新增内容.

ABP架構2.9有哪些新增内容?

你可以中GitHub的發行說明中看到所有的變更.這篇文章将隻包括重要特征/變更.

預編譯Razor Pages

在之前的版本, 預建構的頁面(為應用子產品)和視圖元件是在運作時編譯. 現在,它們使用了預編譯. 我們測量的應用程式啟動時間(尤其是MVC UI)已經減少了50%以上.換句話說,它比之前的版本快兩倍.速度變化也影響你第一次通路某一個頁面時.

這是一個v2.8和v2.9啟動應用程式模闆的對比結果:

### v2.8

2020-06-04 22:59:04.891 +08:00 [INF] Starting web host.
2020-06-04 22:59:07.662 +08:00 [INF] Now listening on: https://localhost:44391
2020-06-04 22:59:17.315 +08:00 [INF] Request finished in 7756.6218ms 200 text/html;

Total: 12.42s

### v2.9

2020-06-04 22:59:13.720 +08:00 [INF] Starting web host.
2020-06-04 22:59:16.639 +08:00 [INF] Now listening on: https://localhost:44369
2020-06-04 22:59:18.957 +08:00 [INF] Request finished in 1780.5461ms 200 text/html;

Total: 5.24s
           

你不用做任何改動就能獲得新方法帶來的益處.重寫UI頁/元件和之前一樣也能正常工作.我們将在v3.0中繼續緻力于性能上的提升.

組織單元系統

Identity子產品現在有了呼聲最高的功能: 組織單元!

組織單元系統用來在應用程式中建立分層組織樹.這樣你可以使用該組織樹來授權應用程式中的資料和功能.

文檔将很快到來......

新的Blob存儲包

我們建立了一個新的Blob存儲包用來存儲任意二進制對象.它一般用于在應用程式中存儲檔案.這個包提供了一個抽象,是以任何應用程式或子產品都能以存儲提供器無關的方式來儲存和擷取檔案.

目前實作了兩個存儲提供器:

  • Volo.Abp.BlobStoring.FileSystem包, 在本地檔案系統中存儲對象/檔案.
  • Volo.Abp.BlobStoring.Database子產品, 在資料庫中存儲對象/檔案.目前支援Entity Framework Core(是以,你可以使用任何關系資料庫和MongoDB).

Azure BLOB提供器将會在3.0中可用. 你可請求其他的雲提供器或在GitHub庫上送出你自己的貢獻.

Blob存儲系統的一個好處是,它允許你建立多個容器(每個容器是一個Blob存儲),并為每個容器使用不同的存儲提供器.

示例:使用預設的容器儲存和取得一個位元組數組

public class MyService : ITransientDependency
{
    private readonly IBlobContainer _container;

    public MyService(IBlobContainer container)
    {
        _container = container;
    }

    public async Task FooAsync()
    {
        //儲存一個BLOB
        byte[] bytes = GetBytesFromSomeWhere();
        await _container.SaveAsync("my-unique-blob-name", bytes);

        //擷取一個BLOB
        bytes = await _container.GetAllBytesAsync("my-unique-blob-name");
    }
}
           

它可以使用

byte[]

Stream

對象.

示例:使用類型化(命名)容器來儲存和擷取stream

public class MyService : ITransientDependency
{
    private readonly IBlobContainer<TestContainer> _container;

    public MyService(IBlobContainer<TestContainer> container)
    {
        _container = container;
    }

    public async Task FooAsync()
    {
        //儲存一個BLOB
        Stream stream = GetStreamFromSomeWhere();
        await _container.SaveAsync("my-unique-blob-name", stream);

        //擷取一個BLOB
        stream = await _container.GetAsync("my-unique-blob-name");
    }
}
           

TestContainer

隻是一個用來辨別容器的空類:

[BlobContainerName("test")] //指定容器的名字
public class TestContainer
{

}
           

類型化(命名)容器可被配置為使用不同的存儲提供器而不是預設的.在開發可複用的子產品時, 始終使用類型化的容器是一個很好的做法,這樣最終應用程式可以為這個容器配置提供器,而不影響其他容器.

示例:為

TestContainer

配置檔案系統提供器

Configure<AbpBlobStoringOptions>(options =>
{
    options.Containers.Configure<TestContainer>(configuration =>
    {
        configuration.UseFileSystem(fileSystem =>
        {
            fileSystem.BasePath = "C:\\MyStorageFolder";
        });
    });
});
           

檢視blob存儲文檔以擷取更多的資訊.

Entity Framework Core的Oracle內建包

我們建立了一個Oralce內建包,這樣你就可以為EF Core輕松地切換到Oracle.它已經為架構和預建構的子產品進行了測試.

檢視文檔開始使用Oracle內建包.

自動判斷資料庫提供器

當你用EF Core開發一個可複用的應用程式子產品時,你通常要将你的子產品開發為DBMS無關的.但是,不同的DBMS有一些微小的(有時是很大的)差別.現在如何你執行基于DBMS的自定義映射,可以使用

ModelBuilder.IsUsingXXX()

擴充方法:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Phone>(b =>
    {
        //...
        if (modelBuilder.IsUsingPostgreSql()) //檢查是否在使用PostgreSQL!
        {
            b.Property(x => x.Number).HasMaxLength(20);
        }
        else
        {
            b.Property(x => x.Number).HasMaxLength(32);
        }
    });
}
           

除了上面這種的傻傻的例子,你可以任意配置你的映射!

ABP CLI:翻譯指令

abp translate

是一個新的指令,當你的源代碼庫中包含多個JSON本地化檔案時, 它可用來簡化翻譯本地化檔案,

該指令的主要目的是翻譯ABP架構的本地化檔案(因為abp庫在不同的檔案中含有成千上萬個本地化檔案需要翻譯).

非常感謝如果你使用這個指令将架構資源翻譯為你的母語.

檢視文檔來學習如何使用它.也可檢視貢獻指南.

新的虛拟檔案系統浏覽器子產品

感謝@liangshiw建立并貢獻了一個新的子產品用來浏覽虛拟檔案系統中的檔案.它适用于MVC UI并顯示所有應用程式中的虛拟檔案.示例截圖:

[譯]ABP架構v2.9已經釋出
[譯]ABP架構v2.9已經釋出

檢視文檔學習如何使用它.

示例應用程式:SignalR與分層架構

在分布式/分層架構中實施SignalR是具有挑戰性的.我們建立了一個示例應用程式示範如何輕松地使用SignalR內建和分布式事件總線系統

檢視示例解決方案的源代碼.

一篇正在路上的文章将深入地解釋該解決方案.關注@abpframework的Twitter帳号.

[譯]ABP架構v2.9已經釋出

一張文章中的圖檔,顯示了該解決方案的通信圖

關于gRPC

我們建立了一個示例應用程式來說明如何在基于ABP的應用程式中建立和使用gRPC端點.

檢視GitHub上的源碼.

我們本來計劃為所有預建構的應用程式子產品建立gRPC端點,但我們發現ASP.NET Core gRPC內建還不夠成熟,不支援一些常見的部署場景.是以推遲到了下一個版本(更多内容檢視此評論).但是,在你的應用程式中使用gRPC是非常标準的. ABP架構與gRPC沒有問題.看一下示例應用程式.

其它

  • 時區系統為應用程式支援不同的時區.
  • 在IIS上支援虛拟路徑部署.
  • 為Angular UI支援RTL.

其它更新請檢視GitHub發行說明.

ABP商業版2.9有哪些新增内容

與往常一樣, 除了ABP架構所有這些功能以外,ABP商業版在本次釋出還有一些額外的功能.本節介紹ABP商業版在2.9版本中的亮點.

組織單元管理UI

我們為組織單元建立了UI,管理ABP商業版Identity子產品的成員和角色:

[譯]ABP架構v2.9已經釋出

OU管理适用于MVC(Razor Pages)和Angular使用者界面.

聊天子產品Angular UI

我們在前一個版本介紹了新的聊天子產品, 當時它隻有ASP.NET Core MVC / Razor Pages UI. 現在它也包含了一個Angular UI選項.

[譯]ABP架構v2.9已經釋出

聊天子產品的截圖 - 兩個使用者互相發消息

Easy CRM Angular UI

Easy CRM是建立在ABP商業版上的一個示例應用程式, 用來為ABP商業版客戶提供一個相對複雜的應用程式.在2.7版本中,我們已經釋出了MVC / Razor Pages UI. 這次2.9版中, 我們為Easy CRM應用程式釋出了Angular UI.

[譯]ABP架構v2.9已經釋出

Easy CRM應用程式中"訂單詳細"的截圖.

檢視Easy CRM文檔學習如何下載下傳并運作它.

ABP Suite子產品代碼生成

ABP Suite是一個工具,主要功能是用來為一個實體生成代碼, 從資料庫到UI層具有完整的CRUD功能.

[譯]ABP架構v2.9已經釋出

ABP Suite的截圖: 定義新實體的屬性并且為你生成應用程式代碼!

在本次釋出之前它隻工作于應用程式模闆.現在,它支援為子產品項目生成代碼.利用代碼生成的威力來建立可複用應用程式子產品是很棒的一個做法.

除了這個主要功能,我們在這個版本中向ABP Suite添加了許多細微的改進.

注意:子產品模闆代碼生成目前處于測試階段.如果你發現任何bug,請告知我們.

Lepton主題

Lepton主題是我們為ABP商業版開發的一個商業主題.

  • 與Bootstrap 100%相容 - 讓你不寫主題特定的HTML!
  • 提供不同類型的風格 - 看一下下圖中的Material風格.
  • 提供不同類型的布局(側/頂部菜單,流式/盒式布局...).
  • 輕量化,響應式和現代化.
  • 還有...它是可更新的,沒有成本!你隻需更新NuGet / NPM包來獲得新的功能.

我們建立了它的專屬網站:http://leptontheme.com/

在這裡你可以檢視所有的元件, 無需單獨的應用程式.

[譯]ABP架構v2.9已經釋出

這個網站目前正處于一個非常早期的階段.我們将建立文檔和和改進網站, 來為你的開發提供參考和探索主題的功能.

即将推出:檔案管理子產品

基于新的blob存儲系統(上面介紹的),我們已經開始建構一個檔案管理子產品用來管理(浏覽/上傳/下載下傳)你應用程式中分層檔案系統并在使用者與客戶之間分享檔案.

我們計劃在ABP商業版v3.0中發行最初版本,并繼續進行後續版本的改進.

關于下一個版本:3.0

我們在v2.8和v2.9中增加了許多新的功能.在下一個版本中,我們将完全專注于文檔,性能優化和其它改進,如bug修複.

長期以來,我們每2周釋出一個新功能版本.我們在v3.0以後繼續這種方式.但是,v3.0是一個例外,開發周期大概為4周.v3.0的計劃釋出日期是2020年7月1日.

彩蛋:文章!

除了開發我們的産品,我們的團隊都在不斷地撰寫各種主題的文章/教程.你可以看一下最新的文章:

  • ASP.NET Core 3.1使用Pub/Sub實作WebHook
  • ASP.NET Core使用Azure Key Vault