【问题标题】:Using a domain model incorporated with a State pattern使用结合了状态模式的域模型
【发布时间】: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);
}
  1. 设计好了吗?有什么优缺点?
  2. 可扩展性如何?从我的角度来看,可以扩展/实现自己的状态工厂。但是,如果 AbstractState 本身发生变化,那么一切都会相应地发生变化。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您可能对 Nicholas Blumhardt 的分层状态机 Stateless 感兴趣。阅读我的SO answer here,了解它的功能。这是simple workflow processor example from my blog,我目前将它与the Pipe and Filter pattern 一起使用,效果很好。

    编辑

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

    【讨论】:

      【解决方案2】:

      如果您使用 sql 支持管理工具,使用 RavenDB 前端运行搜索,CQRS 将是。在这个虚构的 CQRS 场景中,您需要将数据从 Sql 推送到 RavenDB。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-15
          • 2015-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多