3

私への適切な方法が何であるかはよくわかりませDisposeObjectContext。セットアップ方法は次のとおりです。

public abstract class DataManagerBase<T> where T:ObjectContext
{
    protected T _context = null;

    public string Message { get; set; }

    public DataManagerBase(T context)
    {
       _context = context;
    }
}

これを他のクラスで使用するには、次のようなことをしています。

public class Test : DataManagerBase<DataEntities>
{
     public Test(DataEntities context) 
        : base(context){}

     public void InsertRecord(Person p)
     {
         if(_context != null)
         {
             try
             {
                 //Do insert logic
             }
             catch(Exception ex)
             {

             }
         }
    }

}

同じ を使用する他のメソッドがあるため、ステートメント_contextを使用していないため、例外がスローされた場合に が null でないかどうかを確認してから破棄する必要がありますか? 基本的に、例外があるかどうかに関係なく、_context が処理されたときに確実に破棄されるようにしたいと考えています。aを everyに追加するのは正しくありませんか?using_contextfinallytry/catch

このメソッドを DataManagerBase クラスに追加してから、他のクラスで呼び出すとうまくいきます。

 public void DisposeContext()
 {
        if (_context != null)
        {
            _context.Dispose();
        }
 }
4

4 に答える 4

5

経験則は次のとおりです。作成していないオブジェクトを破棄しないでください。したがって、最初に提供したクラスのいずれにもコンテキストを破棄しないでください。

context.Dispose()ただし、この特定のインスタンスを実際に作成するクラスで呼び出す必要があります。そして、あなたがそうするとき、それを使用している他のオブジェクトがあってはなりません。あなたがやろうとしているのは、設計上の問題を修正するのではなく、回避することです。それは間違っています、私見。そして、どこかにさらに別のヌルチェックを入れるのを忘れたとき、それはある時点であなたを苦しめます.

あなたが提供したコードを使用すると、例は次のようになります。

void SomeMethodInOuterScope()
{
    var context = new DataEntities();

    var test = new Test(context);

    try
    {
        test.InsertRecord(new Person());
        ...............
    }
    catch(Exception ex)
    {
        ....
    }
    finally
    {
        context.Dispose();
    }
}

別の例を次に示します (コンテキストがローカルでない場合)

class SomeClassInOuterScope : IDisposable
{
    private DataEntities _context;

    public SomeClassInOuterScope()
    {
        _context = new DataEntities();
    }

    public void Test()
    {
        var test = new Test(_context);
        test.InsertRecord(new Person());
        ...............
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

void SomeMethodInOuterOuterScope()
{
    var someclass = new SomeClassInOuterScope();

    try
    {
        someclass.Test();
        ...............
    }
    catch(Exception ex)
    {
        ....
    }
    finally
    {
        someclass.Dispose();
    }
}
于 2013-06-27T14:04:39.350 に答える
3

最善の方法は、1 か所で作成および削除することです。お気に入り

using(var context = factory.CreateContext())
{
    // use your context
}
于 2013-06-27T14:07:39.807 に答える
0

Dispose抽象クラスにメソッドを追加できませんか。多分IDisposableを実装します。

呼び出しコードのプロバイダーにusingブロックを使用させます。

したがって、抽象クラスでは次のようになります。

 public void Dispose()
 {
        if (_context != null)
        {
            _context.Dispose();
        }
 }

呼び出しコード:

using(var db = new Test())
{
... 
}

これの欠点は、コンテキストの使い捨てを管理するために呼び出し元のコードに依存していることです。

于 2013-06-27T14:12:35.080 に答える