5

私はこの投稿との議論を求めています。

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コードベースに現実的に追加することはできません。たぶんそれは最初から組み込まれなければならないか、まったく組み込まれていません。

4

1 に答える 1

2

したがって、静的に型指定されたオブジェクトを動的オブジェクトにマップして、Massiveで使用できるようにするだけです。これは問題ないと思います。これは、ビジネスオブジェクトをLINQからSQLオブジェクトにマッピングして、そのORMで作業できるようにするようなものです。ただし、欠点は、データベースの内外にすべてをマッピングすることになることです。これは苦痛になる可能性があります。LINQtoSQLを使用するのは私にとって苦痛です。

コードを変更することがどのようなものになるかを考えてください。そうすれば、このアプローチがどれほど効果的かを測定できます。私にとって、ビジネスオブジェクトにプロパティを追加する必要がある場合は、次のことを行う必要があります。

  1. プロパティをオブジェクトに追加します
  2. テーブルを変更するためのDB移行を記述します
  3. LINQtoSQLファイルを再生成します
  4. 新しいプロパティをマップします

これは苦痛です。Massiveを使用したアプローチでは、マッピングヘルパーが正しく機能する場合は、次のことを行う必要があります。

  1. プロパティをオブジェクトに追加します
  2. テーブルを変更するためのDB移行を記述します

悪くない。また、オブジェクトグラフはどのように処理されますか?Personテーブルと1-Mの関係を持つAddressテーブルがある場合、1人が複数のアドレスを持つことができます。どうすれば、住所を持つ人のリストを照会して取得できますか?マッピングはどのようになりますか?

もう1つのアプローチは、NHibernateまたはEntityFrameworkが状況で機能するかどうかを確認することです。これらは、静的に型付けされたオブジェクトで機能するように設計されています。Massiveは、すばやく簡単にデータにアクセスできるように設計されているように見えます。静的に型付けされたオブジェクト用に構築されたもう1つのすばやく簡単なライブラリは、Dapperです。使い方は簡単です。Nugetで確認してください。実際、私があなたの状況を理解していることから、私はダッパーを強く考えます。

于 2011-10-11T17:23:11.543 に答える