有一项任务与改变实体的状态有关.而且我很困惑,想一想它是否应该是一个基于事件的方法,它涉及像CQRS这样的东西,或者我可以使用State模式并将所有逻辑留在实体中.
我发现了一篇文章,其中显示了使用状态模式的域模型(或其中一部分):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; } } }
而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; } } }
和州工厂接口定义如下:
public interface IStateFactory { AbstractState GetState(String state); }
最后的想法是把方法:
public void AlterState(String stateString) { this.state = stateFactory.GetState(stateString); }
>设计好吗?有什么缺点和优点?
>可扩展性如何?从我的角度来看,可以扩展/实施自己的州工厂.但是如果AbstractState本身发生了变化,一切都会相应变化.
谢谢!
解决方法
您可能对Nicholas Blumhardt的分层状态机Stateless感兴趣.阅读本章
SO answer here关于它的功能.这是一个
simple workflow processor example from my blog,我目前使用它与
the Pipe and Filter pattern,它的工作非常好.
编辑
如果您有兴趣,我也有一个使用Stateless和RavenDB的实现.