【发布时间】:2012-07-15 04:36:09
【问题描述】:
有一个与改变实体状态相关的任务。而且我很困惑是否应该是一种基于事件的方法,涉及CQRS 之类的东西,或者我可以使用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; }
}
}
而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本身发生变化,那么一切都会相应地发生变化。
谢谢!
【问题讨论】:
标签: asp.net-mvc nhibernate design-patterns domain-driven-design ravendb