7

私はMVCプロジェクトに取り組み始めたばかりで、問題はありませんが、オブジェクトが多すぎるスパゲッティコードをたくさん作成しているようです。プロジェクト全体が手に負えなくなる前に、このソリューションを単純化する方法を誰かが理解できますか?

わかりました、これが私の設定です:

DAL-データを取得し、データをモデルレイヤーのモデルオブジェクトに変換するためのEntityFramework接続とメソッドがあります

BLL-データをUIモデルに送り返します-これには、サイト全体で使用されるすべてのモデルオブジェクトが含まれます。これには、新しいオブジェクトを作成して変数を設定することにより、DALからのすべてがこれらのオブジェクトに変換されます。

UI-私のMVCソリューション

DAL、BLL、およびモデルは、他のソリューションでも使用されます。

現在MVCで、検証アノテーション([必須]など)を使用しようとしています。つまり、アノテーションを使用してモデルオブジェクトを再作成する必要があります。これは問題ありませんが、データをデータベースに保存し直したい場合は、クラスを変換する必要がありますが、これは面倒です。

検証アノテーションを使用するMVCモデルオブジェクトで現在のモデルクラスライブラリを使用する方法を誰かが理解できますか?

はっきりと説明していない場合はお知らせください。詳細をお知らせします。

ありがとう

4

4 に答える 4

3

理想的には、一方ではドメインモデルから、他方ではMVCモデル(実際にはViewModels )から分離する必要があります。この分離は非常に重要であり、強くお勧めします。

ViewModelには余分なものを含めることができますが、これらはほとんどの場合非常によく似ています。次に、AutoMapperを使用して一方から他方に変換できます。

例えば:

public class User // in entity DLL
{
    [Required]
    public string Name {get; set;}
}

public class UserViewModel : User // in MVC DLL
{
    public string LastVisitedPage {get; set;} // which only MVC needs to know
}

Mapper.Map<User, UserViewModel>();
Mapper.Map<UserViewModel, User>();
于 2012-05-03T11:13:46.003 に答える
1

モデルオブジェクトを再作成せずに、メタデータをメタデータオブジェクトに配置できます。これは非常に簡単な方法ですが、モデルオブジェクト自体が部分としてマークされている必要があります。この解決策がうまくいかない場合でも、それで問題ないことを願っています。

[MetadataType(typeof(PreviousResultsMetaData))]
public partial class PreviousResults
{
    public class PreviousResultsMetaData
    {
        [DisplayName("Class Ranking Score")]
        [Required]
        [Range(0.0, 100.0)]
        public object ClassRankingScore { get; set; }
    }
}

上記の例では、PreviousResultsというデータモデルオブジェクトがあり、これはいくつかのスキャフォールディングコードによって他の場所で作成されています。LINQを使用してデータベースとの間で送受信されるPOCOオブジェクトを定義します。MetadataType属性は、メタデータを保持するために使用されるクラスを示します。次に、実際のデータメンバーの名前と一致するプレーンオブジェクトを作成し、それらに注釈を付けます。

これがお役に立てば幸いです。

于 2012-05-03T11:16:10.903 に答える
0

検証にはFluentValidationフレームワークを使用できます。ここを見て

http://fluentvalidation.codeplex.com/

于 2012-05-03T11:14:07.120 に答える
0

BLL(事業体)に属性を完全に追加できます。参照を追加し、のusingステートメントを追加するだけですSystem.ComponentModel.DataAnnotations。それとは別に、IValidatableObjectインターフェイスを実装できます(これは非常に簡単です。以下を参照してください)。

マッピングには、たとえばAutoMapperを使用できるため、マッピングロジックの多くを自分で作成する必要はありません(名前マッピングの魔法を利用できる場合)。

例を検証します。

ICollection<ValidationResult> validationErrors = new List<ValidationResult>();
var validationContext = new ValidationContext(this, null, null);
Validator.TryValidateObject(this, validationContext, ValidationErrors, true);

return validationErrors;
于 2012-05-03T11:16:50.493 に答える