2012-04-25 14 views
1

私はMVC 3を使って、1つのレイヤー(MVC)だけを使って簡単な調査ツールを構築しました。私は今これを後悔します。私のデータベースへのアクセスとマッピングはすべて、コントローラと他のいくつかのマッピングクラスで処理されます。多層アーキテクチャを使用する場合のメソッド呼び出しの適切なシーケンスは何ですか?

私は、3つの層を使用してに切り替えたいと思います:

プレゼンテーション(MVC)
ビジネスロジック
データ/永続性(EF)

私はすべてを処理するためにEntity Frameworkのを使用していますデータベースを使用します。エンティティフレームワークは独自のドメインクラスを作成します。 MVCが使用するモデルとEFが作成するモデルの間のマッピングはどこで行われるべきですか?

マッピングがビジネスレイヤーにある場合、MVCプロジェクトのモデルフォルダが必要ですか?

調査質問は、質問自体、行と列で構成されています。私が使用するモデルはTheeseです:

public class Question { 

     public int Question_ID { get; set; } 

     public Boolean Condition_Fullfilled; 

     [Required(ErrorMessage = "Dette felt er påkrævet")] 
     public String Question_Wording { get; set; } 

     public String Question_Type { get; set; } 

     [Required(ErrorMessage = "Dette felt er påkrævet")] 
     public String Question_Order { get; set; } 

     public String Left_scale { get; set; } 
     public String Right_scale { get; set; } 
     public int Scale_Length { get; set; } 
     public String Left_Scale_HelpText { get; set; } 
     public String Right_Scale_HelpText { get; set; } 

     public Boolean Visible { get; set; } 
     public Boolean IsAnswered { get; set; } 
     public String Question_HelpText { get; set; } 
     public int Category_ID { get; set; } 

} 
public class MatrixColumns 
    { 
     public int Column_ID { get; set; } 
     public int Column_Number { get; set; } 
     public String Column_Description { get; set; } 
     public Boolean IsAnswer { get; set; } 
     public int? Procent { get; set; } 
     public bool Delete { get; set; } 
     public bool Visible { get; set; } 
     public int? Numbers { get; set; } 
     public String Help_Text { get; set; } 

    } 

    public class MatrixRows 
    { 
     public bool Delete { get; set; } 
     public bool Visible { get; set; } 
     public int Row_Id { get; set; } 
     public String Row_Number { get; set; } 
     public String Row_Description { get; set; } 
     public String Special_Row_CSS { get; set; } 
     public String Help_Text { get; set; } 
     // Dette er summen af procenterne af alle kolonner i rækken 
     public int RowSum { get; set; } 
    } 

theeseモデルのすべてのデータは、コントローラで取得しQuestionIDに基づいて、このように見えるのViewModelにマップされます。

public class ShowMatrixQuestionViewModel : Question 
    { 
     public Dictionary<MatrixRows, List<MatrixColumns>> columnrow { get; set; } 
     public List<MatrixColumns> columns { get; set; } 
     public List<MatrixRows> rows { get; set; } 

     public ShowMatrixQuestionViewModel() 
     { 
      columns = new List<MatrixColumns>(); 
      rows = new List<MatrixRows>(); 
      columnrow = new Dictionary<MatrixRows, List<MatrixColumns>>(); 
     } 
    } 

ので、コントローラからビューにShowMatrixQuestionViewModelを送信したい場合、どのルートを取るべきですか?

これが私の提案です:

public Question GetQuestion(int QuestionId) {} 
public MatrixRows GetRows(int QuestionId) {} 
public MatrixColumns GetColumns(int id) {} 

- > GetQuestionデータ層の次のメソッドを呼び出します - >コントローラは

public ShowMatrixViewModel GetQuestion(int QuestionID) {} 

と呼ばれるビジネス層のメソッドを呼び出します - > Entityフレームワークは、 "純粋な"オブジェクトを返します。これは、上に投稿したオブジェクトにマップしたいものです。
- > GetQuestionメソッドを呼び出す自分のモデルにEFモデルをマッピングするために
- >最終GetQuestionは質問、行と列をマップするメソッドを呼び出します。

ShowMatrixQuestionViewModel model = MapShowMatrixQuestionViewModel(Question, MatrixRows, MatrixColumns) 
return model; 

は、この正しいですか?あなたの質問の最初の部分に答えるために、事前

答えて

0

ありがとう:

「EFが行く作成MVCを使用してモデルやモデルの間のマッピングする必要がありますか?」

答えは、MVCモデルは、EFによって作成されたモデルです。 ASP.NET MVCプロジェクトのEFツールは、Linq to SQLクラスまたはADO.NET Entity Frameworkモデルです。これらをプロジェクトのModelsフォルダ内に作成し、データ/永続性(EF)を提供する必要があります。

+0

調査の質問は、3つの異なるEFモデルのデータから構成されます。私はモデルのデータを、質問を表示するために必要な情報をすべて保持するViewModelにマップします。私の考えは、これがすべてビジネス層にある可能性があるということでした。 MVCはビジネスレイヤーへの参照を持ち、モデルを参照することができます。 – Kenci

+0

いいですね。 3つの独立したEFソースからデータを取得する場合は、3つのEFソースのそれぞれから必要なデータフィールドを含む独自のクラス(ビジネスロジックレイヤー)を作成し、余分なデータと必要な操作する。 MVCは、モデルと独自のカスタムクラスを使用して、データとビジネスロジックを分離して保持します。 – markp3rry

関連する問題