2010-05-10 77 views
1

下面是我對狀態模式的實現。爲了使用NHibernate將State對象保存到我的數據庫中,我爲每個狀態類分配了一個枚舉值。這存儲爲實體上的專用字段,並映射到我的數據庫表中的整數字段。NHibernate和狀態模式持久性 - 一個很好的實現?

我想知道這是否是一個好的實現,因爲我將在整個應用程序中使用狀態模式,並希望在第一次使用狀態模式。謝謝

public class Order 
{ 
    private OrderStatusEnum _statusId; 
    public virtual Guid Id { get; set; } 

    private OrderState _status; 
    public virtual OrderState Status { 
     get 
     { 
      if (_status == null) 
       _status = GetState(_statusId); 
      return _status; 
     } 
     set 
     { 
      _status = value; 
      _statusId = _status.Id; 
     } 
    } 

    private OrderState GetState(OrderStatusEnum status) 
    { 
     switch (_statusId) { 
      case OrderStatusEnum.Pending: 
       return new Submitted(this); 
      case OrderStatusEnum.Completed: 
       return new Completed(this); 
      default: 
       return new NewOrder(this); 
     } 
    } 
} 

public abstract class OrderState 
{ 
    private readonly Order _order; 

    public OrderState(Order order) { 
     _order = order; 
    } 

    internal Order Order { get { return _order; } } 
    public abstract OrderStatusEnum Id { get; } 

    public virtual void Submit() { 
     throw new InvalidOperationException(
      string.Format("Can't Submit a {0} Order", this.GetType().Name) 
     ); 
    } 

    public virtual void Complete() { 
     throw new InvalidOperationException(
       string.Format(string.Format("Can't Cancel a {0} Order", this.GetType().Name)) 
      ); 
    } 

    protected internal void _Submit() { 
     Order.Status = new Submitted(Order); 
    } 

    protected internal void _Complete() { 
     Order.Status = new Completed(Order); 
    } 
} 

public class NewOrder : OrderState 
{ 
    public NewOrder(Order order) : base(order) { } 

    public override OrderStatusEnum Id { 
     get { return OrderStatusEnum.New; } 
    } 

    public override void Submit() { 
     _Submit(); 
    } 
} 

public class Submitted : OrderState 
{ 
    public Submitted(Order order) : base(order) { } 

    public override OrderStatusEnum Id { 
     get { return OrderStatusEnum.Pending; } 
    } 

    public override void Complete() { 
     _Complete(); 
    } 
} 

public class Completed : OrderState 
{ 
    public Completed(Order order) : base(order) { } 

    public override OrderStatusEnum Id { 
     get { return OrderStatusEnum.Completed; } 
    } 
} 

public enum OrderStatusEnum { 
    New = 1, 
    Pending = 2, 
    Completed = 3 
} 
+0

我喜歡它。一個問題:在您的客戶端代碼中,您是使用狀態實例還是使用訂單實例? – mynkow 2011-04-14 08:48:50

回答

0

不確定是否回答或添加評論,但您的方法在類似情況下對我很有幫助。

我也嘗試過使用Tarantino框架描述here的方法,但我發現從代碼擴展起來更容易。