Reliable collections
Saga data is stored in reliable dictionaries.
Saga data serialization
Saga data in stored in JSON format using Json.NET.
Saga data serialization can be configured by providing custom JsonSerializerSettings instance
var persistence = endpointConfiguration.UsePersistence<ServiceFabricPersistence>();
var sagaSettings = persistence.SagaSettings();
sagaSettings.JsonSettings(new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Converters =
{
new IsoDateTimeConverter
{
DateTimeStyles = DateTimeStyles.RoundtripKind
}
}
});
custom JsonReader instance
var persistence = endpointConfiguration.UsePersistence<ServiceFabricPersistence>();
var sagaSettings = persistence.SagaSettings();
sagaSettings.ReaderCreator(
readerCreator: textReader =>
{
return new JsonTextReader(textReader);
});
or custom JsonWriter instance
var persistence = endpointConfiguration.UsePersistence<ServiceFabricPersistence>();
var sagaSettings = persistence.SagaSettings();
sagaSettings.WriterCreator(
writerCreator: builder =>
{
var writer = new StringWriter(builder);
return new JsonTextWriter(writer)
{
Formatting = Formatting.None
};
});
Saga data storage
By default saga data stored in multiple reliable collections - one per saga data type. Reliable collection name can be changed at the level of saga data type
[ServiceFabricSaga(CollectionName = "custom-collection-name")]
public class CustomCollectionNameSaga :
Saga<CustomCollectionNameSaga.SagaData>,
IHandleMessages<Message>
{
public Task Handle(Message message, IMessageHandlerContext context)
{
return Task.CompletedTask;
}
Saga data identifier used as a key in reliable dictionary gets calculated, among others, from saga data type name. As a result, renaming saga data class name changes storage identifier for every saga data instance. This is a problem especially when some saga data instances have already been stored for a given saga data type. In such scenarios it is necessary to provide stable saga data type name
[ServiceFabricSaga(SagaDataName = "saga-data-name")]
public class ExplicitSagaDataNameSaga :
Saga<ExplicitSagaDataNameSaga.SagaData>,
IHandleMessages<Message>
{
public Task Handle(Message message, IMessageHandlerContext context)
{
return Task.CompletedTask;
}