Gui*_*lez 5 c# erlang actor orleans
在erlang中,你可以在产生它时将初始状态传递给actor.这样您就不需要处理init消息,这些消息会将actor再次置于初始状态,或者需要init消息之前到达的消息.在奥尔良,假设谷物总是存在,你不能使用构造函数.有没有办法将初始状态传递给grain,从而避免任何init方法通过在任何其他方法之前调用它来破坏一致性?
当我说"把演员带到它的初始状态"时,我的意思是,在奥尔良语境中,调用特定粒子激活的init方法两次.这就像覆盖国家.也许你需要这个重置状态的消息之王,但如果你不需要它,那就是一个陷阱,一个潜在的错误来源.
我正在寻找某种类型的构造函数,类似于spawn(module, function, [initial state])erlang.我的第一次尝试是使用以下签名寻找GetGrain的任何重载:GrainFactory.GetGrain<IGrain>(id, initialState);
正如@svick 所建议的那样,OnActivateAsync是加载谷物初始状态的最佳方法。
public class ExampleGrain : Orleans.Grain, IExampleGrain
{
public override Task OnActivateAsync()
{
// set initial state for grain
return base.OnActivateAsync();
}
...
Run Code Online (Sandbox Code Playgroud)
每次初始化谷物时都会调用此方法(不仅仅是第一次)。您可以使用 Orleans 中内置的 Persistence 基础结构来记录之前是否已创建谷物(可能使用状态类上的布尔属性),即
public class ExampleGrainState : GrainState
{
public bool Initialised { get; set; }
}
[StorageProvider(ProviderName = "Storage")]
public class QuadKeyGrain : Orleans.Grain<ExampleGrainState>, IExampleGrain
{
public override async Task OnActivateAsync()
{
if (!this.State.Initialised)
{
// do initialisation
this.State.Initialised = true;
await this.WriteStateAsync();
}
await base.OnActivateAsync();
}
Run Code Online (Sandbox Code Playgroud)
有关持久性的更多信息,请参阅本教程:
http://dotnet.github.io/orleans/Tutorials/Declarative-Persistence.html