7

有一个与改变实体状态有关的任务。而且我很困惑认为它是否应该是一种基于事件的方法,它涉及类似的东西,CQRS或者我可以使用 aState 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本身发生了变化,那么一切都会相应地发生变化。

谢谢!

4

3 回答 3

3

您可能对 Nicholas Blumhardt 的分层状态机 Stateless 感兴趣。在此处阅读我的SO 答案,了解它的功能。这是我博客中的一个简单的工作流处理器示例,我目前将它与管道和过滤器模式一起使用,它工作得非常好。

编辑

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

于 2012-07-31T22:52:05.397 回答
2

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

于 2012-07-18T00:11:17.803 回答
1

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

于 2012-07-18T21:55:54.240 回答