2009-07-18 13 views
0

プラットフォーム:C#2.0 使用:Castle.DynamicProxy2AOP、DataMappers、およびFactoryは連携して動作しますか?

を私は今、私のDALを書き換えるための良い戦略を見つけようとして一週間ほど苦労してきました。私はNHibernateを試してみましたが、残念ながら私のプロジェクトにはあまり適していませんでした。だから、私はこれまで、この相互作用が出ている:

私が最初に私のDTOのと私のデータマッパーを登録して起動します。それはカスタムのプロパティに属性を使用して登録されているよう

MetaDataMapper.RegisterTable(typeof(User)): 
MapperLocator.RegisterMapper(typeof(User), typeof(UserMapper)); 

これは、各DTOをマップ基本的にDTO:

[Column(Name = "UserName")] 

私は、このタイプのため、それはUserMapperになるので、各DTOに属しマッパーを持っています。このデータマッパーは、私のADO.Netラッパーを呼び出し、その結果をDTOにマッピングします。しかし、私は深いローディングとその後の遅延ロードを可能にしているので、私はどこにいるのですか。基本的に私のUser DTOにはAddressオブジェクト(FK)があるかもしれませんが、そのオブジェクトには別のマッパーが必要ですが、実行時にAddressMapperを使用するかどうかを判断する必要があります。

私の問題は、どのマッパーを返すかを決める必要があるたびに、そのリストを明示的に調べなくても型を処理することです(リストを更新しなければならないという頭痛はもちろんです)。だから、私の解決策は、上記のように登録して、すべてのデータマッパーが実装するIDataMapperインターフェイスを返すMapperLocatorクラスを持つことでした。 Userオブジェクトを扱っている場合、UserMapper型にキャストできます。ただし、実行時に返すデータマッパーの種類を判断しようとすると、これは簡単ではありません。ジェネリックスはコンパイル時に何を知っていなければならないので、AOPを使用して実行時に型を渡すことは、リフレクションを使用しないとオプションではありません。 DTOをテーブルにマッピングしたり、属性などを読み込んだりするとき、私はすでにかなりの反省をしています。私のMapperFactoryは反射を使って適切なデータマッパーをインスタンス化します。だから私は、これらの高価な電話をできるだけ抑えるために、これを反映させようとしています。

私は解決策がインターフェイスを回って見つかると思っていましたが、私はまだその考えを実装することができませんでした。だから、私はそのソリューションがデリゲートの使用にあると思っていましたが、そのアイデアを実装する方法はわかりません。だから...率直に言って...私は迷っています。どうぞ、助けてください。

答えて

1

私はいくつかのことを提案します。

1)時期尚早に最適化しないでください。 *マッパーをインスタンス化するためにリフレクションを使用する必要がある場合は、リフレクションで行います。そのようなことをしないことで自分自身を引き起こしている頭痛を見てください。後で問題が発生した場合は、より速い方法があるかどうかを調べるためにそれらのプロファイルを作成してください。

2)自分の質問には、なぜあなた自身のDALフレームワークを実装しようとしているのでしょうか?あなたは、NHibernateがうまくないと言いますが、あなたはそれについて詳述しません。あなたは何十ものORMを試しましたか?あなたの基準は何ですか?あなたの投稿されたコードは、Linq2Sqlのマッピングと非常によく似ています。

LightspeedとSubSonicはどちらも素晴らしい軽量ORMパッケージです。 Linq2Sqlは、使いやすいマッパーであり、Microsoftのエンティティフレームワークもあります。これは、あなたが説明している問題をMicrosoftが全面的にサポートしています。

自分で実装するのではなく、これを見ることで、保守に賢明な時間を節約することができます。私は非常に私が言及したもののいずれかをお勧めします。

関連する問題