使用相同的继承方法名继承多个基类

本文关键字:继承 基类 方法 | 更新日期: 2023-09-27 18:16:08

注:我是相当新的c# . net MVC和实体框架,并在一个现有的项目工作。在这个项目中,我有以下类:

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),在我的mvapplication '中像这样实例化:

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和能够使用它在我的UnitTests。)

因为using中的对象应该是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关键字,所以它会使用DbContext.Dispose()是正确的处理方式?还是我做错了什么?

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

使用相同的继承方法名继承多个基类

你可以去掉你的dispose因为你已经从IDisposable中得到了它所以把你的界面改成这样:

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

这是因为您已经使用IDisposable使IMyDbContext一次性,因此您不需要再次显式添加。编译器警告您,如果有两个Dispose而没有显式地告诉用户原因,您正在做一些奇怪的事情。

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

如果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
    {
    }
}