私はこの記事といくつかの議論を模索しています。オブジェクトを静的オブジェクトに展開して、再び戻します。 2つのドメインにまたがって
私は、C#4.0の動的機能をレガシーシステムに組み込むことを検討しています。私の明白な例は、データレイヤーでRob ConneryのMassiveを使用することです。しかし、私の質問は、動的オブジェクトが既存の強く型付けされたビジネスオブジェクトと対話しなければならない場所であればどこでも適用され、プロパティ間のマッピングが存在するようになります。
私は、次の2つ(簡体字)メソッドと静的(コンクリート)オブジェクトとはExpandoオブジェクトへとからの変換を自動化することができます。
public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject)
{
object instance = Activator.CreateInstance<T>();
var dict = dynObject as IDictionary<string, object>;
PropertyInfo[] targetProperties = instance.GetType().GetProperties();
foreach (PropertyInfo property in targetProperties)
{
object propVal;
if (dict.TryGetValue(property.Name, out propVal))
{
property.SetValue(instance, propVal, null);
}
}
return instance;
}
public static System.Dynamic.ExpandoObject ToExpando(object staticObject)
{
System.Dynamic.ExpandoObject expando = new ExpandoObject();
var dict = expando as IDictionary<string, object>;
PropertyInfo[] properties = staticObject.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
dict[property.Name] = property.GetValue(staticObject, null);
}
return expando;
}
しかし、今、私はいくつかの質問を持っています。
レガシーシステムでダイナミックで非ダイナミックに広がる私の試みは、私の誤解を表していますか?意味、私はダイナミックの意図に反対していますか?私は問題のために自分自身を設定していますか?
動的オブジェクトの使用は、動的オブジェクトと静的オブジェクトの間にマッピングを持たない完全に含まれているコンポーネントに限定する必要がありますか?意味は、2つの言語ドメインを混在させようとするのは悪い習慣ですか?私は悪い建築を作りますか?アンチパターン?
Massiveのようなコンポーネントの場合、ExpandoObjectと厳密に型指定されたオブジェクトの間をマッピングすることは悪い習慣であると言えば、それを私のレガシーシステムに接続する方法はありません。レガシーコードのオブジェクトをリファクタリングすることはできません。たぶんダイナミックは、従来の.Netコードベースに現実的に追加することはできません。たぶんそれは最初から組み込まれなければならない、またはまったく組み込まれていないかもしれません。
あなたは 'ExpandoObject'をまったく動かさなければなりませんか? – svick