Last active
March 3, 2016 00:34
-
-
Save tintoy/d8320da6a130a33b8476 to your computer and use it in GitHub Desktop.
Example of chaining supervision deciders in Akka.NET.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <summary> | |
/// Extension methods for Akka's <see cref="IDecider">decider</see>s. | |
/// </summary> | |
public static class DeciderChaining | |
{ | |
/// <summary> | |
/// Create a new <see cref="LocalOnlyDecider"/> that first calls the <paramref name="decider"/>, but then calls <paramref name="escalateToDecider"/> if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>. | |
/// </summary> | |
/// <param name="decider"> | |
/// The original <see cref="IDecider"/>. | |
/// </param> | |
/// <param name="escalateToDecider"> | |
/// The <see cref="LocalOnlyDecider"/> to call if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>. | |
/// </param> | |
/// <returns> | |
/// The new (composite) decider. | |
/// </returns> | |
public static LocalOnlyDecider Then(this IDecider decider, Func<Exception, Directive> escalateToDecider) | |
{ | |
if (decider == null) | |
throw new ArgumentNullException(nameof(decider)); | |
if (escalateToDecider == null) | |
throw new ArgumentNullException(nameof(escalateToDecider)); | |
return decider.Then( | |
Decider.From(escalateToDecider) | |
); | |
} | |
/// <summary> | |
/// Create a new <see cref="LocalOnlyDecider"/> that first calls the <paramref name="decider"/>, but then calls <paramref name="escalateToDecider"/> if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>. | |
/// </summary> | |
/// <param name="decider"> | |
/// The <see cref="LocalOnlyDecider"/>. | |
/// </param> | |
/// <param name="escalateToDecider"> | |
/// The <see cref="IDecider">decider</see> to call if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>. | |
/// </param> | |
/// <returns> | |
/// The new (composite) decider. | |
/// </returns> | |
public static LocalOnlyDecider Then(this IDecider decider, IDecider escalateToDecider) | |
{ | |
if (decider == null) | |
throw new ArgumentNullException(nameof(decider)); | |
if (escalateToDecider == null) | |
throw new ArgumentNullException(nameof(escalateToDecider)); | |
return Decider.From(exception => | |
{ | |
Directive directive = decider.Decide(exception); | |
return directive == Directive.Escalate ? escalateToDecider.Decide(exception) : directive; | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment