7

Tôi được yêu cầu tôi cần dispose of instances of my Entity Framework repository classes và tôi đã tạo một lớp cơ sở để thực thi triển khai này.Tôi có phải triển khai IDisposable trên tất cả các lớp hay là lớp cơ sở đủ không?

Tôi cần kiểm tra với các chuyên gia: có thể chấp nhận thực hiện IDisposable thông qua lớp cơ sở không?

Lưu ý rằng lớp lưu trữ không có biến thành viên lớp.

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

Trả lời

4

Nó phụ thuộc vào việc bạn có tài nguyên trong lớp có nguồn gốc cần Được xử lý. Nếu có tài nguyên cụ thể cho lớp dẫn xuất, việc triển khai thực hiện IDisposable chỉ trên lớp cơ sở sẽ không đủ.

+0

Trong trường hợp của tôi, tôi không có gì cục bộ trong lớp lưu trữ được kế thừa của tôi. Nếu trường hợp này xảy ra, thì việc triển khai CompanyRepository của tôi đã hoàn tất? – LamonteCristo

+0

Nếu không có gì trong lớp dẫn xuất yêu cầu xử lý rõ ràng việc triển khai lớp cơ sở có thể là đủ. –

+1

Chỉ có lớp cơ sở mới thực sự * triển khai * 'IDisposable'. Các lớp có nguồn gốc nói chung nên thêm mã làm sạch của chúng bằng cách ghi đè 'Vứt bỏ (bool)', thay vì thêm một sự thực hiện mới của 'IDisposable.Dispose()'. – supercat

0

NO. bạn cũng có trong các lớp con.

nếu bạn không, GC vẫn cần ánh xạ con của nó là không được tham chiếu - và THEN để thu thập chúng ... vì vậy bạn không kiếm được gì.

+0

vứt bỏ không liên quan đến gc. mẫu vứt bỏ là để giải phóng tài nguyên không được quản lý và gc là dành cho bộ nhớ được quản lý. câu trả lời này không thực sự có ý nghĩa. –

1

Nói chung, bạn phải triển khai IDispoable trong mọi lớp, nơi bạn có các thành viên riêng tư tự triển khai IDisposable. Những tài nguyên đó phải được "giải phóng". Tôi khuyên bạn nên đọc bài báo rất hay này trên CodeProject về mẫu IDisposable.

7

Câu trả lời là "nó phụ thuộc".

Nếu phương thức "Vứt bỏ()" trong một số siêu lớp là đủ, bạn chắc chắn không cần phải triển khai lại nó trong mỗi lớp con.

"superclass" có thể là lớp cơ sở; nó có thể là một hoặc nhiều lớp con.

Tùy thuộc vào những gì bạn phân bổ và những gì cần phải được làm sạch.

IMHO ...

Đây là những gì MSDN đã nói:

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

Khi bạn lấy được từ một loại dùng một lần, và loại có nguồn gốc không giới thiệu bất kỳ tài nguyên mới , vậy thì không cần phải làm gì đặc biệt cả. Việc triển khai IDisposable loại cơ sở sẽ chăm sóc làm sạch tài nguyên của nó và phân lớp của bạn có thể không biết gì về chi tiết .

< = Nói cách khác, bạn không nhất thiết phải tái thực hiện Vứt hơn và hơn

... nhưng ...

Tuy nhiên, nó cũng phổ biến để có một lớp con chứa tài nguyên mới cần được dọn dẹp. Trong trường hợp này, lớp học của bạn cần để giải phóng tài nguyên của mình, đồng thời đảm bảo rằng các tài nguyên của loại cơ sở cũng được phát hành. Làm điều này bằng cách ghi đè các phương pháp dọn dẹp, giải phóng tài nguyên của mình, và sau đó gọi các loại hình cơ bản để làm sạch nguồn lực của nó, như trong hình 6.

+1

+1 Đối với bài viết – LamonteCristo

0

việc xử lý bằng cách sử dụng lớp cơ sở là tốt. điều quan trọng ở đây là làm sạch tài nguyên không được quản lý, trong trường hợp này có nghĩa là đóng các kết nối cơ sở dữ liệu. Tôi muốn tranh luận rằng bạn sẽ tốt hơn khi tham gia asp.net với những thứ như httpmodules hoặc bộ lọc hành động để xử lý đơn vị công việc của bạn và thực hiện việc vứt bỏ một loại thiết lập đơn vị công việc theo yêu cầu, nhưng nếu thay vào đó, bạn chỉ cần đảm bảo gọi dispose trên các cá thể kho lưu trữ của bạn, có một lớp cơ sở phân biệt ngữ cảnh khung thực thể là tốt (và bạn vẫn có thể sử dụng lớp cơ sở cho các kho này ngay cả khi loại bỏ chúng bằng một bộ lọc/mô-đun).

Các vấn đề liên quan