StackOverflowでAutoMapperを探すたびに、ValueInjecterについて何かを読んでいます。
誰かが長所と短所(パフォーマンス、機能、APIの使用法、拡張性、テスト)を教えてくれませんか?
StackOverflowでAutoMapperを探すたびに、ValueInjecterについて何かを読んでいます。
誰かが長所と短所(パフォーマンス、機能、APIの使用法、拡張性、テスト)を教えてくれませんか?
回答:
ValueInjecterの作成者として、シンプルで非常に柔軟なものが欲しかったので、それを行ったと言えるでしょう。
私は本当にたくさん書いたり、たくさん書いたりするのが好きではありませんmonkey code
:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecterはプラグインを備えたmozillaのようなもので、 ValueInjectionsを作成して使用します
平坦化、非平坦化のための組み込みの注入があり、一部は継承を目的としています
アスペクトタイプの方法でより効果的に機能します。すべてのプロパティを1対1で指定する必要はなく、代わりに次のようにします。
名前が「Id」で終わるすべてのintプロパティをソースから取得し、値を変換して、Idサフィックスのない同じ名前のソースオブジェクトのプロパティにそれぞれ設定します。そのタイプはEntityから継承されます。
明らかな違いの1つは、ValueInjecterがフラット化と非フラット化のあるWindowsフォームでも使用されることです。
(オブジェクトからフォームコントロールへのマッピングとその逆)
オートマッパー、Windowsフォームでは使用できません、展開解除はありませんが、コレクションマッピングのような優れた機能があるため、ValueInjecterで必要な場合は、次のようにします。
foos.Select(o => new Bar().InjectFrom(o));
あなたもからマップするためにValueInjecterを使用することができ、匿名と動的なオブジェクト
違い:
マッピングの可能性ごとにautomapper create構成CreateMap()
valueinjecterは、任意のオブジェクトから任意のオブジェクトに注入します(オブジェクトからvaluetypeに注入する場合もあります)
オートマッパーはフラット化を組み込んでおり、シンプルなタイプまたは同じタイプのみを対象としており、フラット化を解除しません
valueinjecterあなたはあなたがそれを必要とする場合にのみtarget.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
、あなたがからしたい場合Foo.Bar.Name of type String
にFooBarName of type Class1
あなたがFlatLoopValueInjectionを継承し、これを指定します
automapperはデフォルトで同じ名前のプロパティをマップします。それ以外の場合は、1つずつ指定し、Prop1.Ignore()、Prop2.Ignore()などを実行する必要があります。
valueinjecterには、同じ名前とタイプのプロパティを実行するデフォルトの注入.InjectFrom()があります。それ以外の場合は、たとえば、タイプFooのすべての小道具からタイプバーのすべての小道具まで、アスペクトに似た個別のマッピングロジック/ルールを使用してカスタム値インジェクションを作成します
<pedant>
かっこいいですが、おそらくValueInjectOrでしょうか?</pedant>
他のツールを使用したことがないので、AutoMapperについてのみ説明します。AutoMapperの構築には、いくつかの目標がありました。
これらのことを実行したい場合、AutoMapperは非常にうまく機能します。AutoMapperがうまくいかない点は次のとおりです。
その理由は、私がこれらのことをする必要がなかったからです。ほとんどの場合、エンティティにはセッターやコレクションが公開されていないなどの理由で、そこにはありません。AutoMapperを使用してDTOにフラット化し、UIモデルからコマンドメッセージなどにマップします。それは私たちにとって本当にうまくいくところです。
私は両方を試してみましたが、とてもシンプルなのでValueInjecterを好みます:
myObject.InjectFrom(otherObject);
私の注射のニーズの大部分について知っておくべきことは、これですべてです。これほどシンプルでエレガントになることはありません。
this object
そこに拡張方法?
InjectFrom()
拡張メソッドを自分で実装する必要があります。
これは私も調査してきた質問であり、私のユースケースでは、バリューインジェクターの手がかりのようです。使用する前にセットアップする必要はありません(パフォーマンスに影響する可能性がありますが、スマートに実装すると、毎回反映するのではなく、将来の呼び出しのためにマッピングをキャッシュすることができます)。したがって、使用する前にマッピングを事前定義する必要はありません。
ただし、最も重要なのは、逆マッピングが可能なことです。ここで、ジミーが必要なユースケースがないと述べているので、ここで何か不足している可能性があります。パターンが間違っている可能性がありますが、私のユースケースでは、ORMからViewModelオブジェクトを作成しています。次に、これを自分のWebページに表示します。ユーザーが完了したら、ViewModelをhttppostとして戻す場合、これを元のORMクラスに変換するにはどうすればよいですか?自動マッパーでパターンを知りたいです。ValueInjectorを使用すると、それは取るに足らないことであり、平坦化さえされません。例:新しいエンティティの作成
entityframeworkによって作成されたモデル(最初のモデル):
public partial class Family
{
public int Id { get; set; }
public string FamilyName { get; set; }
public virtual Address Address { get; set; }
}
public partial class Address
{
public int Id { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string TownCity { get; set; }
public string County { get; set; }
public string Postcode { get; set; }
public virtual Family Family { get; set; }
}
ViewModel(バリデータで飾ることができます):
public class FamilyViewModel
{
public int Id { get; set; }
public string FamilyName { get; set; }
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressTownCity { get; set; }
public string AddressCounty { get; set; }
public string AddressPostcode { get; set; }
}
ViewController:
//
// GET: /Family/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Family/Create
[HttpPost]
public ActionResult Create(FamilyViewModel familyViewModel)
{
try
{
Family family = new Family();
family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
db.Families.Add(family);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
私の考えでは、それよりもはるかに単純ではありませんか?
(つまり、これは私にこれに遭遇するパターンの何が問題であるか(そして他の多くの人がそうしているようです)、問題を引き起こします、それはAutoMapperにとって価値があるとは考えられていません?)
ただし、このパターンが説明どおりであり、使用したいパターンである場合、私の投票はカントリーマイル単位のバリューインジェクターです。