BlackMali.StateMachine.Autofac
1.1.3
dotnet add package BlackMali.StateMachine.Autofac --version 1.1.3
NuGet\Install-Package BlackMali.StateMachine.Autofac -Version 1.1.3
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BlackMali.StateMachine.Autofac" Version="1.1.3" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add BlackMali.StateMachine.Autofac --version 1.1.3
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: BlackMali.StateMachine.Autofac, 1.1.3"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install BlackMali.StateMachine.Autofac as a Cake Addin
#addin nuget:?package=BlackMali.StateMachine.Autofac&version=1.1.3
// Install BlackMali.StateMachine.Autofac as a Cake Tool
#tool nuget:?package=BlackMali.StateMachine.Autofac&version=1.1.3
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
StateMachine
State machine implementation in C#.
Advantages:
- DI ready
- Async Pattern
- Safe programming with nullable types
- Works without constants and enums
- Builder for state machine creation
- Configuration of states and transitions
- Strict (default) and open transitions
- more than 95% code coverage
Compatible target frameworks
Product | Version |
---|---|
.NET Framework | .net 4.6.x .net 4.7.x .net 4.8.x |
.NET Standard | .net standard 2.x |
.NET Core | .net Core app 2.x .net core app 3.x |
.NET | .net 5 .net 6 .net 7 .net 8 |
NuGet
You should install BlackMali.StateMachine with NuGet:
Install-Package BlackMali.StateMachine.Autofac
Or via the .NET Core command line interface:
dotnet add package BlackMali.StateMachine.Autofac
Registration
Autofac
var builder = new ContainerBuilder();
builder.RegisterModule<StateMachineModule>();
builder.RegisterType<LockState>().AsSelf();
Configuration
public class SlotMachine
{
private readonly IStateMachine _stateMachine;
public SlotMachine(IStateMachineBuilder builder)
{
// With DI registration -> AddState<LockState>()
builder.AddState<LockState>()
.AddStartTransition();
.AddInStateTransition()
.AddTransition<UnLockState>()
.AddTransition<EndState>();
// Without DI registration -> AddState(new UnLockState())
builder.AddState(new UnLockState())
.AddInStateTransition()
.AddTransition<LockState>()
.AddTransition<EndState>();
// Create state machine
_stateMachine = builder.Build();
}
}
State change
// Perform state change
await _stateMachine.Transmit<LockState>();
// Or with Event
await _stateMachine.Transmit<LockState>(new StateMachineEvent());
// Or safe with exception handling
_stateMachine.OnError += (sender, args) => { };
await _stateMachine.TryTransmit<LockState>(new StateMachineEvent());
Event publishing with Post
// Posts an event to the current status
await _stateMachine.Post(new StateMachineEvent());
// Safe posting
await _stateMachine.TryPost(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 | Dependencies |
---|---|
BlackMali.StateMachine | No |
BlackMali.StateMachine.Autofac | Autofac |
Unit-Tests:
- XUnit
- XUnit.Runner.VisualStudio
- Autofac.Extras.Moq
- Moq
- Coverlet.Collector
IDE
Implemented with Microsoft Visual Studio Community 2022
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Autofac (>= 7.1.0)
- BlackMali.StateMachine (>= 1.1.3)
-
.NETStandard 2.1
- Autofac (>= 7.1.0)
- BlackMali.StateMachine (>= 1.1.3)
-
net6.0
- Autofac (>= 7.1.0)
- BlackMali.StateMachine (>= 1.1.3)
-
net7.0
- Autofac (>= 7.1.0)
- BlackMali.StateMachine (>= 1.1.3)
-
net8.0
- Autofac (>= 7.1.0)
- BlackMali.StateMachine (>= 1.1.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.