Ninject là một công cụ tiêm phụ thuộc cho .NET thực hiện mẫu tiêm phụ thuộc (đảo ngược mẫu điều khiển).
Giả sử bạn có hai lớp DbRepository và Controller:
Trình điều khiển lớp { Kho lưu trữ DbRepository riêng tư; // … một số phương thức sử dụng _repository } class DbRepository { // … một số logic nghiệp vụ ở đây… }
Vì vậy, bây giờ bạn có hai vấn đề:
-
Bạn phải khởi tạo _repository để sử dụng nó. Bạn có một số tùy chọn để làm điều này:
- Bằng tay, trong hàm tạo. Nhưng nếu phương thức khởi tạo của DbRepository thay đổi thì sao? Bạn sẽ cần phải viết lại lớp Trình điều khiển của mình sau khi mã phụ thuộc vào nó đã thay đổi. Sẽ không khó nếu bạn chỉ có một Trình điều khiển, nhưng nếu bạn có nhiều lớp phụ thuộc vào Kho lưu trữ của mình thì bạn thực sự gặp vấn đề.
-
Bạn có thể sử dụng dịch vụ hoặc công cụ định vị nhà máy. Nhưng bây giờ bạn phải phụ thuộc vào dịch vụ định vị của bạn. Bạn có một công cụ định vị dịch vụ toàn cầu và tất cả mã phải sử dụng nó. Bạn sẽ thay đổi hành vi của bộ định vị dịch vụ như thế nào khi bạn cần sử dụng nó trong một phần mã của mình cho logic kích hoạt, nhưng lại dùng cho một thứ khác trong phần khác của mã? Chỉ có một cách – chuyển bộ định vị dịch vụ thông qua các hàm tạo. Nhưng với ngày càng nhiều lớp học, bạn sẽ phải vượt qua nó ngày càng nhiều. Dù sao đó cũng là một suy nghĩ hay, nhưng về lâu dài, đó là một ý tưởng tồi.
Trình điều khiển lớp { Kho lưu trữ DbRepository riêng tư; public Controller() { _repository = sentayho.com.vn
() } //… một số phương thức sử dụng _repository } -
Bạn có thể sử dụng tiêm phụ thuộc. Kiểm tra mã:
Trình điều khiển lớp { Kho lưu trữ IR riêng tư _repository; Bộ điều khiển công khai (kho lưu trữ IRepository) { _repository = kho lưu trữ; } }
Bây giờ khi bạn cần điều khiển, hãy gõ: sentayho.com.vn
(); hoặc sentayho.com.vn (); Bạn có thể chuyển đổi giữa các cách giải quyết cơn nghiện nhanh chóng tùy thích. Nhìn thấy? Nó đơn giản, bạn không cần phải gõ nhiều.
-
Bạn không thể tạo bài kiểm tra đơn vị cho nó. Bộ điều khiển của bạn phụ thuộc vào DbRepository và nếu bạn muốn kiểm tra bất kỳ phương pháp nào sử dụng kho lưu trữ, mã của bạn sẽ chuyển đến cơ sở dữ liệu và yêu cầu cơ sở dữ liệu cung cấp dữ liệu. Nó chậm, rất chậm. Nếu mã DbRepository của bạn thay đổi, kiểm tra đơn vị của bộ điều khiển của bạn sẽ không thành công. Chỉ thử nghiệm tích hợp mới cảnh báo bạn về ‘sự cố’ trong trường hợp này. Những gì bạn cần trong các bài kiểm tra đơn vị – là cách ly các lớp của bạn và chỉ kiểm tra một lớp trong một bài kiểm tra (lý tưởng nhất là chỉ một phương thức). Nếu mã DbRepository của bạn không thành công, bạn sẽ nghĩ rằng mã Trình điều khiển không thành công – và điều đó thật tệ (ngay cả khi bạn đã kiểm tra DbRepository và Bộ điều khiển – cả hai đều không thành công và có thể bạn đang bắt đầu sai vị trí). Phải mất nhiều thời gian để xác định lỗi thực sự nằm ở đâu. Bạn nên biết rằng lớp A là tốt và lớp B có gì đó không thành công.
-
Khi bạn muốn thay thế DbRepository bằng một thứ khác trong tất cả các lớp của mình, bạn phải thực hiện rất nhiều việc.
-
Bạn không thể dễ dàng kiểm tra thời gian tồn tại của DbRepository. Một đối tượng của lớp này được tạo khi khởi tạo Bộ điều khiển và bị xóa khi Bộ điều khiển bị xóa. Không có sự tách biệt giữa các thể hiện khác nhau của lớp Trình điều khiển và không có sự tách biệt giữa các lớp khác. Với Ninject, bạn chỉ cần viết:
hạt nhân. Ràng buộc
().ĐẾN ().InSingletonScope();
Một tính năng đặc biệt của tiêm phụ thuộc – phát triển nhanh! Bạn mô tả rằng bộ điều khiển của bạn sử dụng một kho lưu trữ với giao diện IRepository. Bạn không cần viết DbRepository, bạn chỉ cần tạo một lớp MemoryRepository và phát triển Controller trong khi người khác phát triển DbRepository. Khi công việc DbRepository hoàn tất, bạn chỉ cần kết nối lại với trình giải quyết phụ thuộc của mình, mặc định là IRepository bây giờ là DbRepository. Bạn có quá nhiều bộ điều khiển? Bây giờ tất cả chúng sẽ sử dụng DbRepository. To lớn.
Đọc thêm:
- Đảo ngược kiểm soát (wiki)
- Cai nghiện (wiki)
- Đảo ngược vùng chứa điều khiển và mẫu tiêm phụ thuộc (Martin Fowler)
Hy vọng thông qua bài viết Ninject là gì và bạn sử dụng nó khi nào? Cakhia TV trang web trực tiếp bóng đá miễn phí sẽ giúp ích được quý bạn đọc.