
上QQ阅读APP看书,第一时间看更新
2.5.4 自定义状态读写逻辑的实现
若用户需要自定义Grain在状态存储时的行为逻辑,可以通过实现IGrainStorage接口并在Orleans运行时初始化时对自定义存储行为对象进行注册,IGrainStorage接口中的Read-StateAsync、WriteStateAsync及ClearStateAsync函数分别对应于对Grain状态(即持久化数据)的读取、写入和清除操作。


实际上在Orleans运行时内部,通过IPersistentState<T>及Grain<T>所提供的状态存储API最终都将使用IGrainStorage接口中的ReadStateAsync、WriteStateAsync及ClearStateAsync函数对实际状态进行序列化存储。因此在业务逻辑中无论采用何种方法定义了有状态的Grain,都会通过IGrainStorage接口中定义的逻辑进行实际存储。
需要特别注意的是,Grain的状态初始化过程是先于OnActivateAsync函数调用的,因此,在StorageProvider中任何读取错误都将直接导致Grain实例的激活失败,在此之后Orleans运行时并不会继续调用OnActivateAsync函数,并会导致后续任何包含ReadStateAsync方法的服务接口出现执行异常(在Orleans运行时中,向读取状态失败的Grian实例发送请求时,会由运行时抛出Orleans.BadProviderConfigException异常)。对于状态写入场景而言,StorageProvider中的任何错误也都将由WriteStateAsync方法抛出,开发人员在业务逻辑中需要对依赖WriteStateAsync方法的逻辑分支进行单独的异常处理。