ABP官方文件 九 快取管理

2021-08-10 03:08:59 字數 3826 閱讀 8065

abp給出了乙個抽象快取基類。並在內部使用了該抽象基類。使用 memorycache 來實現了該抽象基類。它能夠被任何其它的快取類來擴充套件。abp.rediscache 包就擴充套件了該快取基類。

abp對外提供了乙個快取介面icachemananger。我們通過建構函式注入這個介面來獲取快取。示例如下:

public

public item getitem(int id)

public item getfromdatabase(int id)

}

在這個示例中,我們注入了 icachemanager介面,並且獲取了乙個名稱為mycache的快取。快取的名字是大小寫敏感的,那就是」mycache」和」mycache」取得的快取內容是不同的。

注意:getcache方法

千萬不要在你的建構函式中使用getcache方法。如果類不是乙個單例物件那麼該快取可能會被dispose掉。

icachemanager.getcache方法返回了乙個icache物件。每乙個快取都是基於名稱單例存在的。只有首次訪問時才會被建立,以後你每次用相同的名稱去獲取的快取都是相同的。所以我們可以在不同的類中使用相同的名稱來共享相同的快取。

在示例**中,我們簡單的使用了icache.get方法,它有兩個引數:

icache介面還有其它方法,例如:getordefault,set,remove和clear。當然也有這些方法的非同步(async)版本。

icache介面用key(字串型別)來獲取快取value(object型別)。itypedcache為icahe提供了乙個型別安全的包裝;為了使型別安全轉換(icache到itypedcache),我們可以用擴充套件方法astyped,而不需要寫其它強制型別轉換的**,如下所示:

itypedcache mycache = _cachemanager.getcache("mycache").astyped();
快取的過期時間預設是60分鐘。它是變化的。如果你在60分鐘內沒有使用該快取,該快取會被自動的移除。如果你想改變所有的快取或者指定的快取來的預設過期時間,你可以這樣做,實現如下:

//對所有快取的配置

configuration.caching

.configureall(cache =>

);//對指定快取的配置

configuration.caching

.configure("mycache", cache =>

);

這段**你應該放在模組(module)的preinitialize方法中。如上所示:mycache將會在8小時後過期,而其他的快取將在2小時後過期。

這些配置將會在首次建立快取的時候生效。配置不僅僅侷限於defaultslidingexpiretime,你可以利用icache介面中的屬性獲取方法來自由的配置並且初始化它們。

abp的快取系統是以通用為目的,它有乙個entitycache基類,如果你需要的話,這個基類可以幫助你快取實體。使用這個基類,我們可以通過id取得實體,並且我們通過id來快取實體,這樣以後就不需要頻繁的查詢資料庫去取得實體。假設我們有個person實體,像下面一樣:

public

class person : entity

public

int age

}

並且,假設我們通過該實體的id,需要頻繁呼叫取得person實體的name。首先,我們應該建立乙個類來儲存cache items

[automapfrom(typeof(person))]

public

class personcacheitem

}

然而這不是必須的,我們可能想定義乙個介面為快取類:

public

inte***ce ipersoncache : ientitycache

最後,我們可以建立快取類來快取person實體:

public

class personcache : entitycache, ipersoncache, itransientdependency

}

這樣就ok了,我們的person快取已經準備好可以使用了。快取類可以使瞬時(如同這個例子)或者是單例。這不是說快取資料是瞬態的。在你的應用程式中它一直是全域性快取並且是執行緒安全的。

現在,無論在什麼地方我們需要取得person的name,我們可以通過person的id從快取中取得它。如下所示:

public

class mypersonservice : itransientdependency

public

string

getpersonnamebyid(int id)

}

我們很容易的注入ipersoncache介面,通過該介面取得快取項和name屬性。

那麼entitycache是怎麼工作的?

redis cache 整合

預設cache mananger是使用in-memory來快取。所以,這可能會成為乙個問題,如果有多個併發的web服務執行在同乙個應用中。在這種情況下,你可能想要乙個分布式/**快取伺服器。那麼,你可以使用redis來作為你的快取服務。

首先,你需要安裝 abp.rediscache nuget package 到你的專案中(你可以安裝它到你的web專案)。那麼你需要為abprediscachemodule新增dependson特性,並且在你模組的preinitialize方法中呼叫useredis擴充套件方法,如下所示:

//...其他命名空間的引用

using abp.runtime.caching.redis;

namespace myproject.abpzerotemplate.web

//...其他**

}}

abp.rediscache package 使用「localhost」作為預設的連線字串。你可以新增連線字串到你的配置檔案中來覆蓋它。如:

name="abp.redis.cache"

connectionstring="localhost"/>

key="abp.redis.cache.databaseid"

value="2"/>

在同乙個伺服器上使用不同的資料庫id是非常有用的這可以建立不同的key spaces(隔離快取)。

useredis有乙個過載方法,你可以通過這個方法來傳入配置引數,這可以覆蓋掉配置檔案中的配置。

關於redis的其他配置可以檢視 redis文件。

當然譯者也簡單的對stackexchange.redis進行了翻譯,吐槽一下這個文件的作者可能真的是乙個真正的程式設計師,***。

注意:在abp中使用redis快取你需要安裝redis服務並使其執行。

ABP官方文件翻譯 3 5 規約

規約 建立規範類 使用倉儲規約 組合規約 討論介紹 規約模式是一種特別的軟體設計模式,通過使用布林邏輯將業務規則鏈結起來重新調配業務規則。維基百科 尤其是,它通常用來為實體或其他業務物件定義可復用的過濾器。示例 在這個部分,我們將看到規約模式的必要性。本部分是通用的,和abp的實現沒有必然的關係。假...

ABP官方文件 三 模組系統

abp框架提供了建立和組裝模組的基礎,乙個模組能夠依賴於另乙個模組。在通常情況下,乙個程式集就可以看成是乙個模組。在abp框架中,乙個模組通過乙個類來定義,而這個類要繼承自abpmodule。模組系統當前專注於服務端而不是客戶端。譯者注 如果學習過orchard的朋友,應該知道module模組的強大...

ABP官方文件 四 啟動配置

在應用啟動之前,abp框架提供了模組基本的配置和方法,大家參照下面這個例子就可以了。public class tasksystemmodule abpmodule public override void initialize 和orchard類似,abp框架一開始就被設計成模組化的,不同的模組可以...