2016-11-03 31 views
1

まず、私がログに保存するDbContextクラスの拡張メソッドを持っています。拡張メソッドと継承

public static int SaveChangesWithLogging(this DbContext context, NLog.Logger logger) 
{ 
    //logging 
    //[...] 

    return context.SaveChanges(); 
} 

その後、私はdbcontext、どこで、私はSaveChangesメソッドを(上書きから継承するクラスを持っている)

public class ChildDbContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     //other stuff 
     //[...] 

     //doesn't work, no definition for SaveChangesWithLogging (extension method not found, why ?) 
     return base.SaveChangesWithLogging(); 


     //doesn't work, loop on SaveChanges by extension method and stack overflow as a result 
     return base.SaveChangesWithLogging(); 
    } 
} 

私は基本DbContextクラスのSaveChangesメソッドを()呼び出したいが、それはChildDbContextのSaveChangesを()を呼び出すか、私はループとスタックオーバーフローを持っている...

が良いソリュー何ですか?

+0

"ループがあり、スタックがオーバーフローしています..."あなたのループはどこですか?または、あなたは 'StackOverflowException'を引き起こす無限の再帰を持っているということですか?とにかくあなたの問題はXY問題のように思えます。なぜ 'SaveChanges'内から' SaveChanges'を呼び出すのですか?これは壊れたデザインのようです。継承チェーンでどのメソッドを呼び出すべきかを指定してはいけません(そして、できません)。違うことをすることは、OOP原則を破るでしょう。 – HimBromBeere

答えて

1

拡張メソッドが隠している問題は、あなたが外部からオーバーライドされたメソッドを呼び出そうとしていることです。これは不可能です。 実際のオブジェクトはChildDbContextなので、オーバーライドされたメソッドはSaveChangesWithLoggingによって呼び出されます。メソッドの後にキャストしたとしても、 "ベース"メソッドをSaveChangesWithLoggingから呼び出す方法はありません。

派生したメソッドから基本メソッドを呼び出すことができるように、または基本メソッドを直接呼び出すことができるように非仮想メソッドを使用するように、呼び出し階層を並べ替えることをお勧めします。

0

最後に、私はdbcontextのラッパーを使用します。

関連する問題