2011-10-10 6 views
5

私はこの記事といくつかの議論を模索しています。オブジェクトを静的オブジェクトに展開して、再び戻します。 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コードベースに現実的に追加することはできません。たぶんそれは最初から組み込まれなければならない、またはまったく組み込まれていないかもしれません。

+0

あなたは 'ExpandoObject'をまったく動かさなければなりませんか? – svick

答えて

2

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

コードを変更するのがどのようなものか、このアプローチがどれほど効果的かを考えてください。私は、ビジネスオブジェクトにプロパティを追加する必要があるとき私のために、私がしなければなりません:

  1. は テーブル
  2. がにLINQを再生成変更するDBの移行を書く
  3. オブジェクトにプロパティを追加します。 SQLファイル
  4. は、新しいプロパティ

これは苦痛であるの地図。マッシブであなたのアプローチ、あなたのマッピングヘルパーは、正常に動作しますがしなければならないわけ場合:

  1. ではありません テーブル

を変更するDBの移行を書くオブジェクトに

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

    別のアプローチは、あなたの状況でNHibernateまたはEntity Frameworkが動作するかどうかを確認することです。静的型オブジェクトで動作するように設計されています。すばやく簡単にデータにアクセスできるように設計されているような大規模な外観です。静的に型指定されたオブジェクト用に構築されるもう1つのすばやく簡単なライブラリはDapperです。使い方は簡単です。 Nugetでそれをチェックしてください。実際に、私があなたの状況を理解しているところから、私はDapperを強く考えています。

  • 関連する問題