C#继承了铸造成员

时间:2012-01-06 13:32:38

标签: c# .net inheritance casting

我正在为我的实体框架数据库上下文类开发一个基类。在基类中,我需要访问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;
        }           
    }
}

这是正确的做法吗?

5 个答案:

答案 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本身,这取决于您打算如何使用它。