lex*_*eme 7 nhibernate asp.net-mvc design-patterns domain-driven-design ravendb
有一项任务与改变实体的状态有关.我很困惑,想一想它是否应该是一个基于事件的方法,它涉及到类似的东西,CQRS
或者我可以使用a State pattern
并将所有逻辑留在实体中.
我发现了一篇文章,其中显示了使用状态模式的域模型(或其中一部分):http://www.prowareness.com/blog/?p = 1448
订购系统与我的域模型非常接近.所以这个例子很棒.但是我仍然想知道考虑MVC模式是否是一个好的做法,是否可以实现RavenDB/NHibernate
?
编辑:问题重新考虑
让我们按照例子:
首先,这是一个名为的域名实体Idea
:
[Serializable]
public class Idea : AbstractEntity<Guid> {
private static IStateFactory stateFactory;
private AbstractState state = new InitiatedState();
[Required, StringLength(150)]
public String Title { get; set; }
[Required]
public String ProblemContext { get; set; }
public DateTime CreatedOn { get; set; }
public Guid InitiatorId { get; set; }
[Required]
public Decimal InvestmentAmount { get; set; }
public Boolean IsInitiated {
get { return this.state.IsInitiated; }
}
public Boolean IsRejected {
get { return this.state.IsRejected; }
}
public Boolean IsUnderInitialAssessment {
get { return this.state.IsUnderInitialAssessment; }
}
public Boolean IsConfirmedForImplementation {
get { return this.state.IsConfirmedForImplementation; }
}
}
Run Code Online (Sandbox Code Playgroud)
然而AbstractState
是:
public abstract class AbstractState {
public virtual Boolean IsInitiated {
get { return true; }
}
public virtual Boolean IsRejected {
get { return false; }
}
public virtual Boolean IsUnderInitialAssessment {
get { return false; }
}
public virtual Boolean IsConfirmedForImplementation {
get { return false; }
}
}
Run Code Online (Sandbox Code Playgroud)
和州工厂接口定义如下:
public interface IStateFactory {
AbstractState GetState(String state);
}
Run Code Online (Sandbox Code Playgroud)
最后的想法是把方法:
public void AlterState(String stateString) {
this.state = stateFactory.GetState(stateString);
}
Run Code Online (Sandbox Code Playgroud)
AbstractState
自身发生变化,一切都会相应变化.谢谢!
您可能对 Stateless 感兴趣,这是 Nicholas Blumhardt 设计的分层状态机。阅读我关于它的功能的回答。这是我博客中的一个简单的工作流处理器示例,我目前将它与管道和过滤器模式一起使用,并且效果非常好。
编辑
如果您有兴趣,我还有一个使用 Stateless 和 RavenDB 的实现。