Chuyên mục
Hỏi Đáp

Ninject là gì và bạn sử dụng nó khi nào?

ninject là một bộ tiêm phụ thuộc cho .net triển khai mẫu tiêm phụ thuộc (đảo ngược mẫu điều khiển).

giả sử bạn có hai lớp kho lưu trữ và bộ điều khiển:

bộ điều khiển lớp {private dbrepository _repository; // … 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 gặp hai vấn đề:

  1. bạn phải khởi tạo _repository để sử dụng nó. bạn có một số tùy chọn để thực hiện việc này:

    1. theo cách thủ công, trong hàm tạo. nhưng điều gì sẽ xảy ra nếu bạn thay đổi phương thức khởi tạo của dbrepository? bạn sẽ cần phải viết lại lớp bộ điều khiển của mình vì mã mà nó phụ thuộc đã thay đổi. Không khó nếu bạn chỉ có một bộ điều khiển, nhưng nếu bạn có nhiều lớp phụ thuộc vào bạn, thì kho lưu trữ thực sự có vấn đề.
    2. Bạn có thể sử dụng bộ định vị dịch vụ hoặc nhà máy. nhưng bây giờ bạn phải dựa vào bộ định vị dịch vụ của mình. có bộ đị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 của mã cho logic kích hoạt nhưng cho một phần khác của mã của bạn? Chỉ có một cách: chuyển bộ định vị dịch vụ qua các hàm tạo. nhưng với ngày càng nhiều lớp học, bạn sẽ cần phải vượt qua nó ngày càng nhiều lần. Dù sao thì đó cũng là một ý kiến ​​hay, nhưng về lâu dài thì đó là một ý kiến ​​tồi.

      bộ điều khiển lớp {private dbrepository _repository; public controller () {_repository = sentayho.com.vn & lt; dbrepository & gt; ()} //… một số phương thức sử dụng _repository}

      bạn có thể sử dụng tính năng tiêm phụ thuộc. nhìn vào mã:

      controller class {private irepository _repository; bộ điều khiển công cộng (kho lưu trữ) {_repository = kho lưu trữ; }}

      ngay bây giờ khi bạn cần, hãy nhập bộ điều khiển: sentayho.com.vn & lt; controller & gt; (); hoặc sendayho.com.vn & lt; controller & gt; () ;. bạn có thể chuyển đổi giữa các trình phân giải phụ thuộc nhanh như bạn muốn. đồng hồ? nó đơn giản, bạn không cần phải nhập nhiều.

      bạn không thể tạo các bài kiểm tra đơn vị cho nó. bộ điều khiển của bạn phụ thuộc vào kho lưu trữ và nếu bạn muốn thử nghiệm một số phương pháp sử dụng kho lưu trữ, mã của bạn sẽ đi đến cơ sở dữ liệu và yêu cầu bạn cung cấp dữ liệu. nó chậm, rất chậm. nếu mã kho lưu trữ của bạn thay đổi, bộ điều khiển kiểm tra đơn vị của bạn sẽ bị lỗi. chỉ kiểm tra 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 kiểm thử đơn vị là cô lập các lớp của mình và chỉ kiểm tra một lớp trong một bài kiểm tra (lý tưởng là chỉ một phương pháp). nếu mã kho lưu trữ của bạn không thành công, bạn sẽ nghĩ rằng mã bộ điều khiển của mình không thành công và điều đó thật tệ (ngay cả khi bạn đã kiểm tra cả kho lưu trữ và bộ điều khiển, cả hai đều sẽ thất bại và có thể bạn đang bắt đầu từ sai chỗ). phải mất nhiều thời gian để xác định lỗi thực sự ở đâu. bạn cần biết rằng lớp a là tốt và lớp b đã xảy ra sự cố.

      khi bạn muốn thay thế dbrepository bằng thứ gì đó khác trong tất cả các lớp của mình, bạn phải làm rất nhiều việc.

      Bạn không thể dễ dàng kiểm soát thời gian tồn tại của kho lưu trữ. Một đối tượng của lớp này được tạo khi khởi tạo trình điều khiển và bị xóa khi trình điều khiển bị gỡ bỏ. nó không được chia sẻ giữa các trường hợp khác nhau của kính điều khiển và nó không được chia sẻ giữa các lớp khác. với ninject, bạn có thể chỉ cần viết:

      kernel.bind & lt; irepository & gt; (). thành & lt; dbrepository & gt; (). insingletonscope ();

      một tính năng đặc biệt của tiêm phụ thuộc: phát triển nhanh nhẹn! 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 phải viết kho lưu trữ dbre, bạn chỉ có thể tạo một lớp kho lưu trữ từ bộ nhớ và phát triển trình điều khiển trong khi người khác phát triển kho lưu trữ dbre. khi công việc của dbrepository được thực hiện, bạn chỉ cần rebind trong trình giải quyết phụ thuộc của mình, irepository mặc định bây giờ là dbrepository. bạn có nhiều bộ điều khiển không? tất cả chúng bây giờ sẽ sử dụng dbrepository. tuyệt vời.

      đọc thêm:

      1. đảo ngược kiểm soát (wiki)
      2. loại bỏ phụ thuộc (wiki)
      3. đảo ngược vùng chứa kiểm soát và tiêm phụ thuộc (martin fowler)

Trả lời

Email của bạn sẽ không được hiển thị công khai.