Ejemplo n.º 1
0
 public SagaInfoCache(
     RetrieveVersionSpecificJsonSettings versionSpecificSettings,
     JsonSerializer jsonSerializer,
     Func<TextReader, JsonReader> readerCreator,
     Func<TextWriter, JsonWriter> writerCreator,
     SagaCommandBuilder commandBuilder)
 {
     this.versionSpecificSettings = versionSpecificSettings;
     this.writerCreator = writerCreator;
     this.readerCreator = readerCreator;
     this.jsonSerializer = jsonSerializer;
     this.commandBuilder = commandBuilder;
 }
    public RuntimeSagaInfo(
        Type sagaDataType,
        RetrieveVersionSpecificJsonSettings versionSpecificSettings,
        Type sagaType,
        JsonSerializer jsonSerializer,
        Func <TextReader, JsonReader> readerCreator,
        Func <TextWriter, JsonWriter> writerCreator,
        string tablePrefix,
        SqlDialect sqlDialect,
        Func <string, string> nameFilter)
    {
        this.sagaDataType = sagaDataType;
        if (versionSpecificSettings != null)
        {
            deserializers = new ConcurrentDictionary <Version, JsonSerializer>();
        }
        this.versionSpecificSettings = versionSpecificSettings;
        SagaType            = sagaType;
        this.jsonSerializer = jsonSerializer;
        this.readerCreator  = readerCreator;
        this.writerCreator  = writerCreator;
        this.sqlDialect     = sqlDialect;
        CurrentVersion      = sagaDataType.Assembly.GetFileVersion();
        ValidateIsSqlSaga();
        var sqlSagaAttributeData = SqlSagaTypeDataReader.GetTypeData(sagaType);
        var tableSuffix          = nameFilter(sqlSagaAttributeData.TableSuffix);

        TableName = sqlDialect.GetSagaTableName(tablePrefix, tableSuffix);

        CompleteCommand          = sqlDialect.BuildCompleteCommand(TableName);
        SelectFromCommandBuilder = sqlDialect.BuildSelectFromCommand(TableName);
        GetBySagaIdCommand       = sqlDialect.BuildGetBySagaIdCommand(TableName);
        SaveCommand   = sqlDialect.BuildSaveCommand(sqlSagaAttributeData.CorrelationProperty, sqlSagaAttributeData.TransitionalCorrelationProperty, TableName);
        UpdateCommand = sqlDialect.BuildUpdateCommand(sqlSagaAttributeData.TransitionalCorrelationProperty, TableName);

        CorrelationProperty    = sqlSagaAttributeData.CorrelationProperty;
        HasCorrelationProperty = CorrelationProperty != null;
        if (HasCorrelationProperty)
        {
            GetByCorrelationPropertyCommand = sqlDialect.BuildGetByPropertyCommand(sqlSagaAttributeData.CorrelationProperty, TableName);
        }

        TransitionalCorrelationProperty    = sqlSagaAttributeData.TransitionalCorrelationProperty;
        HasTransitionalCorrelationProperty = TransitionalCorrelationProperty != null;
        if (HasTransitionalCorrelationProperty)
        {
            TransitionalAccessor = sagaDataType.GetPropertyAccessor <IContainSagaData>(TransitionalCorrelationProperty);
        }
    }
 public SagaInfoCache(
     RetrieveVersionSpecificJsonSettings versionSpecificSettings,
     JsonSerializer jsonSerializer,
     Func <TextReader, JsonReader> readerCreator,
     Func <TextWriter, JsonWriter> writerCreator,
     string tablePrefix,
     SqlDialect sqlDialect,
     SagaMetadataCollection metadataCollection,
     Func <string, string> nameFilter)
 {
     this.versionSpecificSettings = versionSpecificSettings;
     this.writerCreator           = writerCreator;
     this.readerCreator           = readerCreator;
     this.jsonSerializer          = jsonSerializer;
     this.tablePrefix             = tablePrefix;
     this.sqlDialect = sqlDialect;
     this.nameFilter = nameFilter;
     Initialize(metadataCollection);
 }
Ejemplo n.º 4
0
    public RuntimeSagaInfo(
        SagaCommandBuilder commandBuilder,
        Type sagaDataType,
        RetrieveVersionSpecificJsonSettings versionSpecificSettings,
        Type sagaType,
        JsonSerializer jsonSerializer,
        Func <TextReader, JsonReader> readerCreator,
        Func <TextWriter, JsonWriter> writerCreator,
        string tablePrefix,
        string schema,
        SqlVariant sqlVariant,
        Func <string, string> nameFilter)
    {
        this.sagaDataType = sagaDataType;
        if (versionSpecificSettings != null)
        {
            deserializers = new ConcurrentDictionary <Version, JsonSerializer>();
        }
        this.versionSpecificSettings = versionSpecificSettings;
        SagaType            = sagaType;
        this.jsonSerializer = jsonSerializer;
        this.readerCreator  = readerCreator;
        this.writerCreator  = writerCreator;
        this.commandBuilder = new CommandBuilder(sqlVariant);
        CurrentVersion      = sagaDataType.Assembly.GetFileVersion();
        ValidateIsSqlSaga();
        var sqlSagaAttributeData = SqlSagaTypeDataReader.GetTypeData(sagaType);
        var tableSuffix          = nameFilter(sqlSagaAttributeData.TableSuffix);

        switch (sqlVariant)
        {
        case SqlVariant.MsSqlServer:
            TableName     = $"[{schema}].[{tablePrefix}{tableSuffix}]";
            FillParameter = ParameterFiller.Fill;
            break;

        case SqlVariant.MySql:
            TableName     = $"`{tablePrefix}{tableSuffix}`";
            FillParameter = ParameterFiller.Fill;
            break;

        case SqlVariant.Oracle:
            if (tableSuffix.Length > 27)
            {
                throw new Exception($"Saga '{tableSuffix}' contains more than 27 characters, which is not supported by SQL persistence using Oracle. Either disable Oracle script generation using the SqlPersistenceSettings assembly attribute, shorten the name of the saga, or specify an alternate table name by overriding the SqlSaga's TableSuffix property.");
            }
            if (Encoding.UTF8.GetBytes(tableSuffix).Length != tableSuffix.Length)
            {
                throw new Exception($"Saga '{tableSuffix}' contains non-ASCII characters, which is not supported by SQL persistence using Oracle. Either disable Oracle script generation using the SqlPersistenceSettings assembly attribute, change the name of the saga, or specify an alternate table name by overriding the SqlSaga's TableSuffix property.");
            }
            TableName     = tableSuffix.ToUpper();
            FillParameter = ParameterFiller.OracleFill;
            break;

        default:
            throw new Exception($"Unknown SqlVariant: {sqlVariant}.");
        }

        CompleteCommand    = commandBuilder.BuildCompleteCommand(TableName);
        SelectFromCommand  = commandBuilder.BuildSelectFromCommand(TableName);
        GetBySagaIdCommand = commandBuilder.BuildGetBySagaIdCommand(TableName);
        SaveCommand        = commandBuilder.BuildSaveCommand(sqlSagaAttributeData.CorrelationProperty, sqlSagaAttributeData.TransitionalCorrelationProperty, TableName);
        UpdateCommand      = commandBuilder.BuildUpdateCommand(sqlSagaAttributeData.TransitionalCorrelationProperty, TableName);

        CorrelationProperty    = sqlSagaAttributeData.CorrelationProperty;
        HasCorrelationProperty = CorrelationProperty != null;
        if (HasCorrelationProperty)
        {
            GetByCorrelationPropertyCommand = commandBuilder.BuildGetByPropertyCommand(sqlSagaAttributeData.CorrelationProperty, TableName);
        }

        TransitionalCorrelationProperty    = sqlSagaAttributeData.TransitionalCorrelationProperty;
        HasTransitionalCorrelationProperty = TransitionalCorrelationProperty != null;
        if (HasTransitionalCorrelationProperty)
        {
            TransitionalAccessor = sagaDataType.GetPropertyAccessor <IContainSagaData>(TransitionalCorrelationProperty);
        }
    }
 public void JsonSettingsForVersion(RetrieveVersionSpecificJsonSettings builder)
 {
     settings.Set<RetrieveVersionSpecificJsonSettings>(builder);
 }
 /// <summary>
 /// Configure how a specific saga data version will be serialized.
 /// </summary>
 public void JsonSettingsForVersion(RetrieveVersionSpecificJsonSettings builder)
 {
     settings.Set <RetrieveVersionSpecificJsonSettings>(builder);
 }