我正在为我的实体框架数据库上下文类开发一个基类。在基类中,我需要访问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;
}
}
}
这是正确的做法吗?
答案 0 :(得分:4)
我建议更像
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的所有成员而无需强制转换。
答案 1 :(得分:1)
根据您在派生类中需要做多少非常特殊的事情,您也可以首先采用通用方法。从这里你也可以继承。
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)
{
}
}
答案 2 :(得分:0)
这在某种程度上取决于您期望如何使用它。您发布的代码将始终使用派生上下文与派生类的实例,以及基本上下文与基类。
// This code gets an instance of the DerivedContext.
BaseClass myBase = new DerivedClass();
DbContext myContext = myBase.BaseContext;
如果这是您打算如何工作,那么您正在使用正确的方法。
答案 3 :(得分:0)
您不希望域对象取决于dbcontext。域名应该不知道dbcontex。 回答你的问题:不,这不是“正确的”。
您可能拥有的是围绕域对象分层的一系列组件,这些组件使用dbcontext来加载/保存实体。
答案 4 :(得分:0)
至少您的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
本身,这取决于您打算如何使用它。