8000 GitHub - BlackMali/StateMachine at v1.0.1
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Simple state machine implemented in C# (.net Standard 2.0, .net 8) with DI and async support

License

Notifications You must be signed in to change notification settings

BlackMali/StateMachine

Repository files navigation

StateMachine

.NET NuGet GitHub NuGet

Simple state machine implementation in C# (.NET 6).

Advantages:

  • DI ready
  • Async Pattern
  • Works without constants and enums
  • Builder for state machine creation
  • Configuration of states and transitions
  • Strict and open transitions
  • more than 95% code coverage

NuGet

You should install BlackMali.StateMachine with NuGet:

Install-Package BlackMali.StateMachine

Or via the .NET Core command line interface:

dotnet add package BlackMali.StateMachine

Configuration

var builder = new StateMachineBuilder()
	.UseStrictMode();

builder.AddBeginState(new LockState())
	.AddStartTransition();
	.AddInStateTransition()
	.AddTransition<UnLockState>()
	.AddTransition<EndState>();

builder.AddState(new UnLockState())
	.AddInStateTransition()
	.AddTransition<LockState>()
	.AddTransition<EndState>();

// Create state machine
var machine = builder.Build();

State change

await machine.Transmit<LockState>();

// OR with Event

await machine.Transmit<LockState>(new StateMachineEvent());

// Posts an event to the current status

await machine.Post(new StateMachineEvent());

State implementation

internal class LockState 
	: State // you can also use the interface IState without overrides
{
	// optional:
	public override async Task OnEnter(IStateMachineContext context)
	{
		await base.OnEnter(context);

		Console.WriteLine("Please insert coin");
	}

	// optional:
	public override async Task<IState?> OnTransmitted(IStateMachineContext context, StateMachineEvent @event)
	{
		var unLockEvent = @event as UnLockEvent;
		if (unLockEvent == null)
			return null;

		// No state change...
		if (unLockEvent.Coin == null)
			return null;

		// State change to UnLockState
		return await context.GetState<UnLockState>();
	}

	// optional:
	public override async Task OnExit(IStateMachineContext context)
	{
		// Do something...

		await Task.CompletedTask;
	}
}

Solution Packages

Package:

No Packages required

Unit-Tests:

  • XUnit
  • XUnit.Runner.VisualStudio
  • Autofac.Extras.Moq
  • Moq
  • Coverlet.Collector

IDE

Implemented with Microsoft Visual Studio Community 2022

About

Simple state machine implemented in C# (.net Standard 2.0, .net 8) with DI and async support

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Packages

No packages published
0