1. 程式人生 > >Orleans學習總結(三)--持久化篇

Orleans學習總結(三)--持久化篇

cor ttr ssa cati write lob conf div love

經過上篇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學習總結(三)--持久化篇