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

时间:2014-08-01 09:27:44

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

注意:我是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并且能够在我的UnitTests中使用它。)

由于使用中的对象应为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,因此我自己在usingDb.Dispose()使用finally-case。不过,我更喜欢自己继承IDisposable而不是那个选项。

2 个答案:

答案 0 :(得分:2)

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

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

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

摘要:只需将其删除,您就是金色的!

答案 1 :(得分:0)

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

    }
}