/// <summary>
        /// Registers the Entity Framework Core stores services in the DI container and
        /// configures BpmNet to use the Entity Framework Core entities by default.
        /// </summary>
        /// <param name="builder">The services builder used by BpmNet to register new services.</param>
        /// <param name="configuration">The configuration delegate used to configure the Entity Framework Core services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="BpmNetCoreBuilder"/>.</returns>
        public static BpmNetCoreBuilder UseEntityFrameworkCore(this BpmNetCoreBuilder builder, Action <BpmNetEntityFrameworkCoreBuilder> configuration)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

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

            configuration(builder.UseEntityFrameworkCore());

            return(builder);
        }
        /// <summary>
        /// Registers the Entity Framework Core stores services in the DI container and
        /// configures BpmNet to use the Entity Framework Core entities by default.
        /// </summary>
        /// <param name="builder">The services builder used by BpmNet to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="BpmNetEntityFrameworkCoreBuilder"/>.</returns>
        public static BpmNetEntityFrameworkCoreBuilder UseEntityFrameworkCore(this BpmNetCoreBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            builder.Services.AddMemoryCache();

            builder.SetDefaultDefinitionEntity <BpmNetDefinition>();
            builder.SetDefaultProcessEntity <BpmNetProcess>();
            builder.SetDefaultProcessInstanceTypeEntity <BpmNetProcessInstance>();
            builder.SetDefaultProcessInstanceFlowTypeEntity <BpmNetInstanceFlow>();
            builder.SetDefaultHistoryFlowTypeEntity <BpmNetHistory>();

            builder.ReplaceStoreResolver <BpmNetStoreResolver>();

            builder.Services.TryAddScoped(typeof(BpmNetDefinitionStore <,>));
            builder.Services.TryAddScoped(typeof(BpmNetProcessStore <,>));
            builder.Services.TryAddScoped(typeof(BpmNetProcessInstanceStore <, ,>));
            builder.Services.TryAddScoped(typeof(BpmNetHistoryStore <,>));

            return(new BpmNetEntityFrameworkCoreBuilder(builder.Services));
        }