7

有一个任务与状态变化相关。我非常困惑,认为它应该是一种基于事件的方法,其中涉及诸如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本身发生变化,则所有内容都会相应更改。

谢谢!

回答

2

CQRS和状态模式是完全不同的东西。状态模式提供了一种为单个对象实现一组状态或状态的方法,而CQRS是一种架构风格。 MVC与状态模式或CQRS无关,是表示层的架构风格。您可以将状态模式与NHibernate一起使用,但映射将不平凡,您将必须实现一个自定义的IUserType,以根据字段映射到相应的状态类。 RavenDB与NHibernate有很大的不同,映射会比较容易,但它是一个完全不同的数据库系统。

1

如果您使用sql来备份管理工具,并使用RavenDB作为前端运行搜索,那么CQRS将会是。在这个虚构的CQRS场景中,您需要将数据从Sql推送到RavenDB。