Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ Chronicle is simple **process manager/saga pattern** implementation for .NET Cor
Chornicle is available on [NuGet](https://www.nuget.org/packages/Chronicle_/)
### Package manager
```bash
Install-Package Chronicle_ -Version 3.1.0
Install-Package Chronicle_ -Version 3.2.1
```

### .NET CLI
```bash
dotnet add package Chronicle_ --version 3.1.0
dotnet add package Chronicle_ --version 3.2.1
```

# Getting started
Expand Down
2 changes: 0 additions & 2 deletions src/Chronicle/Builders/ChronicleBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;
using Chronicle.Errors;
using Chronicle.Persistence;
using Microsoft.Extensions.DependencyInjection;

Expand Down
8 changes: 4 additions & 4 deletions src/Chronicle/Chronicle.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
<PackageProjectUrl>https://github.com/chronicle-stack/Chronicle</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/chronicle-stack/Chronicle/blob/master/LICENSE</PackageLicenseUrl>
<PackageIconUrl>https://avatars1.githubusercontent.com/u/42150754?s=200</PackageIconUrl>
<VersionPrefix>3.1.0</VersionPrefix>
<Version>3.1.0</Version>
<AssemblyVersion>3.1.0.0</AssemblyVersion>
<FileVersion>3.1.0.0</FileVersion>
<VersionPrefix>3.2.1</VersionPrefix>
<Version>3.2.1</Version>
<AssemblyVersion>3.2.1.0</AssemblyVersion>
<FileVersion>3.2.1.0</FileVersion>
<LangVersion>latest</LangVersion>
</PropertyGroup>

Expand Down
6 changes: 4 additions & 2 deletions src/Chronicle/ChronicleException.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
using System;
using System.Diagnostics.Tracing;

namespace Chronicle
{
public class ChronicleException : Exception
{
public ChronicleException(string message) : base(message)
{

}

public ChronicleException(string message, Exception innerException) : base(message, innerException)
{
}
}
}
4 changes: 2 additions & 2 deletions src/Chronicle/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@ public static IServiceCollection AddChronicle(this IServiceCollection services,
private static void RegisterSagas(this IServiceCollection services)
=> services.Scan(scan =>
{
var assembly = Assembly.GetEntryAssembly();
var assemblies = AppDomain.CurrentDomain.GetAssemblies();

scan
.FromAssemblies(assembly)
.FromAssemblies(assemblies)
.AddClasses(classes => classes.AssignableTo(typeof(ISaga)))
.As(t => t
.GetTypeInfo()
Expand Down
1 change: 0 additions & 1 deletion src/Chronicle/IChronicleBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using Microsoft.Extensions.DependencyInjection;

namespace Chronicle
Expand Down
5 changes: 3 additions & 2 deletions src/Chronicle/ISaga.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using System.Threading.Tasks;

namespace Chronicle
Expand All @@ -8,8 +9,8 @@ public interface ISaga
SagaStates State { get; }
void Complete();
Task CompleteAsync();
void Reject();
Task RejectAsync();
void Reject(Exception innerException = null);
Task RejectAsync(Exception innerException = null);
void Initialize(SagaId id, SagaStates state);
SagaId ResolveId(object message, ISagaContext context);
}
Expand Down
24 changes: 9 additions & 15 deletions src/Chronicle/Managers/SagaCoordinator.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Chronicle.Async;
using Chronicle.Persistence;
using Chronicle.Utils;

namespace Chronicle.Managers
{
Expand All @@ -17,7 +13,7 @@ internal sealed class SagaCoordinator : ISagaCoordinator
private readonly ISagaPostProcessor _postProcessor;
private static readonly KeyedLocker Locker = new KeyedLocker();

public SagaCoordinator(ISagaSeeker seeker, ISagaInitializer initializer, ISagaProcessor processor,
public SagaCoordinator(ISagaSeeker seeker, ISagaInitializer initializer, ISagaProcessor processor,
ISagaPostProcessor postProcessor)
{
_seeker = seeker;
Expand All @@ -26,23 +22,21 @@ public SagaCoordinator(ISagaSeeker seeker, ISagaInitializer initializer, ISagaPr
_postProcessor = postProcessor;
}

public Task ProcessAsync<TMessage>(TMessage message, ISagaContext context = null) where TMessage : class
public Task ProcessAsync<TMessage>(TMessage message, ISagaContext context = null) where TMessage : class
=> ProcessAsync(message: message, onCompleted: null, onRejected: null, context: context);

public async Task ProcessAsync<TMessage>(TMessage message, Func<TMessage, ISagaContext, Task> onCompleted = null,
Func<TMessage, ISagaContext, Task> onRejected = null, ISagaContext context = null) where TMessage : class
{
var actions = _seeker.Seek<TMessage>().ToList();
var sagaTasks = new List<Task>();

Task EmptyHook(TMessage m, ISagaContext ctx) => Task.CompletedTask;
onCompleted = onCompleted ?? EmptyHook;
onRejected = onRejected ?? EmptyHook;
onCompleted ??= EmptyHook;
onRejected ??= EmptyHook;

foreach (var action in actions)
{
sagaTasks.Add(ProcessAsync(message, action, onCompleted, onRejected, context));
}
var sagaTasks = actions
.Select(action => ProcessAsync(message, action, onCompleted, onRejected, context))
.ToList();

await Task.WhenAll(sagaTasks);
}
Expand All @@ -51,7 +45,7 @@ private async Task ProcessAsync<TMessage>(TMessage message, ISagaAction<TMessage
Func<TMessage, ISagaContext, Task> onCompleted, Func<TMessage, ISagaContext, Task> onRejected,
ISagaContext context = null) where TMessage : class
{
context = context ?? SagaContext.Empty;
context ??= SagaContext.Empty;
var saga = (ISaga)action;
var id = saga.ResolveId(message, context);

Expand All @@ -63,7 +57,7 @@ private async Task ProcessAsync<TMessage>(TMessage message, ISagaAction<TMessage
{
return;
}

await _processor.ProcessAsync(saga, message, state, context);
await _postProcessor.ProcessAsync(saga, message, context, onCompleted, onRejected);
}
Expand Down
14 changes: 7 additions & 7 deletions src/Chronicle/Managers/SagaProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ public SagaProcessor(ISagaStateRepository repository, ISagaLog log)
_repository = repository;
_log = log;
}
public async Task ProcessAsync<TMessage>(ISaga saga, TMessage message, ISagaState state,

public async Task ProcessAsync<TMessage>(ISaga saga, TMessage message, ISagaState state,
ISagaContext context) where TMessage : class
{
var action = (ISagaAction<TMessage>)saga;
Expand All @@ -24,21 +24,21 @@ public async Task ProcessAsync<TMessage>(ISaga saga, TMessage message, ISagaStat
{
await action.HandleAsync(message, context);
}
catch (Exception e)
catch (Exception ex)
{
context.SagaContextError = new SagaContextError(e);
context.SagaContextError = new SagaContextError(ex);

if (!(saga.State is SagaStates.Rejected))
{
saga.Reject();
saga.Reject(ex);
}
}
finally
{
await UpdateSagaAsync(message, saga, state);
}
}

private async Task UpdateSagaAsync<TMessage>(TMessage message, ISaga saga, ISagaState state)
where TMessage : class
{
Expand All @@ -51,7 +51,7 @@ private async Task UpdateSagaAsync<TMessage>(TMessage message, ISaga saga, ISaga

var persistenceTasks = new []
{
_repository.WriteAsync(state),
_repository.WriteAsync(state),
_log.WriteAsync(logData)
};

Expand Down
1 change: 0 additions & 1 deletion src/Chronicle/Managers/SagaSeeker.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;

namespace Chronicle.Managers
Expand Down
8 changes: 4 additions & 4 deletions src/Chronicle/Saga.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ public virtual Task CompleteAsync()
return Task.CompletedTask;
}

public virtual void Reject()
public virtual void Reject(Exception innerException = null)
{
State = SagaStates.Rejected;
throw new ChronicleException("Saga rejection called by method");
throw new ChronicleException("Saga rejection called by method", innerException);
}

public virtual Task RejectAsync()
public virtual Task RejectAsync(Exception innerException = null)
{
Reject();
Reject(innerException);
return Task.CompletedTask;
}
}
Expand Down