2012-06-26 18 views
6

Vấn đề bắt đầu khi tôi đang cố gắng sử dụng các giải pháp dưới đây để sử dụng Ninject 3 với một MVC 4 RC dự án Web Api:báo lỗi khi xử lý một IActivationBlock và nhập khẩu IKernel

http://www.peterprovost.org/blog/2012/06/19/adding-ninject-to-web-api/

giải pháp này sử dụng IActivationBlock (được tạo bằng phương thức BeginBlock từ IKernel) để thực hiện phạm vi của các cuộc gọi. Với dự án Ninject thông thường, dường như hoạt động tốt, nhưng khi dự án sử dụng phần mở rộng Ninject.Extensions.Interception.DynamicProxy, ngoại lệ sau xảy ra khi phương thức Vứt bỏ khối kích hoạt được gọi là:

Lỗi tải thành phần Ninject IAdviceRegistry

Không có thành phần nào được đăng ký trong vùng chứa thành phần của hạt nhân.

Và, trong thời gian tới khi một ActivationBlock mới được tạo ra và phương pháp Giải quyết được gọi là, ngoại lệ sau đây xảy ra:

Lỗi tải Ninject phần ICache

Không thành phần như đã được đã đăng ký trong thùng chứa thành phần của hạt nhân.

Có vẻ như vấn đề không liên quan trực tiếp đến bản cập nhật MVC, nhưng một số không tương thích giữa DynamicProxy và IActivationBlock.

Edit:

Các nguồn gốc của vấn đề là khi một trong những loại đòi hỏi IKernel trên các nhà xây dựng, và nó không liên quan trực tiếp đến DynamicProxy, nhưng ngoại lệ đầu tiên chỉ xảy ra khi bạn tham chiếu assembly này.

Vì vậy, lỗi thứ hai (liên quan đến ICache) luôn xảy ra nếu loại của bạn yêu cầu IKernel.

+0

Tôi cũng thấy điều này là –

+0

Bất cứ ai từng tìm ra một workarround? – dtabuenc

Trả lời

0

Để tập trung vào phân tích tốt đẹp của bạn: bạn tạo một thể hiện của một lớp bên trong ActivationBlock có sự phụ thuộc trực tiếp vào IKernel.

Đây là một lỗ hổng hợp lý, vì ý tưởng của ActivationBlock là "khôi phục trạng thái" của hạt nhân sau khi khối được xử lý và một thể hiện có quyền truy cập vào hạt nhân và có thể thay đổi bất kỳ ràng buộc nào. (có, trường hợp có thể là một IDisposable mà làm sạch sau khi tự của nó, sau đó không có lỗ hổng hợp lý - chỉ là một trường hợp sử dụng bất thường).

Thử nghiệm của tôi là phần lớn các ứng dụng này là để gọi IKernel.Get < ...> (...) và bạn bè. Rõ ràng đây là hợp lệ bên trong một ActivationBlock: bạn chỉ yêu cầu nhiều hơn bạn cần: một IKernel thay vì IResolutionRoot (ví dụ bạn không cần IBindingRoot của IKernel). Thay đổi các loại trong lớp học của bạn và bạn sẽ ổn thôi.

P.S. Cảm ơn bạn đã phân tích về nguồn gốc của ngoại lệ. Nó đã giúp tôi với vấn đề của riêng tôi.

Các vấn đề liên quan