2013-03-18 2 views
0

Привет, спасибо за то, что нашли время, чтобы прочитать мой вопрос. У меня есть проект, и я хотел бы иметь один уникальный экземпляр класса.asp.net mvc4 EF5 Singleton?

У меня есть класс JobOffer, который имеет свойство типа 'OfferStatus' (которое является абстрактным и реализует шаблон состояния). У меня есть «StateAvailable» и «StateUnavailable» (или «открыто» и «закрыто», если хотите). Объекты JobOffer должны храниться в db.

Я бы хотел иметь только один «StateAvailable» и один «StateUnavailable», поэтому, когда я создаю новый JobOffer, я ссылаюсь на «StateAvailable» или «StateUnavailable», а затем я могу перечислить все jobOffers, которые являются Open (доступно) и все закрытые (недоступные). Я знаю, что могу сделать это, добавив состояния в db в методе seed и никогда не создавая новое состояние. Но мне было интересно, можно ли сделать синглтон или что-то, чтобы избежать того, что кто-то (я имею в виду контроллер, модель или что-то еще) может создавать новые экземпляры этого класса.

Кто-нибудь может мне помочь?

Спасибо :)

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

+0

Там, я добавил его –

+0

Почему бы вам просто не сделать его логическим и назвать его StateAvailable? Когда он недоступен, он будет ложным, когда будет доступно true. –

ответ

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 должен храниться в db, EF заставляет меня сделать класс «state» устойчивым). Я только хочу (нужно) иметь один объект каждого состояния, а не в классе, а во всей системе ... Любые другие идеи? –

+0

Huh ... вот почему использование рисунка ради этого плохое. Я думаю, вы можете сделать свои унаследованные классы состояний совершенно статичными; вы, возможно, не сможете их обернуть в родительском классе, но, по крайней мере, вы знаете, что это будет только один. Не 100% уверены, как вы связываете их с предложениями о работе таким образом, каким нравится EF. – anaximander

Смежные вопросы