asp.net-mvc – 使用与状态模式合并的域模型

有一项任务与改变实体的状态有关.而且我很困惑,想一想它是否应该是一个基于事件的方法,它涉及像CQRS这样的东西,或者我可以使用State模式并将所有逻辑留在实体中.

我发现了一篇文章,其中显示了使用状态模式的域模型(或其中一部分):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本身发生了变化,一切都会相应变化.

谢谢!

解决方法

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

编辑

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

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....