2012-01-06 81 views
0

我正在爲我的實體框架數據庫上下文類的基類工作。在基類中,我需要訪問DbContext,並且在派生類中,我需要訪問派生的DbContext。目前我有以下代碼:C#繼承的鑄造成員

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; 
     }   
    } 
} 

這是一個正確的方法嗎?

+1

你爲什麼這樣做?我想你想要實現的是類似於http://www.castleproject.org/activerecord/ – 2012-01-06 13:38:32

回答

4

我建議更多的東西一樣

public abstract class BaseClass<TContext> : IDisposable 
    where TContext : DbContext 
{ 
    //not abstract 
    protected TContext Context { get; private set; } 
} 

public class DerivedClass : BaseClass<DerivedContext> 
{ 
    .... 
} 

在你的基類,你可以訪問所有你DerivedClass的DbContext的成員,並可以訪問所有DerviedContext的成員,而不需要轉換。

0

它在某種程度上取決於你期望如何使用它。您發佈的代碼將始終將派生上下文與派生類的實例以及基類的基本上下文一起使用。

// This code gets an instance of the DerivedContext. 
BaseClass myBase = new DerivedClass(); 
DbContext myContext = myBase.BaseContext; 

如果這是您打算如何工作,您正在使用正確的方法。

0

您不希望取決於dbcontext的域對象。該域應該不知道dbcontex。 回答你的問題:不,這不是「正確的」。

你可能擁有的是一系列圍繞使用dbcontext加載/保存實體的域對象分層的組件。

+0

我不知道爲什麼你認爲BaseClass和DerivedClass是域對象。這個問題似乎並沒有表明這一點。 – cadrell0 2012-01-06 14:01:57

+0

@ cadrell0第二次閱讀OP,你的權利。由於'@ Jani'留下的關於AR的評論,我假定了一個域對象。 – 2012-01-06 16:22:29

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) 
    { 
    } 
} 
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本身,這取決於你打算如何使用它。