2013-04-03 28 views
8

Tôi đang sử dụng Ninject for DI và phần mở rộng Ninject.MVC3 trong ứng dụng MVC4, phiên bản cụ thể 3.0.0.6.Tôi có cần đăng ký Ninject.OnePerRequestModule với Ninject.Web.MVC 3.0 không?

Đọc documentation trên wiki của Ninject, có vẻ như tuổi thọ của các đối tượng được tạo bằng InRequestScope thực sự được kiểm soát bởi ASP.NET và để dọn dẹp đúng cách nên đăng ký OnePerRequest HttpModule.

Tuy nhiên có vẻ như tài liệu này đã lỗi thời vì không thể tìm thấy type="Ninject.OnePerRequestModule"/>.

Mặt khác, tôi đọc một số bits gần đây dường như gợi ý rằng NinjectHttpApplication đã đề cập đến OnePerRequest.

Câu hỏi của tôi là liệu Ninject.Web.MVC 3.0 đã xử lý vấn đề này hay chưa hoặc tôi vẫn phải tự thêm HttpModule vào 'web.config' của mình.

Tôi đã thêm dưới đây để cấu hình của tôi và tất cả mọi thứ dường như được làm việc, mặc dù tôi không có ý tưởng ở tất cả các cách để kiểm tra khi đối tượng bị phá hủy:

<system.web> 
    <httpModules> 
     <add name="OnePerRequestModule" type="Ninject.Web.Common.OnePerRequestHttpModule"/> 
    </httpModules> 
    ... 

Tôi có cần phải tự thêm các OnePerRequest HttpModule hoặc không Ninject.Web.MVC xử lý này cho tôi?

Trả lời

9

Tóm tắt Exec: Không, bạn không cần phải làm bất cứ điều gì trong số web.config.

Bạn có thể kiểm tra bằng tay sự tỉnh táo bởi:

  • Ràng buộc một cái gì đó IDisposable.InRequestScope()
  • thêm nó vào ctor của một điều khiển
  • gắn một debugger, đặt một breakpoint trong void Dispose()
  • tự kích hoạt một HttpRequest

Nếu bạn nhấn Dispose, nó sẽ là Ninoz Ninject để bắn con gấu (và bạn sẽ có một ngăn xếp cuộc gọi để chứng minh nó).

Nó gắn dây vào điều gì? Các NuGet gói Ninject.Web.Common cho biết thêm:

public static class NinjectWebCommon 
{ 
    public static void Start() 
    { 
     ... 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 

DynamicModuleUtility là từ Microsoft.Web.Infrastructure (và các cuộc gọi đến phương pháp Start được thúc đẩy bởi:

[assembly: WebActivator.PreApplicationStartMethod(typeof(App_Start.NinjectWebCommon), "Start")] 

(Trong đó xuất phát từ gói WebActivator NuGet)


Nói theo ngữ nghĩa, the docco nói nói:

Để có được hành vi xác định hơn, bạn có thể làm bất cứ điều nào sau đây:

  1. ...

  2. Sử dụng tiện ích Ninject.Web.Common đăng ký OnePerRequestModule cho bạn.

...

Bạn thể đăng ký

(tôi nhấn mạnh). Tôi sẽ làm cho nó rõ ràng hơn ...


BTW vào lúc bắt đầu của việc thực hiện việc trả lời câu hỏi này, tôi không có kiến ​​thức đặc biệt, chỉ là nguồn để NinjectNinject.Web.Common và một trong những ứng dụng của tôi.

+0

Doh! Cảm ơn Ruben ... Tôi nên đã xem xét thử nghiệm thông qua IDisposable cho bản thân mình! Và bạn biết đấy, nếu tôi đã không ngủ 4 tiếng đêm trước khi tôi có thể đã thực sự đọc doco đúng ... Cảm ơn bạn đã làm rõ. Nhiều chi tiết hơn wiki. Cảm ơn bạn đã nỗ lực rất nhiều vào câu trả lời. Paul. –

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