Áp dụng lập trình hướng khía cạnh (AOP) trong Unity

1. Giới thiệu về AOP Lập trình Hướng Khía Cạnh (AOP - Aspect-Oriented Programming) là kỹ thuật cho phép thêm chức năng vào chương trình mà không cần thay đổi mã nguồn gốc. Nó hoạt động bằng cách sử dụng biên dịch trước hoặc đại lý động thời gian chạy. AOP bổ sung cho phương pháp OOP truyền thống, nơi OOP tập trung vào việc phân chia các tính năng thành các lớp độc lập và đóng gói tốt, còn AOP giúp tách biệt các yêu cầu chung khỏi các lớp không liên quan. Mục tiêu của thiết kế phần mềm thường là đóng gói lại các sửa đổi và mở rộng các tính năng mới. Điều này giảm thiểu nguy cơ lỗi khi thay đổi mã hiện có. Ví dụ, các chức năng như ghi log, xác thực người dùng hay xử lý ngoại lệ có thể được trích xuất ra ngoài logic kinh doanh chính. Khi yêu cầu thay đổi, chỉ cần cập nhật mô-đun chung mà không phải chỉnh sửa nhiều nơi khác nhau.
Với AOP, bạn có thể định nghĩa các hành vi sẽ được áp dụng trước hoặc sau khi một phương thức được gọi. Chẳng hạn, trong một dự án web, chúng ta cần kiểm tra quyền truy cập của người dùng trước mỗi lần hiển thị trang. Thay vì viết đoạn mã kiểm tra này trong từng phương thức khởi tạo trang, AOP cho phép bạn áp dụng nó ở một nơi duy nhất.
2. Lợi ích của việc sử dụng AOP Sử dụng AOP mang lại nhiều lợi ích:
  • Tách bạch các chức năng chung ra khỏi logic nghiệp vụ, giảm thiểu mã lặp lại.
  • Cải thiện khả năng bảo trì và mở rộng hệ thống.
  • Tăng cường cấu trúc mô-đun hóa của ứng dụng, làm cho kiến trúc phần mềm trở nên đơn giản hơn.
3. Thực hiện chặn tĩnh qua mẫu Trang trí (Decorator) Dưới đây là ví dụ về cách sử dụng mẫu Decorator để áp dụng AOP:

public class Account
{
    public int Id { get; set; }
    public string UserName { get; set; }
}

public interface IAccountService
{
    void CreateAccount(Account account);
}

public class AccountService : IAccountService
{
    public void CreateAccount(Account account)
    {
        Console.WriteLine("Tài khoản đã được tạo...");
    }
}

public class AccountServiceDecorator : IAccountService
{
    private readonly IAccountService _accountService;

    public AccountServiceDecorator(IAccountService accountService)
    {
        _accountService = accountService;
    }

    public void CreateAccount(Account account)
    {
        Validate(account);
        _accountService.CreateAccount(account);
        LogOperation(account);
    }

    private void Validate(Account account)
    {
        if (string.IsNullOrEmpty(account.UserName))
        {
            throw new ArgumentException("Tên tài khoản không được để trống.");
        }
        Console.WriteLine("Đã xác nhận thông tin tài khoản.");
    }

    private void LogOperation(Account account)
    {
        Console.WriteLine($"Ghi log: Tài khoản {account.UserName} đã được tạo.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IAccountService service = new AccountServiceDecorator(new AccountService());
        service.CreateAccount(new Account { Id = 1, UserName = "user123" });
    }
}
4. Áp dụng AOP trong Unity Bước đầu tiên là thêm các tham chiếu cần thiết của Unity và các thành phần liên quan:

public class User
{
    public int UserId { get; set; }
    public string FullName { get; set; }
}

public interface IUserService
{
    [UserValidation]
    void RegisterUser(User user);
}

public class UserService : IUserService
{
    public void RegisterUser(User user)
    {
        Console.WriteLine("Đăng ký người dùng thành công...");
    }
}

public class UserValidationAttribute : HandlerAttribute
{
    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return new UserValidationHandler();
    }
}

public class UserValidationHandler : ICallHandler
{
    public int Order { get; set; }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        var user = input.Inputs[0] as User;

        if (string.IsNullOrEmpty(user.FullName))
        {
            Console.WriteLine("Tên không hợp lệ.");
            return input.CreateExceptionMethodReturn(new Exception("Tên không hợp lệ."));
        }

        Console.WriteLine("Kiểm tra tên người dùng hoàn tất.");

        var result = getNext()(input, getNext);

        Console.WriteLine("Hoàn tất đăng ký.");

        return result;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();

        container.AddNewExtension<Interception>();
        container.RegisterType()
                .Configure<Interception>()
                .SetInterceptorFor<IUserService>(new InterfaceInterceptor());

        var userService = container.Resolve<IUserService>();
        userService.RegisterUser(new User { UserId = 1, FullName = "Nguyen Van A" });

        Console.ReadLine();
    }
}

Thẻ: Unity AOP C#

Đăng vào ngày 20 tháng 6 lúc 22:25