3

リポジトリの各メソッドでブロックを使用しています。メソッドを相互参照したい場合、別のデータコンテキストを初期化するのはベストプラクティスに反するようです メソッドでブロックを使用する代わりに、クラスで Datacontext を宣言すると、破棄する力が失われませんか??

public IList<something> GetSomething()
{ 
   using (DB db=new DB())

   { ...GetListofSomethingElse(id)

   } 
}

public IList<somethingelse> GetListofSomethingElse(int id)
{ 
    using (DB db=new DB())
   {
     ... return IList 

   } 
}
4

4 に答える 4

4

Actually, I think it is semantically (or how should I say that), not correct to create and dispose a datacontext in your repository.

I mean: if you open a new connection to the DB in each and every method of your repository, you're doing it wrong IMHO. This is too much fine grained. The repository class has no knowledge of the 'context' in which it is being used. Your repository should not be responsible for opening / closing connections or starting and committing transactions. Context is king, and the repository has no knowledge of the context in where it is being used. So, IMHO it is the responsability of the Application layer or service layer to open new DataContext objects, and closing / disposing them. (The same applies for transactions).

So, this is how I do it: (note that I do not use the Entity Framework, but I use NHibernate. I assume that the DataContext class in the EF is similar to the ISession in NHibernate):

using( ISession s = theSessionFactory.OpenSession() )
{
    ICustomerRepository cr = RepositoryFactory.GetCustomerRepository(s);

    Customer c1 = cr.GetCustomer(1);
    Customer c2 = cr.GetCustomer(2);

    // do some other stuff
    s.StartTransaction();

    cr.Save (c1);
    cr.Save (c2);

    s.Commit();

}

(This is not real world code offcourse; and it won't even compile since ISession doesn't have a Commit method. ;) Instead, the StartTransaction returns an ITransaction which has some kind of commit method, but I think you'll catch my drift. ;) )

于 2009-01-17T11:53:58.030 に答える
3

using ステートメントはシンタックス シュガーです。これは、finally セクションで Dispose() 呼び出しを使用して try/finally ブロックにコンパイルされます。例外が発生した場合でも Dispose が呼び出されるようにします。

于 2009-01-15T23:50:09.293 に答える
3

using ステートメントを使用しない場合でも、明示的に破棄できます。ただし、データ コンテキストを破棄しない場合でも、これらのメソッドを相互参照すると、新しいデータ コンテキストが作成されます。使い方によっては、それが良い場合とそうでない場合があります。データ コンテキストの状態管理の側面と、メソッドを互いに分離するかどうかについて考えてください。常に新しいコンテキストを作成することを避けたい場合は、コンテキストをパラメーターとして受け取るバージョンでメソッドをオーバーロードします。

IDisposable を実装するものはすべて破棄する傾向がありますが、通常はデータ コンテキストを破棄する必要はありません。

于 2009-01-15T23:53:38.613 に答える
2

'using' ステートメントを使用せずに、クラスで .Dispose() を呼び出すことができます。通常、リポジトリがある場合は、リポジトリの Dispose メソッドでこれを行います。

于 2009-01-15T23:45:30.283 に答える