7

Powiedziano mi, że muszę dispose of instances of my Entity Framework repository classes i stworzyłem klasę bazową, aby wymusić tę implementację.Czy muszę wdrożyć IDisposable na wszystkich klasach lub czy klasa podstawowa jest wystarczająca?

Muszę skontaktować się z ekspertami: czy dopuszczalne jest wdrożenie IDisposable przez klasę podstawową?

Należy zauważyć, że klasa repozytorium nie ma zmiennych członków klasy.

/// Sample repository. Note that I return List<T> as IEnumerable, 
/// and I use IDisposable 
/// 
public class CompanyRepository : DisposableBase, ICompanyRepository 
{ 
    public IEnumerable<CompanyDetail> GetOneCompany(int? CompanyID) 
    { 
     var t = from c in _entities.CompanyDetail 
       where c.CompanyID == CompanyID.Value 
       select c; 
     return t.ToList(); 
    } 
} 

/// <summary> 
/// Disposable implementation based on advice from this link: 
/// from Http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application 
/// </summary> 
public class DisposableBase : IDisposable 
{ 
    protected TLSAdminEntities1 _entities; 

    public DisposableBase() 
    { 
     _entities = new TLSAdminEntities1(); 
     disposed = false; 
    } 

    private bool disposed ; 
    protected virtual void Dispose(bool disposing) 
    { 
     if (!this.disposed) 
     { 
      if (disposing) 
      { 
       _entities.Dispose(); 
      } 
     } 
     this.disposed = true; 
    } 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
} 

Odpowiedz

4

To zależy od tego, czy zasoby w klasie pochodnej, które wymagają być usuniętym. Jeśli istnieją zasoby specyficzne dla klasy pochodnej, implementacja IDisposable tylko w klasie bazowej nie będzie wystarczająca.

+0

W moim przypadku nie mam nic lokalnego w mojej dziedziczonej klasie repozytorium. Jeśli tak, to czy moja implementacja CompanyRepository jest kompletna? – LamonteCristo

+0

Jeśli w klasie pochodnej nie ma niczego, co wymaga jawnego usunięcia, prawdopodobnie wystarczająca jest implementacja klasy podstawowej. –

+1

Tylko klasa podstawowa powinna faktycznie * implementować * 'IDisposable'. Klasy pochodne powinny na ogół dodawać swój kod czyszczący, zastępując 'Dispose (bool)', zamiast dodawać nową implementację 'IDisposable.Dispose()'. – supercat

0

NIE. masz również w podklasach.

Jeśli nie, GC nadal musi mapować swoje dziecko jako bez odniesienia - a WTEDY je zbierać ... więc nic nie zarobiłeś.

+0

dispose nie jest powiązany z gc. wzór usuwania służy do uwolnienia niezarządzanych zasobów, a gc do zarządzania pamięcią. ta odpowiedź nie ma większego sensu. –

1

Ogólnie rzecz biorąc, musisz wdrożyć IDispoable w każdej klasie, w której masz prywatnych członków, którzy sami wdrażają IDisposable. Te zasoby muszą zostać "uwolnione". Stanowczo radzę przeczytać ten bardzo dobry dokument na temat CodeProject o wzorzec IDisposable.

7

Odpowiedź brzmi "to zależy".

Jeśli metoda "Dispose()" w jakiejś nadklasie jest wystarczająca, na pewno nie trzeba jej ponownie stosować w każdej podklasie.

"Nadklasa" może być klasą podstawową; może to być jedna lub więcej podklas.

To zależy od tego, co przydzielisz i co trzeba wyczyścić.

IMHO ...

Oto co ma do powiedzenia MSDN:

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

Po wynika z rodzaju jednorazowych, a typ pochodny nie wprowadzają żadnych nowych zasobów , wtedy nic specjalnego nie trzeba robić. Podstawowa implementacja IDisposable zajmie się oczyszczeniem jej zasobów, a twoja podklasa może być błogo nieświadoma szczegółów .

< = Innymi słowy, nie koniecznie trzeba ponownie wdrożyć utylizować kółko

... ale ...

Jednakże, jest to także wspólne mieć podklasa, która zawiera nowe zasoby, które wymagają oczyszczenia. W takim przypadku twoja klasa potrzebuje , aby zwolnić swoje zasoby, jednocześnie upewniając się, że zasoby typu również zostaną zwolnione. Czy to poprzez nadpisanie metody oczyszczania, uwalniając swoje zasoby, a następnie wywołanie typ bazowy oczyścić swoje zasoby, jak pokazano na Rysunku 6.

+1

+1 Do artykułu – LamonteCristo

0

jest w porządku do dysponowania przy użyciu klasy bazowej. ważne jest tutaj oczyszczanie niezarządzanych zasobów, co w tym przypadku oznacza zamykanie połączeń z bazami danych. Twierdzę, że lepiej byłoby podłączyć się do asp.net z takimi rzeczami, jak httpmules lub filtry akcji, aby poradzić sobie z jednostką pracy i zutylizować instalację typu unit-of-work-per-request, ale jeśli zamiast tego po prostu upewniasz się, że wywołasz dispose w twoich instancjach repozytorium, mając klasę podstawową, która pozbywa się kontekstu struktury encji jest w porządku (i nadal możesz używać klasy bazowej dla tych repozytoriów, nawet jeśli dysponujesz ich filtrem/modułem).

Powiązane problemy