Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Proxy Design Pattern trong C#: Khái niệm và triển khai

Proxy Pattern cung cấp một đối tượng đại diện (surrogate/placeholder) để kiểm soát truy cập đến đối tượng thực tế (RealSubject). Proxy triển khai cùng interface với RealSubject để có thể thay thế nhau.

Các thành phần (Participants)

  • Subject (Interface): Định nghĩa interface chung cho RealSubject và Proxy.
  • RealSubject: Đối tượng thực sự chứa logic nghiệp vụ.
  • Proxy: Nắm giữ reference đến RealSubject, kiểm soát truy cập, có thể thêm logic trước/sau (lazy loading, logging, caching, access control...).

Ví dụ: Proxy cho Server xử lý đơn hàng

// 1. Subject Interface
public interface IServer
{
    void TakeOrder(string order);
    string DeliverOrder();
    void ProcessPayment(string payment);
}

// 2. RealSubject
public class Server : IServer
{
    private string _order;
    public void TakeOrder(string order)
    {
        Console.WriteLine($"[Server] Takes order: {order}");
        _order = order;
    }
    public string DeliverOrder() => _order;
    public void ProcessPayment(string payment)
    {
        Console.WriteLine($"[Server] Processes payment: {payment}");
    }
}

// 3. Proxy
public class ServerProxy : IServer
{
    private readonly Server _server = new Server();
    private string _order;

    public void TakeOrder(string order)
    {
        Console.WriteLine($"[Proxy] Logging order: {order}");
        _server.TakeOrder(order); // Delegate
        _order = order;
    }

    public string DeliverOrder()
    {
        Console.WriteLine("[Proxy] Delivering order...");
        return _server.DeliverOrder();
    }

    public void ProcessPayment(string payment)
    {
        Console.WriteLine("[Proxy] Validating payment...");
        if (string.IsNullOrEmpty(payment))
            throw new ArgumentException("Payment required");
        _server.ProcessPayment(payment);
    }
}

// 4. Client
class Program
{
    static void Main()
    {
        IServer proxy = new ServerProxy();
        
        proxy.TakeOrder("Pizza");
        Console.WriteLine($"Delivered: {proxy.DeliverOrder()}");
        proxy.ProcessPayment("Credit Card");
        
        Console.ReadLine();
    }
}

Kết quả

[Proxy] Logging order: Pizza
[Server] Takes order: Pizza
[Proxy] Delivering order...
[Server] Takes order: Pizza
[Proxy] Validating payment...
[Server] Processes payment: Credit Card

Các loại Proxy phổ biến

LoạiMục đích
Virtual ProxyTạo đối tượng tốn kém (heavy) chỉ khi cần (lazy initialization).
Protection ProxyKiểm soát quyền truy cập (ACL, authentication).
Remote ProxyĐại diện cho đối tượng ở process/máy khác (WCF, gRPC, .NET Remoting).
Smart ProxyThêm hành vi: reference counting, locking, caching, logging.
Cache ProxyLưu kết quả gọi trước để trả nhanh lần sau.

Proxy trong .NET Framework

  • RealProxy / TransparentProxy (Remoting, legacy).
  • DynamicProxy (Castle DynamicProxy) - dùng bởi Moq, Entity Framework, ASP.NET Core interception.
  • DispatchProxy (CoreCLR) - tạo proxy động cho interface.

Lưu ý: Proxy khác với Adapter (chuyển interface) và Decorator (thêm hành vi nhưng không kiểm soát truy cập). Proxy kiểm soát truy cập đến RealSubject.