web-dev-qa-db-ja.com

AutoMapperを使用して、ViewModelからModelにマップを戻す必要がありますか?

AutoMapperを使用してViewModelからデータを取得し、データベースモデルに保存する必要がありますか?

反対のプラクティスはソフトウェアの優れたプラクティスであることは知っています。Automapperでデータベースモデルを抽出し、フロントエンドWebアプリケーションのViewmodelsに配置することです。

私はこの一般的な記事をここで読んでいました:この記事はAutomapperに関するものではありませんでしたが、意見が真実であるかどうかを検証したいと考えています。 https://stackoverflow.com/questions/35959968/best-way-to-project-viewmodel-back-into-model

「ViewModelからEntityにマッピングする最善の方法は、これにAutoMapperを使用しないことです。AutoMapperは、静的以外の他のクラスを使用せずにオブジェクトをマッピングするために使用できる優れたツールです。また、ある時点で、フィールドの更新、コレクションの更新などの原因を追跡できなくなります。」

5
Martin Smith51

AutoMapperは、オブジェクト間のマッピングを容易にするツールです。下層で使用されるオブジェクトにViewModelをマッピングするために使用する必要があるかどうかは、何かに基づいて決定する必要があるものではなく、その特定のマッピングに役立つかどうかです。

この場合など、ViewModelがマップ先のオブジェクトに非常に似ているアクションを処理している場合:

    public class UserVM
    {
        public string Username { get; set; }
    }

    public class User
    {
        public string Username { get; set; }
    }

その後、はい、AutoMapperは問題なく使用できます。

一方、この場合のようにマッピングにロジックが必要な場合:

    public class UserVM
    {
        public string Username { get; set; }
        public string Password { get; set; }
    }

    public class User
    {
        public string Username { get; set; }
        public string HashedPassword { get; set; }
        public string Salt { get; set; }

    }

AutoMapperを使用する必要はないと思いますが、変換を処理するために別のサービスを使用します。

いつものように、答えは次のとおりだと思います。最初にAutoMapperまたはその他のマッピングツールを考慮せずにモデルを設計してから、必要なものを実現するための最適なツールを決定する必要があります。

1
gcali

問題は外側に抽象化されるべきです、実体は正確には何ですか?定義上、一般的に参照されるインスタンス。これらのインスタンスは、多くの場合、ページモデルで表されるデータと相関していません。モデル(ページモデル)は、モデルを定義するページに関連付けられたデータを表す必要があるためです。次に、わずかな偏差に基づく過度のモデルまたは重複したモデルを回避するために、モデルビュービューモデルパターンが特定のページを表す複数のページモデルのコレクションとして浮上し始めました。

ただし、データベース内のデータは常に単純なインスタンスではなく、アプリケーションの機能のレイヤー、つまり集約を表すオブジェクトのクラスターです。

本当の質問ですが、データのフロントエンド表現は直接データベースに送るべきですか?エンティティまたは集約を直接フロントエンドに表示する必要がありますか?私の答えは「いいえ」です。フロントエンドとバックエンドの間の明確な翻訳が存在する必要があります。例:

public class Customer
{
     public int Id { get; set; }
     public string Name { get; set; }
     public IEnumerable<Order> Orders { get; set; }
}

public class Order
{
     public int Id { get; set; }
     public IEnumerable<Product> Products { get; set; }
}

フロントエンドには顧客が必要ですが、提供したモデルには注文情報も含まれています。 Entity Frameworkは、関連付けられた注文の概念を使用して顧客を構築します。これは、そのページには必要ない可能性がある余分な無関係な情報です。私にとっては、明確な翻訳がコードベースにより適しているでしょう。

それが私の意見であり、私が教えられた方法ですが、私は完全にその場から外れているかもしれません。

0
Greg