Nếu bạn có cùng câu hỏi với mình về vấn đề này thì đọc phần giải thích ngắn gọn phía dưới để thấy sự khác biệt: Cả hai cách đều dùng một giao tiếp khác để một class tham chiếu đến, Generics sẽ thông qua ngay phần khai báo lớp trong khi DI sẽ thông qua constructor. Nhưng sự khác biệt lớn nhất ngoài cách khai báo nằm ở đâu?
Generics giới thiệu khái niệm về tham số kiểu, giúp thiết kế các lớp và phương thức trì hoãn đặc tả của một hoặc nhiều kiểu cho đến khi lớp hoặc phương thức được khai báo và khởi tạo bằng code msdn. Và generic với tất cả các restrictions và kiểm tra của chúng được áp dụng tại thời gian biên dịch (compile time) bằng cách sử dụng phân tích tĩnh (static analysis).
Trong khi, Dependency injection là một mẫu thiết kế phần mềm cho phép lựa chọn thành phần được thực hiện trong thời gian chạy (run-time) thay vì thời gian biên dịch. Và đối tượng khớp nối bị ràng buộc tại thời gian chạy bởi một đối tượng trình hợp dịch và thường không được biết đến tại thời điểm biên dịch bằng cách sử dụng wiki phân tích tĩnh.
Câu trả lời cho câu hỏi của bạn: một cái được áp dụng tại thời điểm biên dịch bằng cách sử dụng phân tích tĩnh, một cái khác được áp dụng tại thời điểm chạy bằng cách sử dụng XML hoặc cấu hình trong mã (nó cũng phải hợp lệ để biên dịch). Sử dụng Quyết định tiêm phụ thuộc về ràng buộc sẽ bị hoãn lại cho đến khi có thêm thông tin hoặc cấu hình từ ngữ cảnh. Vì vậy, thuốc generic và thuốc tiêm phụ thuộc là khác nhau, và được sử dụng cho các mục đích khác nhau.
Reference: https://stackoverflow.com/questions/11715317/generic-vs-dependency-injection