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。