2

EF-CodeFirstを使用して、Pocoオブジェクトとその構成からデータベースを作成しています。Dataannotation(Required、DataLength、RegularExpression、DataType)を頻繁に使用してメタデータをMVCに取得し、後でローカライズするためのリソースを指すエラーメッセージを表示しました。

単純なCRUD操作の場合、これは問題ではありません。

しかし、ViewModelクラスが必要になるとすぐに、PocoオブジェクトからDataannotationsを失います。

DRY(繰り返してはいけない)の原則を損なうことなく、これら2つのデザインをどのように組み合わせることができますか?

ありがとうアンドレアス

4

2 に答える 2

4

これらの2つのデザインを組み合わせることはできず、組み合わせるべきではありません。ビューモデルはビューに関連付けられているため、個人的にはビューモデルに必要なすべての属性を再定義し、この場合はDRYを気にしないと信じています。これを行うのは、ビューの要件が頻繁に変更されるためです(ええ、顧客は気まぐれです)が、私は常に同じドメインモデルを再利用しています。私にとって、ビューはドメインモデルの存在について決して知らないはずです。ビューはダミーである必要があり、知っておく必要があるのは、コントローラーによってビューに渡されるビューモデルだけです。

違う考えを持っている人もいると思いますので、その意見を尊重します。つまり、これを言うことで、私は自分の個人的な視点とASP.NETMVCでの作業方法を公開しているだけです。正直に言うと、私のモデルはDataAnnotationsのないPOCOオブジェクトなので、このような問題は発生しません。ビューモデルでDataAnnotationsを使用するのは、書式設定の目的(、、など)のみでDataTypeありDisplayNameDisplayFormat検証属性は使用しません。私はこの目的のためにFluentValidation.NETを使用しています。

于 2011-02-13T20:00:13.177 に答える
2

あなたはあなたが求めていることをかなり簡単に達成することができます。ダリンには非常に有効な点があり、大規模なプロジェクトにも当てはまりますが、小規模なプロジェクトではやり過ぎのように思えます。また、検証にDataAnnotationsを使用しているか、サードパーティのライブラリを使用しているかに大きく依存しているようです。これを行わないことに伴う繰り返しは、かなりのメンテナンスの妨害になります、IMHO。DBからビューモデルにデータをコピーするだけで多くのコード行を費やすという事実もあります。ORMはそれを排除するのに役立つはずですが、これまでのところ、解決策はあまり良くないようです。

これは、あなたが望むことを行う方法に関するコードの抜粋の例です。最初のクラスは部分的であり、本体はEFで生成されたコードに含まれています(コードを最初にではなく、モデルを最初に使用します)。また、例として、QuestionにはQuestionGroupへのFKがあります。DBではこれはGroupIDという名前の列ですが、ViewModelには素敵な小さなグリッドに表示するためのGroupNameという名前のプロパティがあります(実際には、EFオブジェクトを渡そうとすると基本的に壊れます)。

[MetadataType(typeof(QuestionMetadata))]
public partial class Question
{
}

public class QuestionMetadata
{
    public Int32 ID { get; set; }

    [Required]
    [Display(Name="Question")]
    public String QuestionText { get; set; }

    [Display(Name = "Order")]
    public Int16 SortOrder { get; set; }
}

[MetadataType(typeof(QuestionMetadata))]
public class QuestionViewModel
{
    /* Fields found in the original model */

    public Int32 ID { get; set; }

    public String QuestionText { get; set; }

    public Int16 SortOrder { get; set; }

    /* Fields that map child object data for this view model */

    [Display(Name = "Question Group")]
    public String GroupName { get; set; }
}

私見では、EFとTelerikの両方が、ここではあまり乾燥しないように強制していますが、私にできることは何もありません。EFは、デフォルトでこれらのDataAnnotationsを生成する必要があります(または少なくともオプションがあります)。これは、必要なフィールド(nullではない)またはさまざまな文字列の最大長が明らかにわかっているためです。次に、TelerikはViewModelを作成するように強制しますが、これも苦痛です。

于 2011-05-04T13:00:10.313 に答える