繁体   English   中英

C#继承的演员表成员

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM