2012-05-01 5 views
6

私はDapperマイクロOR/Mに本当に感銘を受けています。私は本当にそれをいくつかの本格的なOR/Mのサイド・バイ・サイド・コンパニオンとして使用したいと思います。それの代わりに。とにかく、データベースから階層を非直列化する戦略があれば、私は決して分かりませんでした。たとえば、レコードセット行の返されるオブジェクトは、フィールドに依存します(たとえば、NHの 'discriminator'と呼ばれます)。さらに、階層は結合を介してより多くのテーブルを分割することができるので、行を表すタイプは他のテーブルのレコードの存在に依存します。上記の2つの戦略の混在によって表される階層を持つことは、例えばNHがサポートしていないものであるが、それは「リレーショナル・ライフ」に存在する。だから質問:完全に本格的なOR/Mを置き換えるためにdapperを使用しています

  • Dapperはこのようなシナリオを処理しますか?
  • このシナリオでは、パフォーマンス面でDapperの努力が無駄になりますか?

もう1つのトピックはキャッシュです。クエリ用のDapperキャッシュは多少積極的ですが、「セッションのようなコンテキスト」を持ち、各セッションのクエリキャッシュを持っている方が良いわけではないでしょうか、これが再びDapperの主な動機を傷つけますか?私たちは本当にこのような問題を解決するために持っていなかった私たちは、このようなロジックの原因を実装に対して決め

class Post {} 
class Question : Post { .. } 
class Answer : Post { ... } 

Func<IDbDataReader, Func<IDbDataReader, Post>> factoryLocator 
     = ... my magic factory locater; 

cnn.Query<Post>(@" 
select * from Posts p 
left join Questions q on q.Id = p.Id 
left join Answers a on a.Id = p.Id", factoryLocator: factoryLocator); 

:Dapperのは、カスタムの建設・ロジックをサポートしていない現時点では

答えて

5

、私が何を求めていることは何かに似ていると思います実生活では。また、かなりの量の内部複雑さとかなりの量の外部複雑性が導入されています(post is Questionに切り替える必要があります)。

あなたが含まれていて、パッチが簡単な場合は、この種の機能を含めることには分類されません。私はDapperのフックを追加して、この種の機能を注入できるようにしています。キャッシュ戦略に関しては

、我々は一般的な使用に私たちが今までと言うことで、あなたがunparameterized SQLを生成し、Dapperのを悪用された場合にのみ発生膨満感、キャッシュを膨らませることがないことがわかります。私は完全に今使用されてConcurrentDictionaryの代わりに独自のキャッシュプロバイダを指定できるフックを追加することをサポートしています。

+0

ありがとうございます!私は、キャッシュを使用することに同意し、さらにコードを使用して、別のコードを実際に必要としないコードを探します。私は次のプロジェクトでNHからdapperに移ってしまうと、デシリアライザから注入されたパラメータを持つPOCO上に静的メソッドを持っている可能性があるので、解決しようとします。 –

+0

個人的に私はこの場合のためにコンベンション上の工場ロケータの明示を好む –

+0

これは少しパフォーマンスを傷つけませんか? –

関連する問題