Clay面白いかも!
ORM使ったリポジトリを使った場合、戻りの型って結構融通効きにくいじゃないですか。select対象のクラスを全部手書きするのかよ、って。だからといって無名クラスは戻せないじゃない。objectでリフレクションとか本末転倒。
なのでdynamicを使うことにするんですけど、そのためにLINQ selectの射影をdynamicにする簡単なヘルパーを用意しとくと便利ですね。
public static class ObjectToDynamicExtensions
{
public static dynamic ToDynamic(this object obj)
{
dynamic model = new ExpandoObject();
var properties = obj.GetType().GetProperties();
foreach (var property in properties)
{
((IDictionary<string, object>)model)[property.Name] = property.GetValue(obj, null);
}
return model;
}
}
使用例
return from person in db.People
select new {
FullName = person.FirstName +
" " +
person.LastName,
Age = ((DateTime.Today.Year*10000 +
DateTime.Today.Month*100 +
DateTime.Today.Day) -
(person.Birthday.Year*10000 +
person.Birthday.Month*100 +
person.Birthday.Day))/10000
}.ToList().ToDynamic()
使い道はこんな感じのマッピングなんですけど、ここでちょっと残念なのが、ASP.NET MVCのViewにdynamicを渡すと、ほとんどのヘルパーが機能してくれないこと。残念ですね。凹みますね。
ちゃんと型付けしとけ、っていうのはもちろんそうなんですけどね。だからScaffoldingもあるわけでして。
とは言え、柔軟な実装にしたい。単純にマッピングをしたいようなときにはClayいいかもという流れです。
dynamicをインターフェース実装のプロキシに変換してくれるみたい。そうなればもう強い型付け完了。
インターフェースは規約で判定するみたいだけど、namespaceどうするんだろ。気になる。あ、でも、Entity ModelとOutput Modelを両方共クラスにするんじゃなくて、Output Modelはインターフェースにしちゃう感じなのかな。
dynamicから特定のインターフェースに変換したくなるときって、よくあるきがしてきた!ワクワクするね!