2011-01-05 4 views
2

SCADAデータベースの回りにラッピングライブラリを作成しています。私は小さなヒッピーコードデザインの質問を受け取りました。これは、提供されたDBオブジェクトをPOCOに変換する方法を含みます。単一のタイプから別のPOCOを作成する

ベンダーの.NETライブラリを使用してDBを呼び出しています。

DBを呼び出すと、タイプDBObjectのオブジェクトが戻されます。これはデータベース内のあらゆるものを表すことができ、それが保持する情報には非常に一般的です。すべてのカスタム情報はDBObject.GetProperty()メソッド呼び出しでDBからアクセスされます。これは、DBへの接続をアクティブにする必要があります。

私はこの基本的なDBObjectをさまざまな異なるPOCOに変換して、WCFやその他の技術を介してそれらを渡すことができます。

現在、私は基本、私はすべてのPOCOの含まれるようにするプロパティとPOCOへDBObjectからこの作成を行いInternalFromDBObject(DBObject obj)と呼ばれる保護された仮想メソッドの数を持っていScadaObjectという抽象基底クラスを持っています。

派生した型では、このメソッドをオーバーライドして、最初の呼び出しでbase.InternalFromDBObject(obj)を呼び出してから、カスタム/特定の情報を読み込みます。私はその後、そのPOCOの新しいインスタンスを返すFromDBObject()と呼ばれるPOCOの静的メソッドを持っています。

これは良い方法ですか?工場を使うのは大変なことではありませんので、それが合うかどうかわかりません。私が使用できる他のデザインパターンはありますか?

+0

は、私が持っているほとんどのアプローチと同じくらい痛いようです見た:( – leppie

答えて

0

あなたはpocoクラスを作成することはできません。pocoに、返されたDBObjectの名前と型に一致するパブリックプロパティを追加するだけです。次に、DBObjectの1つ(とコレクション)を取得し、ポコを1つ(またはコレクション)を返す外部の静的クラスを作成できます。

static class ScadaTOPoco 
{ 
    public static TPoco Create<TPoco>(DbObject sb){...} 
    public static IEnumerable<TPoco> Create<TPoco>(IEnumerable<DbObject> sb){...} 
} 

各メソッド内部ができる:各プロパティ上及び使用DBOBJECTによってPOCO

  • ループ上のパブリックプロパティのリストを取得する

    • インスタンス化POCO
    • 使用リフレクション.GetPropertyはターゲットpocoオブジェクトの値を割り当てます。 Convert.ChangeTypeを呼び出すことによって値を変換して、ターゲットプロパティタイプで適切に変換するようにしてください。

    SCADAでのプロパティ名は、.NET命名convenctionに適合しない場合は、.NETにSCADAからマップするために、いくつかの規則を埋め込むことができますが...

  • 関連する問題