Wrap workflow definition store with workflow definition manager

This commit is contained in:
Sipke Schoorstra 2020-12-11 22:02:43 +01:00
parent 2528364531
commit 2bc141a464
13 changed files with 117 additions and 109 deletions

View file

@ -3,4 +3,5 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=node_005Fmodules/@EntryIndexedValue">ExplicitlyExcluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=src_005Cweb_005Cmodules_005CFlowsharp_002EWeb_002EViewComponents_005CClientApp_005Cnode_005Fmodules/@EntryIndexedValue"></s:String>
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=src_005Cweb_005Cmodules_005CFlowsharp_002EWeb_002EViewComponents_005CClientApp_005Cnode_005Fmodules/@EntryIndexRemoved">True</s:Boolean>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=src_005Cweb_005Cmodules_005CFlowsharp_002EWeb_002EViewComponents_005CAssets_005Cnode_005Fmodules/@EntryIndexedValue">ExplicitlyExcluded</s:String></wpf:ResourceDictionary>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=src_005Cweb_005Cmodules_005CFlowsharp_002EWeb_002EViewComponents_005CAssets_005Cnode_005Fmodules/@EntryIndexedValue">ExplicitlyExcluded</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Materializer/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View file

@ -13,6 +13,5 @@ namespace Elsa.Persistence
Task<IEnumerable<WorkflowDefinition>> ListAsync(int? skip = default, int? take = default, VersionOptions? version = default, CancellationToken cancellationToken = default);
Task<WorkflowDefinition> GetAsync(string workflowDefinitionId, VersionOptions version, CancellationToken cancellationToken = default);
Task<WorkflowDefinition> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default);
WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition);
}
}

View file

@ -0,0 +1,19 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Models;
using Elsa.Persistence;
namespace Elsa.Services
{
public interface IWorkflowDefinitionManager
{
IWorkflowDefinitionStore Store { get; }
Task SaveAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default);
Task DeleteAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default);
Task<int> CountAsync(VersionOptions? version = default, CancellationToken cancellationToken = default);
Task<IEnumerable<WorkflowDefinition>> ListAsync(int? skip = default, int? take = default, VersionOptions? version = default, CancellationToken cancellationToken = default);
Task<WorkflowDefinition?> GetAsync(string workflowDefinitionId, VersionOptions version, CancellationToken cancellationToken = default);
Task<WorkflowDefinition?> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default);
}
}

View file

@ -88,6 +88,7 @@ namespace Microsoft.Extensions.DependencyInjection
.AddScoped<IExpressionEvaluator, ExpressionEvaluator>()
.AddScoped<IWorkflowRegistry, WorkflowRegistry>()
.AddScoped<IWorkflowInstanceManager, WorkflowInstanceManager>()
.AddScoped<IWorkflowDefinitionManager, WorkflowDefinitionManager>()
.AddSingleton<IActivityActivator, ActivityActivator>()
.AddScoped<IWorkflowRunner, WorkflowRunner>()
.AddScoped<IWorkflowTriggerInterruptor, WorkflowTriggerInterruptor>()

View file

@ -0,0 +1,50 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Models;
using Elsa.Persistence;
namespace Elsa.Services
{
public class WorkflowDefinitionManager : IWorkflowDefinitionManager
{
private readonly IIdGenerator _idGenerator;
public WorkflowDefinitionManager(IWorkflowDefinitionStore store, IIdGenerator idGenerator)
{
_idGenerator = idGenerator;
Store = store;
}
public IWorkflowDefinitionStore Store { get; }
public async Task SaveAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default)
{
workflowDefinition = Initialize(workflowDefinition);
await Store.SaveAsync(workflowDefinition, cancellationToken);
}
public Task DeleteAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default) => Store.DeleteAsync(workflowDefinition, cancellationToken);
public Task<int> CountAsync(VersionOptions? version = default, CancellationToken cancellationToken = default) => Store.CountAsync(version, cancellationToken);
public Task<IEnumerable<WorkflowDefinition>> ListAsync(int? skip = default, int? take = default, VersionOptions? version = default, CancellationToken cancellationToken = default) =>
Store.ListAsync(skip, take, version, cancellationToken);
public async Task<WorkflowDefinition?> GetAsync(string workflowDefinitionId, VersionOptions version, CancellationToken cancellationToken = default) => await Store.GetAsync(workflowDefinitionId, version, cancellationToken);
public async Task<WorkflowDefinition?> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) => await Store.GetByVersionIdAsync(workflowDefinitionVersionId, cancellationToken);
public WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition)
{
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionId))
workflowDefinition.WorkflowDefinitionId = _idGenerator.Generate();
if (workflowDefinition.Version == 0)
workflowDefinition.Version = 1;
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionVersionId))
workflowDefinition.WorkflowDefinitionVersionId = _idGenerator.Generate();
return workflowDefinition;
}
}
}

View file

@ -8,13 +8,13 @@ namespace Elsa.Services
{
public class WorkflowPublisher : IWorkflowPublisher
{
private readonly IWorkflowDefinitionStore _workflowDefinitionStore;
private readonly IWorkflowDefinitionManager _workflowDefinitionManager;
private readonly IIdGenerator _idGenerator;
private readonly ICloner _cloner;
public WorkflowPublisher(IWorkflowDefinitionStore workflowDefinitionStore, IIdGenerator idGenerator, ICloner cloner)
public WorkflowPublisher(IWorkflowDefinitionManager workflowDefinitionManager, IIdGenerator idGenerator, ICloner cloner)
{
_workflowDefinitionStore = workflowDefinitionStore;
_workflowDefinitionManager = workflowDefinitionManager;
_idGenerator = idGenerator;
_cloner = cloner;
}
@ -40,7 +40,7 @@ namespace Elsa.Services
string workflowDefinitionId,
CancellationToken cancellationToken)
{
var definition = await _workflowDefinitionStore.GetAsync(
var definition = await _workflowDefinitionManager.GetAsync(
workflowDefinitionId,
VersionOptions.Latest,
cancellationToken);
@ -53,7 +53,7 @@ namespace Elsa.Services
public async Task<WorkflowDefinition> PublishAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken)
{
var publishedDefinition = await _workflowDefinitionStore.GetAsync(
var publishedDefinition = await _workflowDefinitionManager.GetAsync(
workflowDefinition.WorkflowDefinitionId,
VersionOptions.Published,
cancellationToken);
@ -62,7 +62,7 @@ namespace Elsa.Services
{
publishedDefinition.IsPublished = false;
publishedDefinition.IsLatest = false;
await _workflowDefinitionStore.SaveAsync(publishedDefinition, cancellationToken);
await _workflowDefinitionManager.SaveAsync(publishedDefinition, cancellationToken);
}
if (workflowDefinition.IsPublished)
@ -77,14 +77,14 @@ namespace Elsa.Services
workflowDefinition.IsLatest = true;
workflowDefinition = Initialize(workflowDefinition);
await _workflowDefinitionStore.SaveAsync(workflowDefinition, cancellationToken);
await _workflowDefinitionManager.SaveAsync(workflowDefinition, cancellationToken);
return workflowDefinition;
}
public async Task<WorkflowDefinition?> GetDraftAsync(string workflowDefinitionId, CancellationToken cancellationToken)
{
var definition = await _workflowDefinitionStore.GetAsync(
var definition = await _workflowDefinitionManager.GetAsync(
workflowDefinitionId,
VersionOptions.Latest,
cancellationToken);
@ -109,7 +109,7 @@ namespace Elsa.Services
{
var draft = workflowDefinition;
var latestVersion = await _workflowDefinitionStore.GetAsync(
var latestVersion = await _workflowDefinitionManager.GetAsync(
workflowDefinition.WorkflowDefinitionId,
VersionOptions.Latest,
cancellationToken);
@ -118,14 +118,14 @@ namespace Elsa.Services
{
latestVersion.IsLatest = false;
await _workflowDefinitionStore.SaveAsync(latestVersion, cancellationToken);
await _workflowDefinitionManager.SaveAsync(latestVersion, cancellationToken);
}
draft.IsLatest = true;
draft.IsPublished = false;
draft = Initialize(draft);
await _workflowDefinitionStore.SaveAsync(draft, cancellationToken);
await _workflowDefinitionManager.SaveAsync(draft, cancellationToken);
return draft;
}

View file

@ -13,18 +13,18 @@ namespace Elsa.WorkflowProviders
/// </summary>
public class DatabaseWorkflowProvider : WorkflowProvider
{
private readonly IWorkflowDefinitionStore _workflowDefinitionStore;
private readonly IWorkflowDefinitionManager _workflowDefinitionManager;
private readonly IWorkflowBlueprintMaterializer _workflowBlueprintMaterializer;
public DatabaseWorkflowProvider(IWorkflowDefinitionStore workflowDefinitionStore, IWorkflowBlueprintMaterializer workflowBlueprintMaterializer)
public DatabaseWorkflowProvider(IWorkflowDefinitionManager workflowDefinitionManager, IWorkflowBlueprintMaterializer workflowBlueprintMaterializer)
{
_workflowDefinitionStore = workflowDefinitionStore;
_workflowDefinitionManager = workflowDefinitionManager;
_workflowBlueprintMaterializer = workflowBlueprintMaterializer;
}
protected override async ValueTask<IEnumerable<IWorkflowBlueprint>> OnGetWorkflowsAsync(CancellationToken cancellationToken)
{
var workflowDefinitions = await _workflowDefinitionStore.ListAsync(cancellationToken: cancellationToken);
var workflowDefinitions = await _workflowDefinitionManager.ListAsync(cancellationToken: cancellationToken);
return workflowDefinitions.Select(_workflowBlueprintMaterializer.CreateWorkflowBlueprint);
}
}

View file

@ -3,19 +3,12 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Models;
using Elsa.Services;
namespace Elsa.Persistence.InMemory
{
public class InMemoryWorkflowDefinitionStore : IWorkflowDefinitionStore
{
private static readonly List<WorkflowDefinition> Definitions = new();
private readonly IIdGenerator _idGenerator;
public InMemoryWorkflowDefinitionStore(IIdGenerator idGenerator)
{
_idGenerator = idGenerator;
}
public Task<int> CountAsync(VersionOptions? version = null, CancellationToken cancellationToken = default) => Task.FromResult(Definitions.WithVersion(version).Count());
@ -31,20 +24,6 @@ namespace Elsa.Persistence.InMemory
public Task<WorkflowDefinition> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) =>
Task.FromResult(Definitions.FirstOrDefault(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId));
public WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition)
{
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionId))
workflowDefinition.WorkflowDefinitionId = _idGenerator.Generate();
if (workflowDefinition.Version == 0)
workflowDefinition.Version = 1;
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionVersionId))
workflowDefinition.WorkflowDefinitionVersionId = _idGenerator.Generate();
return workflowDefinition;
}
public Task<IEnumerable<WorkflowDefinition>> ListAsync(int? skip = null, int? take = null, VersionOptions? version = null, CancellationToken cancellationToken = default)
{
var query = Definitions.WithVersion();
@ -57,7 +36,6 @@ namespace Elsa.Persistence.InMemory
public Task SaveAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default)
{
workflowDefinition = Initialize(workflowDefinition);
Definitions.Add(workflowDefinition);
return Task.CompletedTask;
}

View file

@ -12,19 +12,14 @@ namespace Elsa.Persistence.MongoDb
public class MongoDbWorkflowDefinitionStore : IWorkflowDefinitionStore
{
private readonly IMongoCollection<WorkflowDefinition> _workflowDefinitions;
private readonly IIdGenerator _idGenerator;
public MongoDbWorkflowDefinitionStore(IMongoCollection<WorkflowDefinition> workflowDefinitions, IIdGenerator idGenerator)
public MongoDbWorkflowDefinitionStore(IMongoCollection<WorkflowDefinition> workflowDefinitions)
{
_workflowDefinitions = workflowDefinitions;
_idGenerator = idGenerator;
}
public async Task<int> CountAsync(VersionOptions? version = null, CancellationToken cancellationToken = default)
{
return await ((IMongoQueryable<WorkflowDefinition>) _workflowDefinitions.AsQueryable().WithVersion(version)).CountAsync(cancellationToken: cancellationToken);
}
public async Task<int> CountAsync(VersionOptions? version = null, CancellationToken cancellationToken = default) =>
await ((IMongoQueryable<WorkflowDefinition>) _workflowDefinitions.AsQueryable().WithVersion(version)).CountAsync(cancellationToken);
public async Task DeleteAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default)
{
@ -32,35 +27,18 @@ namespace Elsa.Persistence.MongoDb
await _workflowDefinitions.DeleteOneAsync(filter, cancellationToken);
}
public async Task<WorkflowDefinition> GetAsync(string workflowDefinitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default)
{
return await ((IMongoQueryable<WorkflowDefinition>) _workflowDefinitions
public async Task<WorkflowDefinition> GetAsync(string workflowDefinitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) =>
await ((IMongoQueryable<WorkflowDefinition>) _workflowDefinitions
.AsQueryable()
.Where(x => x.WorkflowDefinitionId == workflowDefinitionId)
.WithVersion(versionOptions)).FirstOrDefaultAsync(cancellationToken: cancellationToken);
}
.WithVersion(versionOptions)).FirstOrDefaultAsync(cancellationToken);
public async Task<WorkflowDefinition> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default)
{
return await _workflowDefinitions
public async Task<WorkflowDefinition> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) =>
await _workflowDefinitions
.AsQueryable()
.Where(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId).FirstOrDefaultAsync(cancellationToken: cancellationToken);
}
public WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition)
{
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionId))
workflowDefinition.WorkflowDefinitionId = _idGenerator.Generate();
if (workflowDefinition.Version == 0)
workflowDefinition.Version = 1;
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionVersionId))
workflowDefinition.WorkflowDefinitionVersionId = _idGenerator.Generate();
return workflowDefinition;
}
.Where(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId)
.FirstOrDefaultAsync(cancellationToken);
public async Task<IEnumerable<WorkflowDefinition>> ListAsync(int? skip = null, int? take = null, VersionOptions? version = null, CancellationToken cancellationToken = default)
{
var query = _workflowDefinitions

View file

@ -14,17 +14,14 @@ namespace Elsa.Persistence.YesSql
public class YesSqlWorkflowDefinitionStore : IWorkflowDefinitionStore
{
private readonly ISession _session;
private readonly Elsa.Services.IIdGenerator _idGenerator;
public YesSqlWorkflowDefinitionStore(ISession session, Elsa.Services.IIdGenerator idGenerator)
public YesSqlWorkflowDefinitionStore(ISession session)
{
_session = session;
_idGenerator = idGenerator;
}
public Task SaveAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default)
{
workflowDefinition = Initialize(workflowDefinition);
_session.Save(workflowDefinition, CollectionNames.WorkflowDefinitions);
return Task.CompletedTask;
}
@ -55,33 +52,16 @@ namespace Elsa.Persistence.YesSql
public IQuery<WorkflowDefinition> Query() => _session.Query<WorkflowDefinition>(CollectionNames.WorkflowDefinitions);
public IQuery<WorkflowDefinition, TIndex> Query<TIndex>(Expression<Func<TIndex, bool>> predicate) where TIndex : class, IIndex => _session.Query<WorkflowDefinition, TIndex>(predicate, CollectionNames.WorkflowDefinitions);
public WorkflowDefinition Initialize(WorkflowDefinition workflowDefinition)
{
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionId))
workflowDefinition.WorkflowDefinitionId = _idGenerator.Generate();
if (workflowDefinition.Version == 0)
workflowDefinition.Version = 1;
if (string.IsNullOrWhiteSpace(workflowDefinition.WorkflowDefinitionVersionId))
workflowDefinition.WorkflowDefinitionVersionId = _idGenerator.Generate();
return workflowDefinition;
}
public Task<WorkflowDefinition> GetAsync(string workflowDefinitionId, VersionOptions version, CancellationToken cancellationToken = default)
{
var query = Query<WorkflowDefinitionIndex>(x => x.WorkflowDefinitionId == workflowDefinitionId);
return WithVersion(query, version).FirstOrDefaultAsync();
}
public Task<WorkflowDefinition> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default)
{
return Query<WorkflowDefinitionIndex>(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId).FirstOrDefaultAsync();
}
public Task<WorkflowDefinition> GetByVersionIdAsync(string workflowDefinitionVersionId, CancellationToken cancellationToken = default) => Query<WorkflowDefinitionIndex>(x => x.WorkflowDefinitionVersionId == workflowDefinitionVersionId).FirstOrDefaultAsync();
private IQuery<WorkflowDefinition> WithVersion(IQuery<WorkflowDefinition> query,
private static IQuery<WorkflowDefinition> WithVersion(
IQuery<WorkflowDefinition> query,
VersionOptions version)
{
var index = query.With<WorkflowDefinitionIndex>();

View file

@ -20,12 +20,12 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions
[Produces("application/json")]
public class GetByDefinitionAndVersion : Controller
{
private readonly IWorkflowDefinitionStore _workflowDefinitionStore;
private readonly IWorkflowDefinitionManager _workflowDefinitionManager;
private readonly IContentSerializer _serializer;
public GetByDefinitionAndVersion(IWorkflowDefinitionStore workflowDefinitionStore, IContentSerializer serializer)
public GetByDefinitionAndVersion(IWorkflowDefinitionManager workflowDefinitionManager, IContentSerializer serializer)
{
_workflowDefinitionStore = workflowDefinitionStore;
_workflowDefinitionManager = workflowDefinitionManager;
_serializer = serializer;
}
@ -41,7 +41,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions
]
public async Task<IActionResult> Handle(string workflowDefinitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default)
{
var workflowDefinition = await _workflowDefinitionStore.GetAsync(workflowDefinitionId, versionOptions, cancellationToken);
var workflowDefinition = await _workflowDefinitionManager.GetAsync(workflowDefinitionId, versionOptions, cancellationToken);
return workflowDefinition == null ? (IActionResult) NotFound() : Json(workflowDefinition, _serializer.GetSettings());
}
}

View file

@ -4,6 +4,7 @@ using Elsa.Models;
using Elsa.Persistence;
using Elsa.Serialization;
using Elsa.Server.Api.Swagger.Examples;
using Elsa.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
@ -17,12 +18,12 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions
[Produces("application/json")]
public class GetByVersionId : Controller
{
private readonly IWorkflowDefinitionStore _workflowDefinitionStore;
private readonly IWorkflowDefinitionManager _workflowDefinitionManager;
private readonly IContentSerializer _serializer;
public GetByVersionId(IWorkflowDefinitionStore workflowDefinitionStore, IContentSerializer serializer)
public GetByVersionId(IWorkflowDefinitionManager workflowDefinitionManager, IContentSerializer serializer)
{
_workflowDefinitionStore = workflowDefinitionStore;
_workflowDefinitionManager = workflowDefinitionManager;
_serializer = serializer;
}
@ -38,7 +39,7 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions
]
public async Task<IActionResult> Handle(string workflowDefinitionVersionId, CancellationToken cancellationToken = default)
{
var workflowDefinition = await _workflowDefinitionStore.GetByVersionIdAsync(workflowDefinitionVersionId, cancellationToken);
var workflowDefinition = await _workflowDefinitionManager.GetByVersionIdAsync(workflowDefinitionVersionId, cancellationToken);
return workflowDefinition == null ? (IActionResult) NotFound() : Json(workflowDefinition, _serializer.GetSettings());
}
}

View file

@ -6,6 +6,7 @@ using Elsa.Persistence;
using Elsa.Serialization;
using Elsa.Server.Api.Models;
using Elsa.Server.Api.Swagger.Examples;
using Elsa.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
@ -19,12 +20,12 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions
[Produces("application/json")]
public class List : Controller
{
private readonly IWorkflowDefinitionStore _workflowDefinitionStore;
private readonly IWorkflowDefinitionManager _workflowDefinitionManager;
private readonly IContentSerializer _serializer;
public List(IWorkflowDefinitionStore workflowDefinitionStore, IContentSerializer serializer)
public List(IWorkflowDefinitionManager workflowDefinitionManager, IContentSerializer serializer)
{
_workflowDefinitionStore = workflowDefinitionStore;
_workflowDefinitionManager = workflowDefinitionManager;
_serializer = serializer;
}
@ -40,9 +41,9 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions
public async Task<ActionResult<PagedList<WorkflowDefinition>>> Handle(int? page = default, int? pageSize = default, VersionOptions? version = default, CancellationToken cancellationToken = default)
{
version ??= VersionOptions.Latest;
var totalCount = await _workflowDefinitionStore.CountAsync(version, cancellationToken);
var totalCount = await _workflowDefinitionManager.CountAsync(version, cancellationToken);
var skip = page * pageSize;
var items = await _workflowDefinitionStore.ListAsync(skip, pageSize, version, cancellationToken);
var items = await _workflowDefinitionManager.ListAsync(skip, pageSize, version, cancellationToken);
var pagedList = new PagedList<WorkflowDefinition>(items.ToList(), page, pageSize, totalCount);
return Json(pagedList, _serializer.GetSettings());