#Notes: Có biết về các design pattern không? Đã từng dùng qua cái design pattern nào rồi? Cho ví dụ một vài cái pattern đã dùng? Có nghe qua về Inversion of Control và Dependency Injection không? Hai cái đó có gì khác nhau không? Cho ví dụ?

 

Có biết về các design pattern không? Đã từng dùng qua cái design pattern nào rồi? Cho ví dụ một vài cái pattern đã dùng? Có nghe qua về Inversion of Control và Dependency Injection không? Hai cái đó có gì khác nhau không? Cho ví dụ? Có mối liên hệ gì giữa Unit Test với 2 pattern trên không? Cho ví dụ cụ thể?

Dependency Inversion: Đây là một nguyên lý để thiết kế và viết code. (Nó là chữ D trong nguyên lý Solid)


Inversion of Control: Đây là một design pattern được tạo ra để code có thể tuân thủ nguyên lý Dependency Inversion. Có nhiều cách hiện thực pattern này: ServiceLocator, Event, Delegate, … Dependency Injection là một trong các cách đó.

Dependency Injection: Đây là một cách để hiện thực Inversion of Control Pattern. Nó giúp tách một class độc lập với các biến phụ thuộc. Các class được liên kết với nhau theo một mối quan hệ nào đó. Dependency là một loại quan hệ giữa 2 class mà trong đó một class hoạt động độc lập và class còn lại phụ thuộc bởi class kia.
Bạn có thể hiểu các module phụ thuộc (dependency) sẽ được inject vào module cấp cao.

Có 3 dạng Dependency Injection:
- Constructor Injection: Các dependency sẽ được container truyền vào 1 class thông qua constructor của class đó. Đây là cách thông dụng nhất.
- Setter Injection: Các dependency sẽ được truyền vào 1 class thông qua các hàm Setter.
- Interface Injection: Class cần inject sẽ implement 1 interface. Interface này chứa 1 hàm tên Inject. Container sẽ injection dependency vào 1 class thông qua việc gọi hàm Inject của interface đó. Đây là cách rườm rà và ít được sử dụng nhất.

Ưu điểm:
- Giảm sự kết dính giữa các module
- Code dễ bảo trì, dễ thay thế module
- Rất dễ test và viết Unit Test
- Dễ dàng thấy quan hệ giữa các module (Vì các dependecy đều được inject vào constructor)

Nhược điểm:
- Sử dụng interface nên đôi khi sẽ khó debug, do không biết chính xác module nào được gọi.
- Các object được khởi tạo toàn bộ ngay từ đầu, có thể làm giảm performance
- Làm tăng độ phức tạp của code

Sử dụng DI trong Unit test
- Kết hợp kỹ thuật Mock (Moq) để testing hiệu quả hơn
Mocking Framkwork (Moq) giúp cho quá trình testing trở nên dễ dàng hơn bằng cách tạo ra các đối tượng giả (FakeObject)
- Sử dụng Dependency Injection ở trên là khá ổn nhưng sẽ rất khó khăn để maintain nếu số lượng dependencies và components trong ứng dụng của mình lớn.

Share:

0 nhận xét