【问题标题】:Inherit multiple base classes with the same inherited method-name使用相同的继承方法名继承多个基类
【发布时间】:2014-08-01 09:27:44
【问题描述】:

注意:我对 C# .Net MVC 和 Entity Framework 还很陌生,并且正在开发一个现有项目。在这个项目中,我有以下课程:

public class MyDbContext : DbContext, IMyDbContext
{
    public MyDbContext() : base("name=SQLAzureConnection")
    {
    }

    ... // Some IDbSet properties

    ... // Some methods
}

还有如下界面:

public interface IMyDbContext
{
    ... // Some properties

    ... // Some methods
    void Dispose();
}

在我使用的一种方法中:

using(IMyDbContext usingDb = MvcApplication.dbContext())
{
    // Some query with usingDb
}

MvcApplication.dbContext() 是一个委托(Func),它在我的 MvcApplication` 中像这样实例化:

public class MvcApplication : System.Web.HttpApplication
{
    // Delegate Func to create a new IMyDbContext instance
    public static Func<IMyDbContext> dbContext;
    public static MyDbContext dbContextInit()
    {
        return new MyDbContext();
    }

    ... // Some other fields

    protected void Application_Start()
    {
        ...

        dbContext = dbContextInit();
    }
}

我有这个委托的原因是为了短暂的 DbContext 并且能够在我的单元测试中使用它。)

由于使用中的对象应该是Disposable,所以我修改了我的界面如下:

public interface IMyDbContext : IDisposable
{
    ... // Some properties

    ... // Some methods
    void Dispose();
}

一切正常,除了我收到以下警告:

'MyNamespace.Model.IMyDbContext.Dispose()' hides inherited member
'System.IDisposable.Dispose()'. Use the new keyword if hiding was intended.

这是否意味着我应该使用:new void Dispose(); 而不是 void Dispose()?我让它继承IDisposable 的唯一原因是我可以在using 中使用它。所以我猜new-keyword 所以它会使用DbContext.Dispose() 是处理这个的正确方法吗?还是我做错了什么?

我还读过我可以只使用try-finally 而不是using,所以我自己在finally-case 中使用usingDb.Dispose()。不过,我更喜欢自己继承 IDisposable 而不是那个选项。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework inheritance multiple-inheritance


    【解决方案1】:

    您可以在您的界面中删除您的 dispose,因为您已经从 IDisposable 获取它,所以只需将您的界面更改为:

    public interface IMyDbContext : IDisposable
    {
        ... // Some properties
    }
    

    这是因为您已经使用 IDisposable 使您的 IMyDbContext 一次性使用,因此您无需再次显式添加。编译警告您,您在没有明确告诉用户原因的情况下拥有两个 Dispose 正在做一些奇怪的事情。

    总结:只要去掉它,你就是金子!

    【讨论】:

      【解决方案2】:

      如果IDisposable.DisposeIMyDbContext.Dispose 意思相同,只需执行以下操作:

      public interface IMyDbContext : IDisposable
      {
         ... // Some properties
         // You get Dispose() from `IDisposable`
      }
      

      如果IDisposable.DisposeIMyDbContext.Dispose 表示不同的东西(需要不同的实现)使用显式接口实现

      public class MyDbContext : DbContext, IMyDbContext
      {
          public MyDbContext() : base("name=SQLAzureConnection")
          {
          }
      
          IMyDbContext.Dispose() // Implement it via explicit implementation
          {
      
          }
      }
      

      【讨论】:

      • 他不需要实现它,因为它已经在DbContext中实现了。
      • @RobEpstein 对不起,我不熟悉实体框架。我给出了一个笼统的答案
      • 无忧无虑。只是想确保用户知道。 ;)
      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2011-02-19
      相关资源
      最近更新 更多