2011-02-07 4 views
5

私はMVC 3を学習していますが、データモデルクラスのプロパティ内でロジックコードを使用している人が見つかりませんでした。 (例えば)以下のようにデータモデルクラスのプロパティ内にいくつかのロジックコードを持つことはできますか?

彼らは、データモデルクラスを実行します。次のように

public class Customer 
{ 
    public int CustomerId {get;set;} 
    //other properties without any logic code. 
} 

は、それがプロパティ内のロジック・コードを持ってしても大丈夫ですか?

public class Customer 
{ 
    private int customerId; 
    public int CustomerId { 
     get{return customerId;} 
     set 
     { 
     customerId=value; 
     // some logic codes go here. 
     } 
    } 
    //other properties go here. 
} 

編集1:

これは私の本当のシナリオです:

子テーブルデータモデル:

namespace MvcApplication1.Models 
{ 
    public class Choice 
    { 
     public int ChoiceId { get; set; } 
     public string Description { get; set; } 
     public bool IsCorrect { get; set; } 
     public QuizItem QuizItem { get; set; } 
    } 
} 

親テーブルデータモデル:

namespace MvcApplication1.Models 
{ 
    public class QuizItem 
    { 
     public int QuizItemId { get; set; } 
     public string Question { get; set; } 

     private IEnumerable<Choice> choices; 
     public IEnumerable<Choice> Choices 
     { 
      get { return choices; } 

      set 
      { 
       choices = value; 
       foreach (var x in choices) 
        x.QuizItem = this; 
      } 
     } 
    } 
} 

消費者:

namespace MvcApplication1.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 


      var data = new List<QuizItem>{ 
       new QuizItem 
       { 
        QuizItemId = 1, 
        Question = "What color is your hair?", 
        Choices = new Choice[]{ 
         new Choice{ ChoiceId=1, Description="Black.", IsCorrect=true}, 
         new Choice{ ChoiceId=2, Description="Red.", IsCorrect=false}, 
         new Choice{ ChoiceId=3, Description="Yellow.", IsCorrect=false} 
        } 
       }, 
       new QuizItem 
       { 
        QuizItemId = 2, 
        Question = "What color is your noze?", 
        Choices = new Choice[]{ 
         new Choice{ChoiceId=1, Description="Pink.", IsCorrect=false}, 
         new Choice{ChoiceId=2, Description="Maroon.", IsCorrect=true}, 
         new Choice{ChoiceId=3, Description="Navy Blue.", IsCorrect=false} 
        } 
       } 
      }; 


      return View(data); 
     } 

    } 
} 
+2

あなたのセッターでは何をしていますか? – alexn

+7

IMO、プロパティ設定ツールに*合理的な副作用があるのは大丈夫です。例として、 'PropertyChanged'イベントを発生させることは許容されます、' new NuclearMissile()。Launch() 'はそうではありません。 – Ani

+0

@alexn:実際のシナリオを表すために質問を更新します。 – xport

答えて

2

これは、メソッドのために呼び出します。二つの理由:

  • 私はコレクション
    • Property Usage Guidelines用セッターをお勧めしません - プロパティが設定されるたびに高価であり、財産にすべきではない、コレクション内の各項目のプロパティを設定します。代わりに方法が好ましい。コレクションのセッターについてのStackOverflow上の議論 - セッターで
  • コードは(あなたがあなたのケースを持っていること)

私は、次のお勧め:

public class QuizItem 
{ 
    public int QuizItemId { get; set; } 
    public string Question { get; set; } 

    private IEnumerable<Choice> choices; 
    public IEnumerable<Choice> Choices 
    { 
     get { return choices; } 
    } 

    public void SetChoices(IEnumerable<Choice> choices) 
    { 
     foreach (var x in choices) 
      x.QuizItem = this; 

     this.choices = choices;     
    } 
} 
+0

それは本当です。私は同意する –

+0

上記の箇条書きのリストにあなたの2つの理由に関連する詳細な説明を私に与えることができますか? – xport

+0

@Recycle Bin:参照でポイントを更新しました。 – decyclone

0

私はこのロジックを使用して、コントローラに実装すべきだと思います。しかし、私は常に私のモデルでPOCOクラスを定義し、そのような単純なロジックを実装するためにViewModelを使用します。

0

これは、哲学的アプローチの領域です。それは議論の余地があります。

今日、最も普及しているアプローチは、「モデル」オブジェクトがデータを保持する責任しか持たず、その上にあらゆる種類のビジネスロジックを適用する必要がある場合、別の「ビジネスロジック」レイヤーで実装することができます。このレイヤーでは、データの完全性の検証/妨害、ビジネスプロセスに応じたデータの変更などの懸念の適用を処理します。

もう1つのアプローチは、実際にモデル(動詞のように)ターゲットドメインのビジネスにモデル層を使用することです。この場合、モデルはビジネスルールの直接的な定義として機能し、ビジネスのルールと同じくらい豊富でなければなりません。 (このアプローチは、Naked Objectsによって極端に取られており、基本的にデータ構造とビジネスロジックをモデル内に保持し、同じモデルからORM、コントローラロジック、およびビューを生成する)

一般的に、私のモデルオブジェクトでなければなりません "というのは、あなたが使っているフレームワークから聞くべきものです。いくつかのフレームワークは単純にどちらの方法(ASP.NET MVC)にも気にしませんし、他の人は、あなたが(NHibernate、Entity Framework)のために自分の仕事をするのに十分なメタデータを提供している限り、ドメインオブジェクトモデル(例:裸のオブジェクト)でビジネスルールとロジックをすべて表現することをお勧めします。

関連する問題