私は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;
は、この正しいですか?あなたの質問の最初の部分に答えるために、事前
調査の質問は、3つの異なるEFモデルのデータから構成されます。私はモデルのデータを、質問を表示するために必要な情報をすべて保持するViewModelにマップします。私の考えは、これがすべてビジネス層にある可能性があるということでした。 MVCはビジネスレイヤーへの参照を持ち、モデルを参照することができます。 – Kenci
いいですね。 3つの独立したEFソースからデータを取得する場合は、3つのEFソースのそれぞれから必要なデータフィールドを含む独自のクラス(ビジネスロジックレイヤー)を作成し、余分なデータと必要な操作する。 MVCは、モデルと独自のカスタムクラスを使用して、データとビジネスロジックを分離して保持します。 – markp3rry