-1

進行中のプロジェクトがあり、クラスの一意のインスタンスを 1 つ作成したいと考えています。

タイプ「OfferStatus」のプロパティを持つ「JobOffer」クラスがあります(これは抽象的で、状態パターンを実装しています)。'StateAvailable' と 'StateUnavailable' (または必要に応じて 'open' と 'closed') があります。「JobOffer」オブジェクトはデータベースに保存する必要があります。

「StateAvailable」と「StateUnavailable」を 1 つだけにしたいので、新しい JobOffer を作成するときに「StateAvailable」または「StateUnavailable」を参照し、Open (利用可能) であるすべての 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, which depends on the state
//ie, this.State.myMethod();
4

1 に答える 1

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さまざまな状態の性質により、それぞれのインスタンスが 1 つだけ存在することが保証されます。

于 2013-03-18T12:23:03.850 に答える