2010-05-10 78 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的方法,但我发现从代码扩展起来更容易。