示例#1
0
        public static ElsaBuilder AddWorkflowDefinitionStore(this ElsaBuilder configuration)
        {
            configuration.Services
            .AddScoped <IWorkflowDefinitionStore, NetModularWorkflowDefinitionStore>();

            return(configuration);
        }
示例#2
0
 public static YesSqlElsaBuilder AddYesSqlStores(
     this ElsaBuilder configuration,
     Action <IConfiguration> configure)
 {
     return(configuration.AddYesSqlProvider(configure).AddWorkflowDefinitionStore()
            .AddWorkflowInstanceStore());
 }
示例#3
0
 public static ElsaBuilder AddNetModularStores(
     this ElsaBuilder configuration)
 {
     return(configuration
            .AddWorkflowDefinitionStore()
            .AddWorkflowInstanceStore());
 }
        private static ElsaBuilder AddWorkflowsCore(this ElsaBuilder configuration)
        {
            var services = configuration.Services;

            services.TryAddSingleton <IClock>(SystemClock.Instance);

            services
            .AddLogging()
            .AddLocalization()
            .AddTransient <Func <IEnumerable <IActivity> > >(sp => sp.GetServices <IActivity>)
            .AddSingleton <IIdGenerator, IdGenerator>()
            .AddSingleton <IWorkflowSerializer, WorkflowSerializer>()
            .TryAddProvider <ITokenFormatter, JsonTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <ITokenFormatter, YamlTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <ITokenFormatter, XmlTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <IExpressionEvaluator, LiteralEvaluator>(ServiceLifetime.Singleton)
            .AddTransient <IWorkflowFactory, WorkflowFactory>()
            .AddScoped <IActivityInvoker, ActivityInvoker>()
            .AddScoped <IWorkflowExpressionEvaluator, WorkflowExpressionEvaluator>()
            .AddSingleton <IWorkflowSerializerProvider, WorkflowSerializerProvider>()
            .AddTransient <IWorkflowRegistry, WorkflowRegistry>()
            .AddScoped <IWorkflowEventHandler, PersistenceWorkflowEventHandler>()
            .AddScoped <IWorkflowInvoker, WorkflowInvoker>()
            .AddScoped <IActivityResolver, ActivityResolver>()
            .AddScoped <IWorkflowEventHandler, ActivityLoggingWorkflowEventHandler>()
            .AddTransient <IWorkflowProvider, StoreWorkflowProvider>()
            .AddTransient <IWorkflowProvider, CodeWorkflowProvider>()
            .AddTransient <IWorkflowBuilder, WorkflowBuilder>()
            .AddTransient <Func <IWorkflowBuilder> >(sp => sp.GetRequiredService <IWorkflowBuilder>)
            .AddAutoMapperProfile <WorkflowDefinitionProfile>(ServiceLifetime.Singleton)
            .AddPrimitiveActivities();

            return(configuration);
        }
        public static EntityFrameworkCoreElsaBuilder AddEntityFrameworkCoreProvider <TElsaContext>(
            this ElsaBuilder configuration,
            Action <DbContextOptionsBuilder> configureOptions,
            bool usePooling        = true,
            bool autoRunMigrations = false)
            where TElsaContext : ElsaContext
        {
            var services = configuration.Services;

            if (usePooling)
            {
                services.AddDbContextPool <ElsaContext, TElsaContext>(configureOptions);
            }
            else
            {
                services.AddDbContext <ElsaContext, TElsaContext>(configureOptions);
            }

            services
            .AddMapperProfile <NodaTimeProfile>(ServiceLifetime.Singleton)
            .AddMapperProfile <EntitiesProfile>(ServiceLifetime.Singleton);

            if (autoRunMigrations)
            {
                services.AddHostedService <RunMigrations>();
            }

            return(new EntityFrameworkCoreElsaBuilder(configuration.Services));
        }
        private static ElsaBuilder WithElsaDashboard(this ElsaBuilder builder)
        {
            var services = builder.Services;

            services
            .AddSingleton <IIdGenerator, IdGenerator>()
            .AddSingleton <IWorkflowSerializerProvider, WorkflowSerializerProvider>()
            .AddSingleton <IWorkflowSerializer, WorkflowSerializer>()
            .TryAddProvider <ITokenFormatter, JsonTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <ITokenFormatter, YamlTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <ITokenFormatter, XmlTokenFormatter>(ServiceLifetime.Singleton)
            .AddHttpContextAccessor()
            .AddScoped <IWorkflowPublisher, WorkflowPublisher>()
            .AddScoped <INotifier, Notifier>()
            .AddScoped <NotifierFilter>()
            .AddAutoMapperProfile <WorkflowDefinitionProfile>(ServiceLifetime.Singleton);

            services.AddScoped(
                sp =>
            {
                var accessor = sp.GetRequiredService <IHttpContextAccessor>();
                var factory  = sp.GetRequiredService <ITempDataDictionaryFactory>();
                return(factory.GetTempData(accessor.HttpContext));
            }
                );

            services.AddMvcCore(
                mvc => { mvc.Filters.AddService <NotifierFilter>(); }
                );

            return(builder);
        }
        public static CosmosDbElsaBuilder AddCosmosDbProvider(
            this ElsaBuilder builder,
            string url,
            string authSecret,
            string database,
            string collection,
            DocumentDbStorageOptions options = null)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException(nameof(url));
            }
            if (string.IsNullOrEmpty(authSecret))
            {
                throw new ArgumentNullException(nameof(authSecret));
            }

            var storage = new DocumentDbStorage(url, authSecret, database, collection, options);

            builder.Services
            .AddSingleton(storage)
            .AddMapperProfile <NodaTimeProfile>(ServiceLifetime.Singleton)
            .AddMapperProfile <DocumentProfile>(ServiceLifetime.Singleton);

            return(new CosmosDbElsaBuilder(builder.Services));
        }
        public static IServiceCollection AddElsaDashboard(
            this IServiceCollection services,
            Action <OptionsBuilder <ElsaDashboardOptions> > options = default,
            Action <ElsaBuilder> configure = default
            )
        {
            var configuration = new ElsaBuilder(services);

            services.AddControllersWithViews();
            configuration.WithElsaDashboard();
            configure?.Invoke(configuration);

            var optionsBuilder = services.AddOptions <ElsaDashboardOptions>();

            options?.Invoke(optionsBuilder);

            if (options == null)
            {
                optionsBuilder.Configure(x => x.DiscoverActivities());
            }

            services
            .AddTaskExecutingServer()
            .AddTempData();

            services.AddMvcCore(
                mvc => { mvc.Filters.AddService <NotifierFilter>(); }
                );

            return(services);
        }
        public static IServiceCollection AddElsaWorkFlow(this IServiceCollection services, Action <ElsaBuilder> configure = null)
        {
            var configuration = new ElsaBuilder(services);

            services
            .AddTransient <Func <IEnumerable <IActivity> > >(sp => sp.GetServices <IActivity>)
            .AddSingleton <IIdGenerator, ElsaIdGenerator>()
            .AddSingleton <IWorkflowSerializer, WorkflowSerializer>()
            .TryAddProvider <ITokenFormatter, JsonTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <ITokenFormatter, YamlTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <ITokenFormatter, XmlTokenFormatter>(ServiceLifetime.Singleton)
            .TryAddProvider <IExpressionEvaluator, LiteralEvaluator>(ServiceLifetime.Singleton)
            .AddTransient <IWorkflowFactory, WorkflowFactory>()
            .AddScoped <IWorkflowExpressionEvaluator, WorkflowExpressionEvaluator>()
            .AddSingleton <IWorkflowSerializerProvider, WorkflowSerializerProvider>()
            .AddTransient <IWorkflowRegistry, WorkFlowManager>()
            .AddScoped <IWorkflowEventHandler, PersistenceWorkflowEventHandler>()
            .AddScoped <IWorkflowInvoker, WorkFlowInvoker>()
            .AddScoped <IActivityResolver, ActivityResolver>()
            .AddScoped <IWorkflowEventHandler, ActivityLoggingWorkflowEventHandler>()
            .AddTransient <IWorkflowProvider, StoreWorkflowProvider>()
            .AddTransient <IWorkflowProvider, CodeWorkflowProvider>()
            .AddTransient <IWorkflowBuilder, WorkflowBuilder>()
            .AddTransient <Func <IWorkflowBuilder> >(sp => sp.GetRequiredService <IWorkflowBuilder>)
            .AddMapperProfile <WorkflowDefinitionProfile>(ServiceLifetime.Singleton)
            .AddActivity <SetVariable>();
            services.AddMediatR(
                mediatr => mediatr.AsSingleton(),
                typeof(ElsaServiceCollectionExtensions));
            configure?.Invoke(configuration);
            EnsurePersistence(configuration);
            EnsureCaching(configuration);
            return(services);
        }
示例#10
0
        public static ElsaBuilder AddWorkflowInstanceStore(this ElsaBuilder configuration)
        {
            configuration.Services
            .AddScoped <IWorkflowInstanceStore, NetModularWorkflowInstanceStrore>()
            .AddMapperProfile <NodaTimeProfile>(ServiceLifetime.Singleton)
            .AddMapperProfile <EntitiesProfile>(ServiceLifetime.Singleton);

            return(configuration);
        }
        private static void EnsureCaching(ElsaBuilder configuration)
        {
            if (!configuration.HasService <ISignal>())
            {
                configuration.Services.AddSingleton <ISignal, Signal>();
            }

            configuration.Services.AddMemoryCache();
        }
示例#12
0
 public static EntityFrameworkCoreElsaBuilder AddEntityFrameworkStores(
     this ElsaBuilder configuration,
     Action <DbContextOptionsBuilder> configureOptions,
     bool usePooling = true)
 {
     return(configuration
            .AddEntityFrameworkCoreProvider(configureOptions, usePooling)
            .AddWorkflowDefinitionStore()
            .AddWorkflowInstanceStore());
 }
 public static MongoElsaBuilder AddMongoDbStores(
     this ElsaBuilder elsaBuilder,
     IConfiguration configuration,
     string databaseName,
     string connectionStringName)
 {
     return(elsaBuilder
            .AddMongoDbProvider(configuration, databaseName, connectionStringName)
            .AddMongoDbWorkflowDefinitionStore()
            .AddMongoDbWorkflowInstanceStore());
 }
        private static void EnsurePersistence(ElsaBuilder configuration)
        {
            var hasDefinitionStore = configuration.HasService <IWorkflowDefinitionStore>();
            var hasInstanceStore   = configuration.HasService <IWorkflowInstanceStore>();

            if (!hasDefinitionStore || !hasInstanceStore)
            {
                configuration.WithMemoryStores();
            }

            configuration.Services.Decorate <IWorkflowDefinitionStore, PublishingWorkflowDefinitionStore>();
        }
        public static IServiceCollection AddElsaCore(
            this IServiceCollection services,
            Action <ElsaBuilder> configure = null)
        {
            var configuration = new ElsaBuilder(services);

            configuration.AddWorkflowsCore();
            configuration.AddMediatR();
            configure?.Invoke(configuration);
            EnsurePersistence(configuration);
            EnsureCaching(configuration);

            return(services);
        }
示例#16
0
        public static YesSqlElsaBuilder AddYesSqlProvider(
            this ElsaBuilder configuration,
            Action <IConfiguration> configure)
        {
            configuration.Services
            .AddSingleton(sp => StoreFactory.CreateStore(sp, configure))
            .AddSingleton <IIndexProvider, WorkflowDefinitionIndexProvider>()
            .AddSingleton <IIndexProvider, WorkflowInstanceIndexProvider>()
            .AddScoped(CreateSession)
            .AddAutoMapperProfile <InstantProfile>(ServiceLifetime.Singleton)
            .AddAutoMapperProfile <DocumentProfile>(ServiceLifetime.Singleton)
            .AddStartupTask <InitializeStoreTask>();

            return(new YesSqlElsaBuilder(configuration.Services));
        }
        public static EntityFrameworkCoreElsaBuilder AddCustomSchema(this ElsaBuilder configuration, string schema, string migrationHistoryTableName = null)
        {
            EntityFrameworkCoreElsaBuilder frameworkCoreElsaBuilder = new EntityFrameworkCoreElsaBuilder(configuration.Services);

            if (string.IsNullOrWhiteSpace(schema))
            {
                return(frameworkCoreElsaBuilder);
            }
            DbContextCustomSchema dbContextCustomSchema = new DbContextCustomSchema(schema,
                                                                                    !string.IsNullOrWhiteSpace(migrationHistoryTableName) ? migrationHistoryTableName : DbContextCustomSchema.DefaultMigrationsHistoryTableName);

            configuration.Services.AddSingleton <IDbContextCustomSchema>(dbContextCustomSchema);

            return(frameworkCoreElsaBuilder);
        }
        public static CosmosDbElsaBuilder AddCosmosDbProvider(
            this ElsaBuilder builder,
            Action <OptionsBuilder <DocumentDbStorageOptions> > options)
        {
            options?.Invoke(builder.Services.AddOptions <DocumentDbStorageOptions>());

            builder.Services
            .AddSingleton <IDocumentDbStorage, DocumentDbStorage>()
            .AddSingleton <IWorkflowInstanceStore, CosmosDbWorkflowInstanceStore>()
            .AddSingleton <IWorkflowDefinitionStore, CosmosDbWorkflowDefinitionStore>()
            .AddMapperProfile <NodaTimeProfile>(ServiceLifetime.Singleton)
            .AddMapperProfile <DocumentProfile>(ServiceLifetime.Singleton);

            return(new CosmosDbElsaBuilder(builder.Services));
        }
示例#19
0
        public static CosmosDbElsaBuilder AddCosmosDbProvider <T>(this ElsaBuilder builder, Type cosmosDBStoreHelperType,
                                                                  Action <OptionsBuilder <DocumentDbStorageOptions> > options) where T : class, ITenantProvider
        {
            options?.Invoke(builder.Services.AddOptions <DocumentDbStorageOptions>());

            builder.Services
            .AddSingleton <IDocumentDbStorage, DocumentDbStorage>()
            .AddSingleton <IWorkflowInstanceStore, CosmosDbWorkflowInstanceStore>()
            .AddSingleton <IWorkflowDefinitionStore, CosmosDbWorkflowDefinitionStore>()
            .AddMapperProfile <NodaTimeProfile>(ServiceLifetime.Singleton)
            .AddMapperProfile <DocumentProfile>(ServiceLifetime.Singleton)
            .AddTransient <ITenantProvider, T>()
            .AddTransient(typeof(ICosmosDbStoreHelper <>), cosmosDBStoreHelperType);

            return(new CosmosDbElsaBuilder(builder.Services));
        }
        public static MongoElsaBuilder AddMongoDbProvider(
            this ElsaBuilder elsaBuilder,
            IConfiguration configuration,
            string databaseName,
            string connectionStringName
            )
        {
            NodaTimeSerializers.Register();
            RegisterEnumAsStringConvention();
            BsonSerializer.RegisterSerializer(new JObjectSerializer());
            BsonSerializer.RegisterSerializer(new WorkflowExecutionScopeSerializer());

            elsaBuilder.Services
            .AddSingleton(sp => CreateDbClient(configuration, connectionStringName))
            .AddSingleton(sp => CreateDatabase(sp, databaseName));

            return(new MongoElsaBuilder(elsaBuilder.Services));
        }
示例#21
0
        public static EntityFrameworkCoreElsaBuilder AddEntityFrameworkCoreProvider(
            this ElsaBuilder configuration,
            Action <DbContextOptionsBuilder> configureOptions,
            bool usePooling = true)
        {
            var services = configuration.Services;

            if (usePooling)
            {
                services.AddDbContextPool <ElsaContext>(configureOptions);
            }
            else
            {
                services.AddDbContext <ElsaContext>(configureOptions);
            }

            services
            .AddAutoMapperProfile <InstantProfile>(ServiceLifetime.Singleton)
            .AddAutoMapperProfile <DocumentProfile>(ServiceLifetime.Singleton);

            return(new EntityFrameworkCoreElsaBuilder(configuration.Services));
        }
示例#22
0
        public ElsaContext CreateDbContext(string[] args)
        {
            // Migrations added to Sample23.CustomMigration with the following Powershell command
            // Add-Migration InitialCreate -context ElsaContext -Project Sample23.CustomMigration
            var         services    = new ServiceCollection();
            ElsaBuilder elsaBuilder = new ElsaBuilder(services);

            elsaBuilder.AddCustomSchema("elsa");

            var optionsBuilder = new DbContextOptionsBuilder <ElsaContext>();

            optionsBuilder.UseSqlite(
                @"Data Source=c:\data\elsa.entity-framework-core.db;Cache=Shared",
                x =>
            {
                x.AddCustomSchemaModelSupport(optionsBuilder, elsaBuilder.Services);
                x.MigrationsAssembly(typeof(Program).Assembly.FullName);
                x.MigrationsHistoryTableWithSchema(optionsBuilder);
            });

            return(new ElsaContext(optionsBuilder.Options));
        }
 public static MemoryStoreElsaBuilder WithMemoryStores(this ElsaBuilder configuration)
 {
     return(configuration.WithMemoryProvider().WithWorkflowDefinitionStore().WithWorkflowInstanceStore());
 }
示例#24
0
 public static CosmosDbElsaBuilder AddCosmosDbProvider(this ElsaBuilder builder,
                                                       Action <OptionsBuilder <DocumentDbStorageOptions> > options)
 {
     return(builder.AddCosmosDbProvider <TenantProvider>(options));
 }
示例#25
0
 public static CosmosDbElsaBuilder AddCosmosDbProvider <T>(this ElsaBuilder builder,
                                                           Action <OptionsBuilder <DocumentDbStorageOptions> > options) where T : class, ITenantProvider
 {
     return(builder.AddCosmosDbProvider <T>(typeof(CosmosDbStoreHelper <>), options));
 }
 public static MemoryStoreElsaBuilder WithMemoryProvider(this ElsaBuilder configuration)
 {
     return(new MemoryStoreElsaBuilder(configuration.Services));
 }
 public static bool HasService <T>(this ElsaBuilder configuration) =>
 configuration.Services.HasService <T>();
 private static IServiceCollection AddMediatR(this ElsaBuilder configuration)
 {
     return(configuration.Services.AddMediatR(
                mediatr => mediatr.AsSingleton(),
                typeof(ElsaServiceCollectionExtensions)));
 }