プラットフォーム: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は反射を使って適切なデータマッパーをインスタンス化します。だから私は、これらの高価な電話をできるだけ抑えるために、これを反映させようとしています。
私は解決策がインターフェイスを回って見つかると思っていましたが、私はまだその考えを実装することができませんでした。だから、私はそのソリューションがデリゲートの使用にあると思っていましたが、そのアイデアを実装する方法はわかりません。だから...率直に言って...私は迷っています。どうぞ、助けてください。