2013-03-18 77 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