Chúng ta nên sử dụng mô hình thiết kế IDisposable (hoặc Dispose Pattern) khi cần giải phóng các đối tượng unmanaged (không được quản lý).
Để triển khai mô hình thiết kế IDisposable, lớp xử lý trực tiếp hoặc gián tiếp với các đối tượng unmanaged nên triển khai interface IDisposable. Và triển khai phương thức Dispose được khai báo bên trong interface IDisposable. Chúng ta không trực tiếp xử lý các đối tượng unmanaged. Nhưng chúng ta xử lý các lớp managed (được quản lý), mà trực tiếp xử lý với các đối tượng unmanaged. Ví dụ: trình xử lý tệp (file handlers), chuỗi kết nối (connection string), luồng HTTP, v.v.
Khía cạnh quan trọng của mô hình này là nó giúp các lớp kế thừa dễ dàng tuân theo mô hình thiết kế IDisposable. Và đó là nhờ việc triển khai phương thức Dispose có thể ghi đè (overridable). Mô hình này cũng gợi ý sử dụng phương thức Finalizer (hoặc destructor trong C#). Tuy nhiên, nếu chúng ta sử dụng Finalizer, nó nên được quản lý đúng cách do các hệ lụy về hiệu suất.
Ví Dụ
static class Program {
static void Main(string[] args) {
using var serviceProxy = new ServiceProxy(null);
serviceProxy.Get();
serviceProxy.Post("");
Console.ReadLine();
}
}
public class ServiceProxy : System.IDisposable {
private readonly HttpClient httpClient;
private bool disposed;
public ServiceProxy(IHttpClientFactory httpClientFactory) {
httpClient = httpClientFactory.CreateClient();
}
~ServiceProxy() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposed) {
return;
}
if (disposing) {
// Giải phóng đối tượng managed
httpClient.Dispose();
}
// Giải phóng đối tượng unmanaged
disposed = true;
}
public void Get() {
var response = httpClient.GetAsync("");
}
public void Post(string request) {
var response = httpClient.PostAsync("", new StringContent(request));
}
}