经过上篇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>
<SeedNode Address="localhost" Port="11111" />
<StorageProviders>
<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>
<Networking Address="localhost" Port="11111" />
<ProxyingGateway Address="localhost" Port="40000" />
<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, 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
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(); //写入,一般不需要我们手动调用