07/09/2018, 10:46

Tìm Hiểu Về Dependency Injection Design Pattern

Dependency Injection là khái niệm được nhắc tới nhiều trong thời gian gần đây. Mặc dù không phải là một khái niệm quá khó hiểu nhưng rất nhiều bạn developer cảm thấy khái niệm này khó hiểu. Trong bài viết này chúng ta cùng nhau giải mã khái niệm này thông qua các ví dụ đơn giản và dễ hiểu. Trước ...

Dependency Injection là khái niệm được nhắc tới nhiều trong thời gian gần đây. Mặc dù không phải là một khái niệm quá khó hiểu nhưng rất nhiều bạn developer cảm thấy khái niệm này khó hiểu. Trong bài viết này chúng ta cùng nhau giải mã khái niệm này thông qua các ví dụ đơn giản và dễ hiểu.

Trước tiên chúng ta hãy tìm hiểu tại sao cần dùng Dependency Injection.

Quản Lý Dependency

Một trong những vấn đề thường gặp trong lập trình đó là quản lý các phần phụ thuộc hay dependency của một object hay class. Lấy ví dụ như sau: Trong ứng dụng web bạn muốn phát triển chức năng gửi email tới người dùng sau khi người dùng đăng ký tài khoản trên trang. Bạn quyết định tạo một class với tên là MyMailClass sử dụng hàm sendmail của PHP để thực hiện chức năng này:

class MyMailClass { 
    public function send() {
        // logic gửi email
    }
}

Và trong controller class xử lý việc đăng ký user bạn có đoạn code thực hiện việc gửi email như sau:

<?php
use MyMailClass;

class UsersController {
    function registerAccount() {
        // gửi email kích hoạt tài khoản
        $email = new MyMailClass();
        $email->send();
    }
}

Mọi việc hoạt động okie cho tới 1 tháng sau đó bạn muốn có chức năng kiểm tra số lượng email được gửi đi cũng như bao nhiểu email gửi đi được mở. Sau khi research bạn nhận thấy hàm sendmail không hỗ trợ việc này trong khi đó các email provider như Mailchimp hoặc Mailgun cung cấp các thư viện hỗ trợ việc này. Bạn quyết định chuyển qua sử dụng thư viện PHP cung cấp bởi các email provider này. Tuy nhiên lúc này bạn cần phải sửa lại code của toàn bộ các đoạn code thực hiện việc gửi email : (.

Trong ví dụ trên bạn nhận thấy việc gửi email của ứng dụng phụ thuộc vào việc sử dụng email provider nào và mỗi lần thay đổi email provider sẽ khiến cho chúng ta gặp phải vấn đề vì phải update code ở tất cả những nơi thực hiện việc gửi email. Dependency Injection được giới thiệu để giải quyết vấn đề này.

Dependency Injection Là Gì

Depencency Injection là một phương pháp thiết kế (design pattern) được ứng dụng trong lập trình phần mềm nhằm giúp quản lý các dependency của một object hiệu quả hơn.

Áp dụng vào ví dụ ở trên nếu như chúng ta thực hiện việc cấu hình cho mail class nào được sử dụng bởi ứng dụng ở một nơi duy nhất và sau đó mỗi lần gửi mail chúng ta chỉ cần lấy ra mail class này:

<?php
class Application {
    public static $mail;
    public function static configMail() {
        $mailService = getenv('MailService');
        self::$mail = $mailService;
    }
}

Ở trên chúng ta thực hiện việc config cho mail server ở lớp Application, và sử dụng hàm getenv() trong PHP. Hàm getenv() sẽ lấy giá trị của biến môi trường 'MailService` của PHP.

Bây giờ khi gửi mail bạn sẽ làm như sau:

<?php
use Application;

class UsersController {
    function registerAccount() {
        // gửi email kích hoạt tài khoản
        $email = Application::$mail;
        $email->send();
    }
}

Với cách làm trên khi bạn muốn chuyển sang sử dụng email service provider khác bạn chỉ cần chuyển đổi biến môi trường MailService của PHP thay vì phải sửa đổi toàn bộ các đoạn code thực hiện việc gửi email như lúc trước.

0