2012-01-06 9 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/のようなものだと思っています –

答えて

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のすべてのメンバーにアクセスすることができます何かを示唆しています。

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

+0

@ cadrell0 OPを2度目に読んで、あなたの権利。 ARに関する@ Janiによって残されたコメントのために、私はドメインオブジェクトを想定しました。 –

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の実装を改善する必要があります。それはあなたがそれを使用する方法によって異なり、DBContext自体については

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

IDisposable例:あなたは、次のように行う必要があります。