使用与状态模式合并的域模型

时间:2012-07-16 10:27:36

标签: asp.net-mvc nhibernate design-patterns domain-driven-design ravendb

有一项任务与更改实体的状态相关联。而且我很困惑,想一想它是否应该是一个基于事件的方法,它涉及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);
}
  1. 设计好吗?有什么缺点和优点?
  2. 可扩展性如何?从我的角度来看,可以扩展/实施自己的州工厂。但如果AbstractState本身发生变化,则一切都会相应变化。
  3. 谢谢!

3 个答案:

答案 0 :(得分:3)

你可能对Nicholas Blumhardt的分层状态机Stateless感兴趣。请阅读我的SO answer here关于它的功能。这是一个simple workflow processor example from my blog,我目前使用它the Pipe and Filter pattern,它的效果非常好。

修改

如果您有兴趣,我也有一个使用Stateless和RavenDB的实现。

答案 1 :(得分:2)

CQRS和状态模式完全不同。状态模式提供了为单个对象实现一组状态或状态的方法,而CQRS是一种体系结构样式。 MVC与状态模式和CQRS无关,是表示层的架构风格。您可以将状态模式与NHibernate结合使用,但映射将非常简单,您必须实现自定义IUserType以根据字段映射到适当的状态类。 RavenDB与NHibernate非常不同,使用它可以更容易地进行映射,但它是一个完全不同的数据库系统。

答案 2 :(得分:1)

如果你使用sql来支持管理工具,那么CQRS就会出现,而前端的RavenDB则会运行搜索。在这个虚构的CQRS场景中,您需要从Sql将数据推送到RavenDB。