2017-10-11 6 views
0

私はこの例では、ビューに表示することができ二つの異なるオブジェクトタイプは、3つのクラス複数(潜在的にnull)のナビゲーションプロパティを処理する最善の方法は何ですか?

public class ActivityLog 
    { 
      // The activity log affects an employee 
      public int EmployeeID { get; set; } 
      public Employee Employee { get; set; } 

      // The activity log affects a department 
      public int DepartmentID { get; set; } 
      public Department Department { get; set; } 
    } 

があるしているが、実際には異なるより多くの種類があり、どのために、それは理にかなっていないようですそれを独自の継承モデルに移動します。

私は以下を行うことができるようにしたいと思います:

public class ActivityLog<T> 
    { 
     // The activity log affects an unknown type 
     public T ConcernedObjectID { get; set; } 
     public T ConcernedObject { get; set; } 
    } 

は、今、私たちは(従業員がnullの場合、部門を使用)我々の見解ではnullチェックの多くを持っています。

これは、エンティティフレームワークが何とか役立つものか、コードのみのソリューション(たとえば、インタフェース)を実装するのが最善でしょうか?

+0

最適化する可能性のあるクエリは何ですか? –

+0

これはかなり広いトピックですが、ここには多くの回答があります。主な質問は、特定の 'ActivityLog'オブジェクトが**常に**同じオブジェクトを参照するかどうか、または同じ' ActivityLog'オブジェクトが部門と従業員の両方に使用できるかどうかです。私はこれが前者であると考えています(1つのアクティビティログは常に同じオブジェクトを扱います)。これは 'ActivityLog'コードを一般化するのに役立つすべての必要なクラス(人、部署、...)の間の共有インターフェイスを実装することを示唆しています。 – Flater

+0

_ "しかし、実際には相違する種類があり、それを独自の継承モデルに移すのは賢明ではないようです。" _なぜあなたはこれが正しいと思いますか?私はその反対を主張するだろう。 **より多くの**クラスがあります。**より高い** **継承またはインターフェースの実装を通じた一般化されたアプローチの必要性。これは、手動で行う必要がある余分なクラスごとに大幅に増加します毎回コード。 – Flater

答えて

0

私はここにデザイン上の問題があると思います。 ActivityLogクラスはあまりにも多くの処理を試みます。従業員のログと部門のログの両方のエントリ。それはまったく違うものです。彼らが共通して持つ唯一のことは、活動ログに入れることができることです。

私は、共通のインタフェースまたは抽象基本クラスを使用します。次に、データテンプレートをasp.netに相当するものを使用して、データを視覚化することができます。

したがって、このような何か:

public abstract class ActivityLogEntry 
{ 
    int Id { get; } 
} 

public EmployeeActivityLogEntry : ActivityLogEntry 
{ 
    Employee Employee {get;} 
} 

public DepartmentActivityLogEntry : ActivityLogEntry 
{ 
    Department Department {get;} 
} 

ヌルチェックであなたを助けることができるもう一つは、それが明示的な何かがnullになることをすることです。私はOptional NuGetパッケージを使っています。これはあなたにこのようなものを与えます

Option<Employee> Employee {get; } 

public string ToString() 
{ 
    return this.Employee.Match(e => e.Name,() => ""); 
} 

この場合、オプションで取り込まれた従業員に直接アクセスすることはできません。代わりに、Employee(nullではない)が存在する場合とそうでない場合の対処について、Funcを提供する必要があります。オプションのライブラリにはさらに多くのヘルパー関数があります。両方のケースを処理する必要があることがはっきりしています。あなたはもはや何かがnullに始まることに驚くことはありません。

(もちろん、すべてにはOption<T>を使用しないでください。ヌルになることのないプロパティでのみ使用するか、自分自身からバグを隠すことはできません)。

+0

ありがとうございました。私たちは、継承モデルを実装し、エンティティフレームワークによって生成された各アクティビティログに対して1つの異なるテーブルを持つというアドバイスを使いました。 – user2271046

関連する問題