您好,感谢您花时间阅读我的问题。 我有一个项目正在进行,我希望有一个类的唯一实例。
我有一个'JobOffer'类,它有一个'OfferStatus'类型的属性(它是抽象的并实现了一个状态模式)。我有'StateAvailable'和'StateUnavailable'(如果你愿意,可以'打开'和'关闭')。 'JobOffer'对象必须存储在db。
中我想只有一个'StateAvailable'和一个'StateUnavailable',所以当我创建一个新的JobOffer时,我引用'StateAvailable'或'StateUnavailable',然后我可以列出所有打开的jobOffers(可用)和所有已关闭(不可用)。 我知道我可以通过在种子方法中添加db中的状态来实现这一点,并且永远不会实例化新状态。 但我想知道是否有可能做一个单身或其他东西以避免某人(我的意思是控制器,模型或任何东西)可以创建该类的新实例。
任何人都可以帮助我?
谢谢:)
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 :(得分: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
性质将确保每种状态只有一个实例。