私はこの投稿との議論を求めています。
C#4.0の動的機能をレガシーシステムに組み込むことを検討しています。私の明示的な例は、データレイヤーでRobConneryのMassiveを使用することです。しかし、私の質問は、プロパティ間にマッピングがあるように、動的オブジェクトが既存の強く型付けされたビジネスオブジェクトと相互作用する必要があるすべての場所に当てはまります。
次の2つの(簡略化された)メソッドを使用して、静的(具象)オブジェクトとエキスパンドオブジェクトとの間の変換を自動化できます。
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コードベースに現実的に追加することはできません。たぶんそれは最初から組み込まれなければならないか、まったく組み込まれていません。