在使用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