/// <summary>
        /// Configure DynamoDb saga repository
        /// </summary>
        /// <param name="services"></param>
        /// <param name="configure"></param>
        public static void AddDynamoDbEventStore <TSaga>(this IServiceCollection services, Action <DynamoDbEventStoreOptions> configure = null) where TSaga : class, IEventSourcedSaga
        {
            var options = new DynamoDbEventStoreOptions();

            configure?.Invoke(options);

            var name = typeof(TSaga).Name;

            if (options.StoreName is null)
            {
                options.StoreName = $"MassTransist.DynamoDbIntegration.{name}";
            }

            services.AddSingleton(options);
            var provider = services.BuildServiceProvider();

            var knownEventTypes = provider.GetService <KnownEventTypes>();

            if (knownEventTypes is null)
            {
                throw new InvalidOperationException("Known events types should be registered before register saga repository. Consider use RegisterKnownEventsTypes(params Type[] knownEvetTypes)");
            }

            services.AddAWSService <IAmazonDynamoDB>(options);

            services.AddSingleton <IDynamoDbEventStoreDatabaseContext, DynamoDbEventStoreDatabaseContext>();
            services.AddAsyncInitializer <DynamoDbEventStoreDatabaseContextInitializer>();

            var client     = services.BuildServiceProvider().GetService <IAmazonDynamoDB>();
            var repository = new DynamoDbSagaRepository <TSaga>(new DynamoDBContext(client), options, knownEventTypes);

            services.AddSingleton <DynamoDbSagaRepository <TSaga> >(repository);
        }
Example #2
0
        public V2DynamoDbSagaRepository(IDynamoDBContext connection, DynamoDbEventStoreOptions options, KnownEventTypes knownTypes)
        {
            _connection = connection ?? throw new ArgumentNullException(nameof(connection));
            _options    = options ?? throw new ArgumentNullException(nameof(options));
            _knownTypes = knownTypes ?? throw new ArgumentNullException(nameof(knownTypes));

            if (TypeMapping.GetTypeName(typeof(V2EventSourcedSagaInstance.SagaInstanceTransitioned)).Contains("+"))
            {
                TypeMapping.Add <V2EventSourcedSagaInstance.SagaInstanceTransitioned>("SagaInstanceTransitioned");
            }
        }
Example #3
0
        public DynamoDbEventStoreFixture()
        {
            var amazonDynamoDbConfig = new AmazonDynamoDBConfig {
                ServiceURL = "http://localhost:8000"
            };
            var client = new AmazonDynamoDBClient("root", "secret", amazonDynamoDbConfig);

            Options = new DynamoDbEventStoreOptions {
                StoreName = Guid.NewGuid().ToString()
            };
            var context = new DynamoDbEventStoreDatabaseContext(client, Options);

            context.ConfigureAsync().ConfigureAwait(false).GetAwaiter().GetResult();
            Connection      = new DynamoDBContext(client);
            OperationConfig = new DynamoDBOperationConfig {
                OverrideTableName = Options.StoreName, Conversion = DynamoDBEntryConversion.V2
            };
        }
Example #4
0
        public DynamoDbSagaRepository(IDynamoDBContext connection, DynamoDbEventStoreOptions options, KnownEventTypes knownTypes)
        {
            _connection = connection ?? throw new ArgumentNullException(nameof(connection));
            _knownTypes = knownTypes ?? throw new ArgumentNullException(nameof(knownTypes));

            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            _configuration = new DynamoDBOperationConfig {
                OverrideTableName = options.StoreName, Conversion = DynamoDBEntryConversion.V2
            };

            if (TypeMapping.GetTypeName(typeof(EventSourcedSagaInstance.SagaInstanceTransitioned)).Contains("+"))
            {
                TypeMapping.Add <EventSourcedSagaInstance.SagaInstanceTransitioned>("SagaInstanceTransitioned");
            }
        }
Example #5
0
 public MissingPipe(IDynamoDBContext connection, DynamoDbEventStoreOptions options, IPipe <SagaConsumeContext <TSaga, TMessage> > next)
 {
     _connection = connection ?? throw new ArgumentNullException(nameof(connection));
     _options    = options ?? throw new ArgumentNullException(nameof(options));
     _next       = next ?? throw new ArgumentNullException(nameof(next));
 }
 public V2DynamoDbEventStoreSagaConsumeContext(IDynamoDBContext connection, ConsumeContext <TMessage> context, TSaga instance, DynamoDbEventStoreOptions options) : base(context)
 {
     Saga        = instance;
     _connection = connection;
     _options    = options;
 }