Vac*_*ano 19 .net c# state state-machine stateless-state-machine
我有一些相当简单的状态需求(目前).我想我想使用Stateless api 对这些进行建模.(但我对国家机器并不是很了解,所以我错了.)
但是我被卷入了术语(特别是状态和触发器)
这是一个例子:我有一个订单类.它设置有几个状态.它们是:新的,填充的,装运的,已完成的,已取消的.
我想要的一些简单的状态规则是允许这些状态转换:
那么我在这里被绊倒的是我的"触发器"是什么?
如果需要更具体的示例,请说我想要一个这样的方法:
public bool UpdateOrderStatus(int OrderId, OrderStatusEnum NewOrderStatus)
Run Code Online (Sandbox Code Playgroud)
如果状态更新成功,则返回true.如何设置和使用Stateless来实现这一目标?
Ser*_*nov 28
机器一次只能处于一种状态; 它在任何给定时间所处的状态称为当前状态.当由触发事件或条件启动时,它可以从一种状态改变为另一种状态,这称为转换. 来自Wiki上的有限状态机
我相信,触发器就是这个触发事件.
更新:
当然,触发器名称有时可能等于某些州名称.
New (initial state)
New -> Filled (trigger "Filled")
New -> Cancelled (trigger "Cancelled")
Filled -> Shipping (trigger "ToBeShipped")
Filled -> Cancelled (trigger "Cancelled")
Shipping -> Complete (trigger "Completed").
Run Code Online (Sandbox Code Playgroud)
更新:
无国籍是非常好的框架!我试图实现这个功能.
状态:
public enum State
{
New,
Filled,
Shipping,
Cancelled,
Completed
}
Run Code Online (Sandbox Code Playgroud)
触发器:
public enum Trigger
{
Filled,
Cancelled,
ToBeShipped,
Completed
}
Run Code Online (Sandbox Code Playgroud)
订单类:
public class Order
{
private readonly StateMachine<State, Trigger> _stateMachine;
public Order()
{
_stateMachine = CreateStateMachine();
}
public bool TryUpdateOrderStatus(Trigger trigger)
{
if (!_stateMachine.CanFire(trigger))
return false;
_stateMachine.Fire(trigger);
return true;
}
public State Status
{
get
{
return _stateMachine.State;
}
}
private StateMachine<State, Trigger> CreateStateMachine()
{
StateMachine<State, Trigger> stateMachine = new StateMachine<State, Trigger>(State.New);
stateMachine.Configure(State.New)
.Permit(Trigger.Filled, State.Filled)
.Permit(Trigger.Cancelled, State.Cancelled);
stateMachine.Configure(State.Filled)
.Permit(Trigger.ToBeShipped, State.Shipping)
.Permit(Trigger.Cancelled, State.Cancelled);
stateMachine.Configure(State.Shipping)
.Permit(Trigger.Completed, State.Completed);
stateMachine.OnUnhandledTrigger((state, trigger) =>
{
Console.WriteLine("Unhandled: '{0}' state, '{1}' trigger!");
});
return stateMachine;
}
}
Run Code Online (Sandbox Code Playgroud)
订单类测试仪:
Order order = new Order();
bool result = order.TryUpdateOrderStatus(Trigger.Completed);
Console.WriteLine("Attemp to complete order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
result = order.TryUpdateOrderStatus(Trigger.ToBeShipped);
Console.WriteLine("Attemp to ship order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
result = order.TryUpdateOrderStatus(Trigger.Cancelled);
Console.WriteLine("Attemp to cancel order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10021 次 |
| 最近记录: |