ABP理論學習之功能管理

2021-09-22 09:46:25 字數 3491 閱讀 1124

大多數的saas(多租戶)應用都有不同功能版本(包)。因此,他們可以給租戶(客戶)提供不同的**和功能選項

abp提供了功能系統使得這個更簡單。我們可以定義功能,然後檢查某個功能是否對乙個租戶開啟了,最後將功能系統整合到其他的abp概念中(如許可權和選單)。

關於ifeaturevaluestore

功能系統使用了ifeaturevaluestore來獲得功能的值。雖然你可以用自己的方式實現該介面,但是它已經完全實現在了module-zero專案中。如果沒有實現該介面,那麼缺省會使用nullfeaturevaluestore對所有的功能返回null(此時使用預設的功能值)。

有兩種基本功能型別。

布林功能

可以是"true"或"false"。這種型別的功能(對於乙個版本或者乙個租戶)可能是開啟的或者關閉的

值功能可以是任意值。雖然它是以字串儲存和檢索的,但是數值也可以輕鬆地儲存為字串。

比如,我們的應用程式可能是乙個任務管理應用,我們可能在乙個月內對於建立任務會有限制。假如說我們有兩個不同的版本:乙個版本每個月允許建立1000個任務,但是另乙個每個月允許建立5000個任務。因此,這個功能應該儲存為值,而不是簡單的true或false。

在檢查功能之前應該先定義功能。乙個模組可以通過從featureprovider類派生來定義自己的功能。這裡有乙個定義了3個功能的非常簡單的功能提供者:

public

class

}

建立功能提供者之後,我們應該在模組的preinitialize方法中註冊,如下所示:

configuration

.features

.providers

.add

基本功能屬性

乙個功能的定義至少要求兩個屬性:

上面的**樣例中,我們定義了乙個名為"samplebooleanfeature"布林功能,它的預設值是"false"(不可用)。我們也定義了兩個值功能(samplenumericfeature定義為samplebooleanfeature的孩子)。

其他功能屬性

雖然對於abp來說乙個唯一的名稱和預設值屬性已經足夠了,但是對於細節的控制還有許多其他的功能屬性。

讓我們看一下該功能的細節定義:

public

class

private

static ilocalizablestring l(string name)

}

注意:abp沒有使用這裡的inputtype。當為功能建立輸入時,應用程式會使用它們。abp只是提供了這些選項使得它更容易。

功能層次

正如樣例功能提供者所示,乙個功能可以有子功能。乙個父母功能一般定義為布林功能。只有父母功能可用時,孩子功能才可用。abp不強制這樣做,但是建議這樣做。

使用requirefeature特性

我們可以為方法或類使用requiredfeature特性,如下所示:

[requiresfeature("exporttoexcel")]

public

async taskgetreporttoexcel(...)

該方法只有在"exporttoexcel"功能對當前租戶開啟時才會執行(當前租戶從iabpsession中獲得)。如果沒有開啟該功能,那麼就會自動丟擲abpauthorizationexception

當然,requiresfeature特性應該用於布林型別功能。否則,你會得到異常。

requiresfeature特性注意點

abp對於功能檢查使用了強大的動態方法攔截(interception)。因此,為方法使用requiresfeature特性時有一些限制條件:

此外,使用ifeaturechecker

我們可以注入並使用ifeaturechecker來手動檢查乙個功能(對於應用服務,mvc和web api控制器,它會自動注入而且直接可以使用)。

isenabled

用於簡單地檢查給定的功能是否開啟。例子:

public

async taskgetreporttoexcel(...)

...}

isenabledasync和其他方法都有同步版本。

當然,isenabled方法應該用於布林型別功能。否則可能會拋異常。

如果你只想檢查乙個功能,然後丟擲例子中的異常,那麼你只需要使用checkenabled方法就行了。

getvalue

用於獲得值型別功能的當前值,例子:

var createdtaskcountinthismonth = getcreatedtaskcountinthismonth();

if (createdtaskcountinthismonth >= featurechecker.getvalue("maxtaskcreationlimitpermonth").to())

featurechecker方法也有對於特定租戶的過載,不僅僅只對於當前的租戶。

客戶端在客戶端,我們使用abp.features命名空間來獲得該功能的當前值。

isenabled

var

isenabled =

abp.features.isenabled('samplebooleanfeature'

);

getvalue

var

value =

abp.features.getvalue('samplenumericfeature'

);

如果需要定義功能,可以注入並使用ifeaturemanager

abp沒有內建的版本系統,因為這麼個系統要求資料庫(儲存版本,版本功能,租戶-版本對映等等)。因此,版本系統實現在了module-zero中了。使用它你可以輕鬆地擁有乙個版本系統,要不然你可以自己實現。

ABP理論學習之功能管理

返回總目錄 大多數的saas 多租戶 應用都有不同功能的版本 包 因此,他們可以給租戶 客戶 提供不同的 和功能選項。abp提供了功能系統使得這個更簡單。我們可以定義功能,然後檢查某個功能是否對乙個租戶開啟了,最後將功能系統整合到其他的abp概念中 如許可權和選單 關於ifeaturevaluest...

ABP理論學習之Abp Session

返回總目錄 當應用程式要求使用者登入時,那麼應用程式也需要知道當前使用者正在執行的操作。雖然asp.net本身在展現層提供了session物件,但abp也提供了在任何需要獲得當前使用者和租戶的地方都可以使用的iabpsession介面。關於iabpsession 為了獲得實際的session資訊,必...

ABP理論學習之開篇介紹

返回總目錄 為了和2016年春節賽跑,完成該系列部落格,我犧牲了今天中午的時間來完成該系列的第一篇 開篇介紹。開篇介紹嘛,讀過大學教材的同學都知道,這玩意總是那麼無聊,跟考試沒關係,乾脆直接跳過,呵呵,多麼美好的大學時光啊!不過,現在想想,開篇介紹確實不怎麼重要,它只是告訴我們今後我要開始講什麼了,...