C# Linq-to-Sql - Трябва ли DataContext да се изхвърли с помощта на IDisposable

Имам няколко метода, които се занимават с DB и всички те започват с извикване

FaierDbDataContext db = new FaierDbDataContext();

Тъй като обектът Linq2Sql DataContext имплементира IDisposable, трябва ли това да се използва с "using"?

using (FaierDbDataContext db = new FaierDbDataContext()) {
    // use db here
}

Какви са последиците от използването му по един или друг начин?


person Kornelije Petak    schedule 04.05.2009    source източник
comment
Също така, странична бележка, за хора, използващи LINQ, не трябва да поддържате променлива на екземпляр на вашия контекст на данни за вашия клас на модел на данни. Вместо това декларирайте такъв всеки път, когато трябва във вашите методи.   -  person mmcdole    schedule 04.05.2009


Отговори (1)


За разлика от повечето типове, които прилагат IDisposable, DataContext всъщност не се нуждае от изхвърляне - поне не в повечето случаи. Попитах Мат Уорън за това дизайнерско решение и ето неговия отговор:

Има няколко причини, поради които внедрихме IDisposable:

  • Ако логиката на приложението трябва да задържи обект след времето, когато DataContext се очаква да бъде използван или валиден, можете да наложите този договор, като извикате Dispose. Отложените зареждащи програми в този обект все още ще се позовават на DataContext и ще се опитат да го използват, ако някакъв код се опита да навигира в отложените свойства. Тези опити ще се провалят. Dispose също принуждава DataContext да изхвърли своя кеш от материализирани обекти, така че един кеширан обект да не поддържа случайно живи всички обекти, материализирани чрез този DataContext, което иначе би причинило това, което изглежда като изтичане на памет.
  • Логиката, която автоматично затваря DataContext връзката, може да бъде подмамена да остави връзката отворена. DataContext разчита на кода на приложението, изброяващ всички резултати от заявка, тъй като достигането до края на набор от резултати задейства затварянето на връзката. Ако приложението използва метода MoveNext на IEnumerable вместо оператор foreach в C# или VB, можете да излезете от изброяването преждевременно. Ако вашето приложение изпитва проблеми с връзките, които не се затварят и подозирате, че поведението на автоматично затваряне не работи, можете да използвате шаблона Dispose като заобиколно решение.

от източник

person Sadegh    schedule 04.05.2009