[英]C# inherited casting members
我正在为我的实体框架数据库上下文类创建基类。 在基类中,我需要访问DbContext,在派生类中,我需要访问派生的DbContext。 目前,我有以下代码:
public abstract class BaseClass: IDisposable
{
protected abstract DbContext BaseContext { get; }
public void Dispose()
{
if (BaseContext != null)
{
BaseContext.Dispose();
}
}
}
public class DerivedClass : BaseClass
{
DerivedContext context; // public class DerivedContext: DbContext
protected override DbContext BaseContext
{
get
{
return context;
}
}
}
这是正确的方法吗?
我会建议更像
public abstract class BaseClass<TContext> : IDisposable
where TContext : DbContext
{
//not abstract
protected TContext Context { get; private set; }
}
public class DerivedClass : BaseClass<DerivedContext>
{
....
}
在您的基类中,您可以访问DbContext的所有成员,在DerivedClass中,您可以访问DerviedContext的所有成员而无需强制转换。
根据您需要在派生类中执行非常特殊的操作的数量,您也可以首先使用通用方法。 从此您也可以继承。
public class BaseClass<TContext> : IDisposable
where TContext : IContext
{
public TContext Context { get; private set; }
public void Dispose()
{
if (Context != null)
{
Context.Dispose();
}
}
public BaseClass(TContext context)
{
this.Context = context;
}
}
public interface IContext : IDisposable
{
}
public ChildClass : BaseClass<MyContext>
{
public ChildClass(MyContext context)
: base(context)
{
}
}
在某种程度上取决于您期望如何使用它。 您发布的代码将始终将派生上下文与派生类的实例一起使用,而基础上下文则与基类一起使用。
// This code gets an instance of the DerivedContext.
BaseClass myBase = new DerivedClass();
DbContext myContext = myBase.BaseContext;
如果这是您打算的工作方式,那么您将使用正确的方法。
您不希望域对象取决于dbcontext。 该域应该不了解dbcontex。 回答您的问题:不,这不是“正确的”。
您可能拥有的是围绕域对象分层的一系列组件,这些组件使用dbcontext加载/保存实体。
至少您的IDisposable
实现有待改进。 您应该执行以下操作:
IDisposable
示例:
public class BaseClass : IDisposable
{
private bool _disposed = false;
protected DbContext Context { get; }
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// Check to see if Dispose has already been called.
if (!this._disposed)
{
// If disposing equals true, dispose all managed
// and unmanaged resources.
if (disposing)
{
// Disposes managed resources here
if (this.Context != null)
{
this.Context.Dispose();
}
}
// Disposes unmanaged resources here
// NOTHING HERE
// Note disposing has been done.
this._disposed = true;
}
}
}
对于DBContext
本身,取决于您打算如何使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.