在使用c#无状态库时,人们如何构造代码?无状态状态机库 - 适当的结构方式?
https://github.com/nblumhardt/stateless
我如何特别感兴趣这种关系与注入的依赖关系,以及责任的正确的方法和正确的层次感。
我现在的结构涉及以下内容:
public class AccountWf
{
private readonly AspNetUser aspNetUser;
private enum State { Unverified, VerificationRequestSent, Verfied, Registered }
private enum Trigger { VerificationRequest, VerificationComplete, RegistrationComplete }
private readonly StateMachine<State, Trigger> machine;
public AccountWf(AspNetUser aspNetUser, AccountWfService userAccountWfService)
{
this.aspNetUser = aspNetUser;
if (aspNetUser.WorkflowState == null)
{
aspNetUser.WorkflowState = State.Unverified.ToString();
}
machine = new StateMachine<State, Trigger>(
() => (State)Enum.Parse(typeof(State), aspNetUser.WorkflowState),
s => aspNetUser.WorkflowState = s.ToString()
);
machine.Configure(State.Unverified)
.Permit(Trigger.VerificationRequest, State.VerificationRequestSent);
machine.Configure(State.VerificationRequestSent)
.OnEntry(() => userAccountWfService.SendVerificationRequest(aspNetUser))
.PermitReentry(Trigger.VerificationRequest)
.Permit(Trigger.VerificationComplete, State.Verfied);
machine.Configure(State.Verfied)
.Permit(Trigger.RegistrationComplete, State.Registered);
}
public void VerificationRequest()
{
machine.Fire(Trigger.VerificationRequest);
}
public void VerificationComplete()
{
machine.Fire(Trigger.VerificationComplete);
}
public void RegistrationComplete()
{
machine.Fire(Trigger.RegistrationComplete);
}
}
我们应该实现所有进程OnEntry钩内(调用服务),或实施在外面的过程之后的状态转换已经证实,它是允许发生?如果是的话,我很好奇如何做交易管理。
我想我以后是从那些已经实现了使用无状态的东西,以及如何处理代码结构的人的一些最好的指导。
看着这一点,我倾向于使用注入到域服务的工厂来构造工作流对象,并且这可以传递工作流对象所需的服务。 – dandcg 2014-10-09 15:44:39
仍在寻找关于使用状态机的最佳方法的一些指导。假设我需要在发送电子邮件服务时调用一个方法,该方法在Web请求的整个生命周期中都存在。这个呼叫应该在OnEntry中还是在公共方法中进行。如果它在OnEntry中如果在转换过程中遇到问题会发生什么?有些人已经使用无状态实现代码,并且他们已经放置了实际代码的一些指导将不胜感激。 – dandcg 2014-10-12 15:55:24