使用相同的继承方法名继承多个基类
本文关键字:继承 基类 方法 | 更新日期: 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.Dispose
和IMyDbContext.Dispose
的意思相同,只需执行以下操作:
public interface IMyDbContext : IDisposable
{
... // Some properties
// You get Dispose() from `IDisposable`
}
如果IDisposable.Dispose
和IMyDbContext.Dispose
意味着不同的东西(需要不同的实现)使用显式接口实现
public class MyDbContext : DbContext, IMyDbContext
{
public MyDbContext() : base("name=SQLAzureConnection")
{
}
IMyDbContext.Dispose() // Implement it via explicit implementation
{
}
}