2

このエンティティをモデル化する最善の方法を見つけようとしていますが、行き詰っています。基本的なユースケース/ストーリーは次のとおりです。

機材が現場に到着。どんな機材かは、届くまでわかりません。機器が現場に到着したら、到着したこと、およびアイドル状態かアクティブ状態かを記録する必要があります。アクティブな場合、ユーザーは機器が実行した作業を記録する必要があります。機器がサイトを離れるときは、これに注意する必要があります。

サイトに機器があるかどうか、以前にサイトにあった機器などを簡単に照会できる必要があります。

私は日付の面で立ち往生しています。特定の日にアイドル状態とマークされていない場合、cronジョブを実行して機器をアイドル状態としてマークすることに頼らないようにしています。これを行う方法が必要なように感じます。これが私が思いついたものです:

public class Equipment {
    public int Id { get; set; }
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime Departure { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

アイデアは、Site.Equipment.Where(x=>x.Departure == null)どの機器がまだ現場にあるかを確認するようなクエリを実行できるということです。特定の日付に EquipmentUtilization がない場合は、アイドル状態であると見なされます。次に、DateTimeEnumerator をセットアップできます。

public class DateTimeEnumerator : System.Collections.IEnumerable
{
    private DateTime begin;
    private DateTime end;

    public DateTimeEnumerator ( DateTime begin , DateTime end ) 
    {            
        this.begin = begin;
        this.end = end;
    }
    public System.Collections.IEnumerator GetEnumerator()
    {
        for(DateTime date = begin; date < end; date = date.AddDays(1))
        {
            yield return date;
        }
    }
}

到着日から DateTime.Now または DepatureDate (null でない場合) までの日付のリストを作成します。何らかの理由で、これは醜いようです。DateTime 列挙子を Equipment オブジェクトの内部に配置する必要がありますか? これはすべて一緒にするか、別の方法で行う必要があるように感じますが、実行すると機能します。提案?

4

3 に答える 3

1

私の理解が正しければ、Equipment (EquipmentResidency の方が適切な名前でしょうか?) コレクションに関連付けられたキャプチャーされた equipmentutilization オブジェクトに基づいて、特定のサイトで特定の日付にアイドル状態になっている機器を特定する方法を探していると思います。

アイドル日に Equipmentutilization オブジェクトを作成することを避けたいので (重要なメンテナンスになる可能性があることに同意します)、渡された Date がキャプチャされた ReportDate と一致する場合は true を返し、一致する場合は false を返す isIdleOn(Date) メソッドを Equipmentutilization クラスに追加するのはどうですか?いいえ?

関連するクエリは、Site.Equipment.Where(x=>x.equipmentutilization.isIdleOn(date) == true) の行に沿ったものになります。

構文が正しいかどうかはわかりませんが、単なる提案です。

于 2010-08-06T21:46:23.127 に答える
0

私が目にする潜在的な問題の1つは、機器が現在の場所しか知らないことです。Loader123が2か月前にSiteXYZにあったかどうかを知りたい場合は、現在のモデルを使用してその情報を取得することはできません。

使用量の粒度は特定の日のもののようです。SiteABCで午後11時から午前4時まで、次にSiteXYZで午後1時から午後5時まで機器を使用する場合、追跡方法を理解する必要がないため、これにより確実に作業が簡単になります。

これらのことを念頭に置いて、モデルにいくつかのわずかな変更を加えます。機器があったすべてのサイト(Equipment.History)のコレクションを保持し、現在のサイト(SiteHistory.Departureに値がないもの)を見つけるための便利な機能を提供します。使用率自体については、DateTimeでキー設定された辞書として返す便利な関数を提供します。次に、その辞書のキーコレクションを操作して、特定の期間内に機器が実際に使用された日数を簡単に数えることができます。

public class Equipment 
{
    public int Id { get; set; }
    public IList<SiteHistory> History { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
    public IDictionary<DateTime, EquipmentUtilization> UtilizationsDictionary { get{...} }
    public Site CurrentSite { get{...} }
}

public class SiteHistory {
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime? Departure { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }  // is this a circular-reference back to the parent?  Might be able to omit it.
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

他のクイックアンドダーティデザインと同様に、これにはいくつかの穴があり、いくつかの改良を加えることができると確信しています。しかし、うまくいけば、それはあなたが探しているものに少し近づくでしょう。

于 2010-08-06T22:12:13.703 に答える
0

私は個人的にDateTime列挙子を持っていません。あなたが言ったように、それは間違っているように聞こえます。

何かがアイドルとして分類されるべきだとあなたが言うとき、私はここであなたをフォローするのに苦労していることを認めなければなりません。何かがアイドル状態であるかどうかを判断するために使用するものは何でも、プロパティに入れることができます。例:

public class Equipment
{ 
    public int Id { get; set; } 
    public Site Site { get; set; } 
    public DateTime Arrival { get; set; } 
    public DateTime Departure { get; set; } 
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }

    public bool IsIdle
    {
        get
        {
            // This checks if the EquipmentUtilizations is empty
            // or if the Equipment is older than three days
            return (this.EquipmentUtilizations == null) ||
                   ((this.Departure == null) &&
                    (this.Arrival < DateTime.Today.AddDays(-3))
        }
    }
}
于 2010-08-06T22:14:08.613 に答える