2016-04-11 9 views
0

NHibernate Fetch拡張メソッドをラップしようとしているため、NHibernateセッションが完全に壊れていない状態でそれを使用してクエリをテストできます。Cでエクステンションメソッドをラップする

私はthisのアプローチに従っていますが、これはうまくいくようですが、新しいFetchメソッドに別の名前を付ける必要があることを意味します。 (例ではEagerlyFetchが使用されています)

名前をFetchに変更すると、ラッパーがNHibernate.Linqメソッドではなく独自のFetch拡張メソッドを呼び出すため、無限ループが発生します。

誰もがこの問題を回避する方法を知っていますか?別のレベルの抽象化を追加することができますが、もう少し優雅なものがほしいと思っています。

答えて

2

できません。あなたはクラスやインタフェースを拡張する拡張メソッドを使用することができ、それらを上書きしない*

MSDN Says

インターフェイスまたはクラスメソッドと同じ名前とシグネチャを持つ拡張メソッドは、決して呼び出されません。コンパイル時には、拡張メソッドは、常に型自体で定義されたインスタンスメソッドよりも低い優先順位を持っている。*

+0

彼はバニラクラスのメソッドをオーバーライドしたくありません。彼は単に "ネイティブ"拡張メソッドの代わりに独自の拡張メソッドを使いたいだけです。彼がやりたいことは実行可能です。 –

0

自分からそれを一義化のためのホルダークラスでNHibernateの拡張子を修飾する必要があります。拡張呼び出しフォームの代わりに単純な静的メソッド呼び出しが行われますが、それはあなたのケースでは問題ではありません。

using NHibernate.Linq;  

namespace YourOwnExtensionsNameSpace 
{ 
    public static class YourOwnExtensionClass 
    { 
     public static INhFetchRequest<TOriginating, TRelated> 
      Fetch<TOriginating, TRelated>(
       this IQueryable<TOriginating> query, 
       Expression<Func<TOriginating, TRelated>> relatedObjectSelector) 
     { 
      EagerFetchingExtensionMethods.Fetch(query, relatedObjectSelector); 
     } 
     ... 
    } 
} 

はしかし、その後、名前の競合を避けるために、あなたはここであなたがあなた自身のFetchを呼び出したいファイル内の任意のusing NHibernate.Linq;を禁止しなければなりません。

すべてのeagerフェッチ拡張については、hereを参照してください。私はこの例のために最初のものを取った。

+0

これは簡単だった場合は、自分自身をキックしようとしています。ありがとう、それは試してみましょう。 –

関連する問題