2010-04-05 98 views
2

我有一個將.NET枚舉映射到數據庫表的問題。想象一下,我有一張名爲「狀態」的表格,其中包含以下值:從數據庫加載枚舉

StatusID |名稱


1草案

2就緒

...

...

在應用層,我可以使用一個存儲庫來獲得所有狀態爲一個IList對象。但是,這種方法的問題在於,我無法在業務邏輯中引用特定狀態。例如,我怎樣才能實現這樣的東西?

if (myObject.Status is Ready) 
    do this 
else if (myObject.Status is Draft) 
    do that... 

由於狀態是動態加載,我不能肯定地告訴什麼在列表特定狀態對象表示草案或準備就緒狀態。

或者,我可以只使用一個枚舉像

public enum Statuses 
{ 
    Draft, 
    Ready 
}; 

然後,我可以很容易地在我的業務邏輯中使用的枚舉。

if (myObject.Status == Statuses.Draft) 
    // do something... 

但是,這種方法的問題是,每次用戶想要修改狀態列表(添加一個新的狀態,或重命名現有狀態)的應用程序必須重新編譯。我們無法從數據庫動態加載狀態。

有沒有其他人遇到類似的情況?任何解決方案/模式?

乾杯,

MOSH

+0

你可能想看看戰略模式,看看是否有幫助。 – Kane 2010-04-05 11:05:22

回答

1

一種常見的方式做到這一點是讓你在枚舉可以由任何其他組件中引用一個共同的較低水平裝配規定(每個項目我曾經工作過的有某種框架或通用程序集)。

在你的枚舉的定義,你可以指定實際值:

public enum Status 
{ 
    None = 0, 
    Draft = 1, 
    Ready = 2 
    ... etc ... 
} 

如果添加了狀態值不要擔心需要重新編譯。如果實際將使用該狀態值,則無論如何您都必須添加新代碼(如果您的代碼永遠不會根據它做出決定,那麼爲什麼您關心新的狀態值?)。因此,在你的代碼的某個地方,你將有這樣的事情:

if (myObject.Status == Status.MyNewValue) 
    ... carry out some action ... 

,幷包含此代碼的程序集將需要重新編譯,也將在枚舉定義(使新的值可以看出,通用裝配從程序集中獲取這些代碼)。數據庫人員可以根據需要創建任意數量的狀態值,如果您沒有專門使用它們,則不需要重新編譯。當然,這條規則也有例外 - 因爲Enum默認爲int,您可以從數據庫中讀取任何狀態值並將其分配給Status屬性,但如果您尚未明確定義狀態枚舉值在你的枚舉定義中。

因此,爲了使長話短說:不用擔心重新編譯方面,只是做了 - 你的狀態值不會改變,往往:)

另外,如果你是擔心名枚舉值的,那麼可以通過將枚舉值映射到資源文件中的字符串來解決該問題,該字符串就是您在數據網格中顯示的內容或其他任何通過UI顯示的枚舉。如果你的商業專家正在改變enum的定義(比如'1'現在意味着'Ready'和'2'現在意味着'Draft'),那麼這簡直是愚蠢的,他們不應該這樣做 - 如果他們是那麼你將不得不重構你的代碼。

0

對我來說,枚舉解決方案運行良好。向數據庫添加新的狀態意味着應用程序在遇到它時可能會做更多的工作。例如,如果我添加了PublishedDeleted狀態會發生什麼情況。