サンプルプロジェクトがあります。これは、管理者が質問表を作成し、それに質問のグループを追加して、各質問グループに質問を追加できる動的な質問表システムです。
EFデータコンテキストのエンティティを構成する次のPOCOのグループを取り上げます。
public class Questionnaire
{
public virtual int Id { get; set; }
public virtual string QuestionnaireName { get; set; }
public virtual IList<QuestionGroup> QuestionGroups { get; set; }
}
public class QuestionGroup
{
public virtual int Id { get; set; }
public virtual string GroupName { get; set; }
public virtual int QuestionnaireId { get; set; }
public virtual IList<Question> Questions { get; set; }
}
public class Question
{
public virtual int Id { get; set; }
public virtual string QuestionText { get; set; }
public virtual int QuestionGroupId { get; set; }
public virtual QuestionGroup QuestionGroup { get; set; }
}
WCF DataServicesを介してWebUIでこれらのエンティティにアクセスしており、これらのエンティティのビューで入力を処理するためのベストプラクティス(または少なくともよりクリーンな方法)を知りたいと思っています。以下は私がこれを克服するために持っているアイデアのいくつかですが、それらはただ複雑に感じているだけなので、私はそれらのどれも好きになるのに苦労しています。
解決策1
Question
と呼ばれるエンティティにプロパティを追加しSubmittedValue
、EFデータコンテキストにIgnore(m => m.SubmittedValue)
これを設定します。Question
このプロパティは、ビューレベルでの入力値を永続化するために使用するものです。
これについて私が気に入らないのは、POCOエンティティをほとんど無関係なプロパティで肥大化させることです-私はSubmittedValue
Web UIで1つのケースでのみ使用しますが、POCOエンティティは他の場所で何度も使用されます。
解決策2
POCOと同じ構造を持つビューモデルオブジェクトを作成し、それらを呼び出しましょう。これらQuestionnaireModel
はコントローラで初期化され、プロパティがPOCOからビューモデルにコピーされます。プロパティを追加し、バインディングコンテキストを調べてビューから値を取得するカスタムモデルバインダーを使用してこの値を永続化します。名前は[group.question.1]のようになります(1は質問のIDです)。 )。これは、各質問グループおよび各質問のエディターテンプレートを使用してビューに表示されます。QuestionGroupModel
QuestionModel
QuestionModel
SubmittedValue
これについて私が気に入らないのは、これらの追加のビューモデルオブジェクトでWeb UIを肥大化させ、POCOからビューモデルにプロパティ値を手動でコピーする必要があることです。AutoMapperのようなものを使用してこれを実行できることは承知していますが、これはその作業を自動化するだけであり、理想的にはまったく実行しないようにします。
解決策3
ソリューション2を少し変更して、代わりにPOCOを拡張し、virtual
コレクションのプロパティを他のビューモデルオブジェクトでオーバーライドします。したがって、私のビューモデルは次のようになります。
public class QuestionnaireModel : Questionnaire
{
public new IList<QuestionGroupModel> QuestionGroups { get; set; }
}
public class QuestionGroupModel : QuestionGroup
{
public new IList<Question> Questions { get; set; }
}
public class QuestionModel : Question
{
public string SubmittedValue { get; set; }
}
私はこのアイデアが一番好きですが、実際にはまだ試していません。私はここで両方の長所を1.POCOを自分の視野から遠ざけることができ、2。その1回限りの使用プロパティSubmittedValue
をビジネスレイヤーから遠ざけることができます。
これを処理するためのより良い方法を持っている人はいますか?