11

以下のことを行ってもよろしいでしょうか? ビューでドメイン モデルを使用してはならないことはわかっていますが、ビュー モデルでドメイン モデルを使用しても問題ありませんか? 一部の非常に小さなモデルでは、View Model を作成して管理する価値がないように思われます。

例えば

public class LoginDomainModel
{
    public string Email { get; set; }
    public string Password { get; set; }
    public string DisplayName { get; set; }
    public long UserTypeID { get; set; }      
    public virtual UserType UserType { get; set; } 
}
public class UserTypeDomainModel
{
    public UserType()
    {
        this.Logins = new List<Login>();
    }
    public long UserTypeID { get; set; }
    public string UserType { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Login> Logins { get; set; }
}

public class LoginViewModel
{
    public string Email { get; set; }
    public long UserTypeID {get; set;}

    //Right here
    public List<UserTypeDomainModel> UserTypesSelectList {get; set;}
}
4

3 に答える 3

9

個人的には、ドメイン モデルが自然にぴったり合う場合は、ビューでドメイン モデルを使用します。これは、本質的に CRUD である (ドメイン エンティティを簡単な方法で編集する) 些細なプロジェクトでのみ発生する可能性があります。純粋さのためにドメイン エンティティの正確なコピーを作成するのは時間の無駄だと思います。

ビューのニーズを考慮して、ドメイン モデルを少しも変更することはありません。私のプロジェクトの 95% 以上で、これが私自身が直面している状況です。

于 2013-02-23T20:47:22.100 に答える
1

私は長い間、ビュー モデルとドメイン モデルが分離されていることによる重複の認識に苦しんでいました。それらは異なる目的を意図しているため、実際には重複していませが、非常に多くの同様のプロパティを宣言するのは「間違っている」と感じています。

非常に小規模なプロジェクト (特に、認証されたユーザーの非常に信頼できるグループを含むプロジェクト) では、ドメイン モデルに直接バインドするだけで完了です。または、ビューモデルに別の構造が必要な場合は、組み合わせて一致させることができます(@Eric J.が説明しているように)。

ただし: ModelBinder は、リクエスト内の値をモデルのプロパティに一致させようとします。これは、ドメイン モデルの任意のプロパティが (不正な) 要求によって設定される可能性があることを意味します。これを防ぐ方法はいくつかありますが、私にとっては、別のビュー モデルを作成する少し余分な労力よりも安心感の方が重要です。

読み取り専用のバインドされていない値用に別のビュー モデルを作成する絶対的な必要性はわかりません (おそらく、あなたのケースではユーザー タイプのリストですが、public virtual ICollection<Login> Loginsこれを否定することもできます)。

または、ドメイン モデルを UI 指向の抽象化 (例: ) に投影することもできますIEnumerable<SelectListItem>。さまざまな入力メカニズムに使用できるSelectListItemsため、特定の UI 動作に縛られることはありません。

抽象化を行っても、リクエストに不正な値が含まれていないことを検証する必要がある場合があります。たとえば、スーパー管理者だけが特定のUserTypeDomainModelID を割り当てることができる場合があります。抽象化に関係なく、これを検証する必要があります。

TLDR:実用的な範囲でドメイン モデルを抽象化し、適切な抽象化 (新しいビュー モデルが常に正しいとは限りません) を見つけ、入力の検証について (やや偏執的) であること。

于 2013-02-23T21:03:11.887 に答える
1

「ドメインモデル」の意味によって異なります。EFエンティティのことですか?それとも、ビジネス層オブジェクトですか?

特に既定のモデル バインディングを使用している場合は、EF エンティティをビューに渡すことはお勧めできません。注意しないと、セキュリティ上の問題が発生する可能性があります。ただし、ビューに渡されるビジネス オブジェクトに注意しないと、同じ問題が発生する可能性があります。

ビュー モデルの大きな利点の 1 つは、データのマッピングをより細かく制御できることです。そのため、正しいマップのみが発生することをより簡単に検証できます。

ただし、すべてはアプリ次第です。単純なアプリの場合は、より複雑なマッピングを行う手間がかからない可能性があります。それが複雑なアプリであり、長期間存続する必要があり、頻繁に更新される可能性が高い場合は、間違いなく労力を投資する必要があります.

于 2013-02-23T21:03:48.227 に答える