Orleans學習總結(三)--持久化篇
經過上篇Orleans學習總結(二)--創建工程的介紹,我們的工程已經跑起來了,下面我們來介紹下持久化相關。
關於持久化的文檔地址在這http://dotnet.github.io/orleans/Documentation/Core-Features/Grain-Persistence.html
Orleans對持久化做了高度封裝,使我們開發起來非常簡單,而且切換數據庫非常方便,簡單到只需要幾個配置就實現了。
Orleans支持的數據庫很多,我這裏就以MySQL舉例來說。
一、配置部分
上一篇我們沒有用到配置文件,配置是直接寫在代碼裏的,這篇我們來介紹下配置文件
1、在Host旁邊創建一個OrleansConfiguration.xml,內容如下
<?xml version="1.0" encoding="utf-8"?> <OrleansConfiguration xmlns="urn:orleans"> <Globals> <!--主Silo配置,這不是生產環境的配置方式,一般調試開發這樣配置--> <SeedNode Address="localhost" Port="11111" /> <StorageProviders> <!--名字為Default的持久化方式,MySQL--> <Provider Type="Orleans.Storage.AdoNetStorageProvider" Name="Default" AdoInvariant="MySql.Data.MySqlClient" DataConnectionString="Server=192.168.0.209;Database=orleans;User Id=dbuser;Password=dbuser;" UseJsonFormat="true" /> </StorageProviders> </Globals> <Defaults> <!--Silo和Silo之間通信用的IP和端口--> <Networking Address="localhost" Port="11111" /> <!--Client用來鏈接Silo的IP和端口--> <ProxyingGateway Address="localhost" Port="40000" /> <!--Log配置--> <Tracing DefaultTraceLevel="Info" TraceToConsole="true" TraceToFile="..\log\{0}-{2}-{1}.log" WriteMessagingTraces="false"> <TraceLevelOverride LogPrefix="Application" TraceLevel="Info" /> <TraceLevelOverride LogPrefix="AssemblyLoader.Client" TraceLevel="Info" /> </Tracing> </Defaults> </OrleansConfiguration>
2、讓Host讀取這個配置,去掉這一行,把config參數去掉就行了。Host啟動時默認加載OrleansConfiguration.xml這個配置文件
3、還在要Host成功安裝依賴庫
4、創建MySQL數據庫
創建一個名字為orleans的schema,然後執行下CreateOrleansTables_MySql.sql腳本,這個腳本就在MyOrleans\packages\Microsoft.Orleans.OrleansSqlUtils.1.5.3\lib\net461\MySql
創建完如下圖
記得第1步配置裏的 DataConnectionString="Server=192.168.0.209;Database=orleans;User Id=dbuser;Password=dbuser;",要確保和你的MySQL是連通的。
二、代碼部分
1、在Grain工程定義一個類HelloState,並修改HelloGrain類代碼,如下
public class HelloState { public string Text { get; set; } }
[StorageProvider(ProviderName = "Default")] public class HelloGrain : Orleans.Grain<HelloState>, IHello { public Task<string> SayHello(string greeting) { Console.WriteLine(greeting); State.Text = greeting; return Task.FromResult($"You said: ‘{greeting}‘, I say: Hello!"); } }
2、說明
所有public class HelloGrain : Orleans.Grain<HelloState>帶模板參數的類都會多一個成員State
State.Text = greeting;就相當於給數據庫的Text字段賦值了
[StorageProvider(ProviderName = "Default")] 就是指定這個類的持久化用名為Default的provider,如果不加這一行就默認用用名為Default的provider。
如果你有多個Provider也可以指定成其他的。
3、API
protected virtual Task ClearStateAsync(); //清除數據
protected virtual Task ReadStateAsync(); //讀取,一般不需要我們手動調用
protected virtual Task WriteStateAsync(); //寫入,一般不需要我們手動調用
Orleans學習總結(三)--持久化篇