2013-03-18 70 views
0

你好,感謝您抽出時間來閱讀我的問題的時間。 我有一個項目正在進行,我想有一個類的唯一實例。asp.net mvc4 EF5 Singleton?

我有一個「JobOffer」類,至極具有類型「OfferStatus」(至極是抽象的,實現了一個狀態模式)的特性。我有'StateAvailable'和'StateUnavailable'(或者'打開'和'關閉',如果你願意的話)。 「JobOffer」對象必須存儲在數據庫中。

我想只有一個'StateAvailable'和一個'StateUnavailable',所以當我創建一個新的JobOffer時,我引用'StateAvailable'或'StateUnavailable',然後列出所有jobOffers (可用)和所有關閉(不可用)。 我知道我可以在種子法分貝加入美國這樣做,從來沒有實例化一個新的狀態。 但我想知道是否有可能做一個單身或東西,以避免有人(我的意思是控制器,型號或任何東西)可以創建一個類的新實例。

任何人都可以幫到我嗎?

謝謝:)

public class JobOffer { 
public int JobOfferId {get;set;} 
public OfferState State {get;set; 
public virtual ICollection<Person> People {get;set;} 


//And some methods here, wich depends on the state 
//ie, this.State.myMethod(); 
+0

你有一些JobOffer的代碼嗎,請發貼吧 – TalentTuner 2013-03-18 05:47:44

+0

在那裏,我加了 – 2013-03-18 06:05:06

+0

你爲什麼不簡單地把它變成布爾型並稱之爲StateAvailable?當不可用時,它將是假的,如果可用的話是真的。 – 2013-03-18 06:19:54

回答

0

我首先想到的是使用一個布爾值。然後你說你必須能夠擴展到更多的狀態,所以我想到了一個枚舉。然後你說你有這個需求來使用一個類,所以...當我想要一個擁有更多智能的枚舉時,我使用了一些東西。我想,你可以稱它爲「枚舉類」。所以,你的OfferState類看起來是這樣的:

public sealed class OfferState 
{ 
    public bool CanChangeState { get; set; } 
    //whatever properties you need 

    public static OfferState Available = new OfferState(true); 
    public static OfferState Unavailable = new OfferState(true); 
    public static OfferState Closed = new OfferState(false); 
    //whatever states you need 

    public OfferState(bool canChange) 
    { 
     CanChangeState = canChange; 
    } 
} 

這種行爲有點像一個枚舉,但它像一個類屬性。因此,在你的邏輯,你可以檢查狀態:

if (jobOffer.State == OfferState.Available) 
{ 
    //stuff 
} 

您還可以得到性能掉了,所以你可以用它來獲取有關狀態的信息:

jobOffer.ExpiryDate = jobOffer.CreationDate.Add(OfferState.Available.MaxDuration); 

當然,在static各州的性質將確保每個州只有一個實例。

+0

感謝anaximander,但每個州必須有不同的課程。我目前擁有從'狀態'繼承的抽象類'狀態','可用'類和'不可用'類。國家定義了每個孩子覆蓋的一些方法。 從某種意義上說,你的想法可以解決它,但是我被迫爲每個狀態使用不同的類,jobOffer類需要有一個狀態(並且jobOffer必須存儲在數據庫中,EF迫使我使'狀態'類持久)。我只想(需要)擁有每個國家的一個對象,而不是一個班級,而是整個系統......任何其他想法? – 2013-03-18 13:09:35

+0

呃......這就是爲什麼使用模式是不好的原因。我想你可以使你的繼承狀態類完全靜態。你可能無法將它們包裝在父類中,但至少你知道只有一個。不是100%確定如何以EF喜歡的方式將他們鏈接到工作機會。 – anaximander 2013-03-18 13:20:36