2016-08-19 12 views
1

オブジェクト(PersonModelからPersonViewModelなど)間のマッピングを行う必要があり、これを行うためのさまざまなアプローチについて研究しています。具体的には、Entity Frameworkを使用して、生成されたモデルをビューモデルにマップしようとしています。.NETのObject-Objectマッピングのさまざまなアプローチは何ですか?

しかし、私はあなたがこれを行う方法のリストをコンパイルする記事またはリソースをまだ見つけていません。これまでのところ、私が渡って来て、以下:

  • 暗黙的な変換
  • 拡張メソッド(私はこれが最も基本的なアプローチだと思いますが、手動で別のオブジェクト、そのシンプルだが退屈からプロパティをマップするので?)
  • 反射が(私は少し手を加えてきましたが、唯一の非常に基本的なマッピングを管理)(まだこれで働いていない)
  • Automapper(非常に人気が、私はそれがEFでうまく動作することトラブルを抱えています)
  • バリューインジェクタ(これはまだ動作していません)
  • エミットマッパーが(まだこれで働いていないが、おそらく私は悩み、それはEFで動作することを持っているでしょう?)

あなたが指摘し、プロとしてだけでなく、そこに利用可能なアプローチについて詳しく説明助けてください/それぞれの短所?たとえば、Automapperが手動マッピングに比べて遅いと言われているものがあります。あるいは、これに取り組む記事を指摘してください。

EDIT:Automapper: How to map IList to EntityCollection

+0

あなたは全記事または書籍の章について尋ねています。 SOはQ&Aサイトです。また、AutomapperはEFで動作するのに問題はありません。主に、EFによって返されるオブジェクトは普通のオブジェクトです。 'EntityCollection'のようなEF固有のクラスを使用すると、間違ったことが起こります。すべてのチュートリアルをチェックすると、最も基本的な 'ICollection ' –

答えて

2

まあ、私は、あなたを行うにはかなりシンプルな独自のマッピングを行う方法を与えることができ、迅速に実行することができますいくつかは、私はAutoMapperを持っているものの問題尋ねるかもしれないので、これを参照してください。大量のデータに対して私は何をしたらいいのかを見せて、どうして私が何をするのかを詳しく説明しよう。ここに行く:

public class PersonViewModel 
{ 
    public static Expression<Func<Person, PersonViewModel>> FromPerson 
    { 
     get 
     { 
      return p => new PersonViewModel 
      { 
       Name = p.FirstName, 
       SurName = p.LastName 
      }; 
     } 
    } 

    public string Name { get; set; } 
    public string SurName { get; set; } 
    public static PersonViewModel CreateViewModel(Person original) 
    { 
     var func = FromPerson.Compile(); 
     var vm = func(original); 

     return vm; 
    } 
} 

今、あなたは私が人EFモデルからのViewModelに変換する2つの方法を持っていることに気づくでしょう。 Expression>を使用する最初のものは、Select()ステートメントで大量のオブジェクトを変換するために使用されるためです。簡単な使用方法:この場合

return people.Select(PersonViewModel.FromPerson); 

我々は、おそらくDBからPersonオブジェクトのコレクションを取得し、リストか何かで、たとえば、それらを表示する必要がありますが、ViewModelにを使用してきました。このようにして、操作はバルクで実行され、他の方法ですべてのオブジェクトを単純に作成するよりもはるかに高速です。これで、静的なCreateViewModelメソッドを使用して、必要に応じて単一のオブジェクトをマップできます。たとえば、DBから単一のユーザーのデータを取得して表示する必要があり、ViewModelを使用する場合です。その場合、主に一括変換のための式ではなく、静的メソッドを使用するのが適切です。

AutoMapperを使って何が問題なのかを疑うのは別として、それはかなり簡単ですし、EFと並んで問題を詳しく説明していないので、これは私が提供できるものです。これがあなたの問題の少なくとも少し助けてくれることを願っています:)

+0

を使用していることがわかります。 'CreateViewModel'が' FromPerson'を使ってコードの重複を減らすことを提案します。ほとんどすべての現実のマッピングはDRY(Do not Repeat Yourself)原則を適用することでより多くの特性を持つでしょう。 – Phil1970

+0

ああ、あなたが正しいです、私はそれを瞬時に書いて以来、実際にそれを忘れました、修正のおかげで、それを修正します。 –

関連する問題