【问题标题】:Extension methods and inheritance扩展方法和继承
【发布时间】:2017-03-16 18:25:46
【问题描述】:

首先,我有一个 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() 或者我有一个循环和堆栈溢出...

什么是好的解决方案?

【问题讨论】:

  • “我有一个循环和堆栈溢出......”什么?你的循环在哪里?或者你的意思是你有一个无尽的递归导致StackOverflowException?无论如何,您的问题似乎是 XY 问题。你为什么要从SaveChanges 内部打电话给SaveChanges?这似乎是一个破碎的设计。您不应该(也不能)指出在继承链中调用哪个方法,它总是是最派生的。做一些不同的事情会破坏 OOP 原则。

标签: c# entity-framework inheritance extension-methods


【解决方案1】:

扩展方法隐藏了真正的问题是你试图从外部调用一个被覆盖的方法,这是不可能的。由于实际 对象是ChildDbContext,因此被覆盖的方法将由SaveChangesWithLogging 调用。无法从 SaveChangesWithLogging 中调用“基本”方法 - 即使您在方法之前或之后强制转换它。

我建议重新排列调用层次结构,以便可以从派生方法调用基方法,或者使用非虚拟方法以便可以直接调用基方法。

【讨论】:

    【解决方案2】:

    最后,我为我的 dbcontext 使用了一个包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多