2011-04-19 85 views
2

,比如我有以下的域模型:如何處理字典表中的數據的基礎

class Order { 
    public virtual int Id {get; protected set;} 
    public virtual BaseStatus Status {get; set;} 
} 

abstract class BaseStatus { 
    public virtual int Id {get; protected set;} 
    public abstract string Name {get;} 
} 

class Approved : BaseStatus { 
    public override string Name 
    { 
      get { return "Approved"; } 
    } 
} 

所以,現在我wan't已經是兩個表,OrdersStatuses。訂單表將有StatusId列。 問題是關於更改訂單狀態的API。如果我這樣做:

order.Status = new Approved(); 

這將導致在狀態表中創建新行。 目前我已經創建了下面的幫助:

class StatusesFactory { 
    ISession session;     

    public StatusesFactory(ISession session){ 
     this.session = session; 
    } 

    public GetStatus<T> where T : BaseStatus, new() { 
     T status = session.QueryOver<T>.SingleOrDefault(); 

     if(status == null){ 
       status = new T(); 
       session.SaveOrUpdate(status); 
     } 

     return status; 
    } 
} 

而當我想設置狀態我用這樣的代碼:

order.Status = statusesFactory.GetStatus<Approved>(); 

它似乎做工精細,但很複雜,沒有理由。我使用NHibernate,但我認爲同樣的問題可能適用於任何ORM。這種事情的原因是容易部署在空數據庫上,以便在首次請求時填充它。

  1. 如何處理字典表?
  2. 我的方法是否有明顯的缺陷,我看不到?
  3. 的一個問題,我在這裏看到的是,當我需要得到所有可能的狀態,我不能使用如下代碼:

    session.QueryOver()名單();

因爲不是所有的狀態都可能被創建。 那你覺得呢?

+0

不能滿足Order Sta土族? – 2011-04-19 09:05:31

+0

想要使用狀態模式 – Sly 2011-04-19 09:08:06

回答

1

很好的問題...

我認爲你認可類應該使用使用Singleton模式,因爲只能有一個經批准的國家...

名單所有現有的和所有可能的狀態都有點困難......可能的狀態取決於從BaseState繼承的類......我不知道如何快速找到這些狀態,因爲它們不必駐留在當前組件中,甚至在加載的程序集中......你應該考慮BaseStatus中的所有子類單體對象的靜態列表...