2016-11-03 229 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()或我有一個循環,一個堆棧溢出...

什麼好SOLU重刑?

+0

「我有一個循環和堆棧溢出......」什麼?你的循環在哪裏?或者你的意思是你有無盡的遞歸導致'StackOverflowException'?無論如何,你的問題似乎是XY-問題。你爲什麼從'SaveChanges'內部調用'SaveChanges'?這看起來像是一個破碎的設計。你不應該(也不能)指出在繼承鏈中調用哪種方法,它是最能派生的方法。做一些不同的事情會破壞面向對象的原則。 – HimBromBeere

回答

1

擴展方法隱藏了real問題在於您試圖從外部調用重寫的方法,這是不可能的。由於實際的對象是ChildDbContext,所以重寫的方法將由SaveChangesWithLogging調用。沒有辦法從SaveChangesWithLogging中調用「基本」方法 - 即使您在方法之後執行此操作。

我建議重新安排您的調用層次結構,以便可以從派生方法調用基方法,或者使用非虛方法以便可以直接調用基方法。

0

最後,我爲我的dbcontext使用了一個包裝器。