2010-09-01 26 views
14

Trong ứng dụng asp.net mvc của tôi, tôi đang sử dụng Ninject làm khung DI.Tiêm HttpContext trong Ninject 2

HttpAccountService của tôi được bộ điều khiển của tôi sử dụng để nhận thông tin từ và đến cookie. Đối với điều này tôi cần HttpContext.Current trong HttpAccountService. Vì đây là một sự phụ thuộc tôi tiêm nó nghĩ các nhà xây dựng như vậy:

kernel.Bind<IAccountService>() 
    .To<HttpAccountService>() 
    .InRequestScope() 
    .WithConstructorArgument("context", HttpContext.Current); 

Thật đáng buồn này luôn gắn với bối cảnh tương tự mà làm cho rằng sau khi yêu cầu đầu tiên kết thúc bối cảnh này trở nên lỗi thời.

Tôi nên tiêm HttpContext đúng cách như thế nào?

Trả lời

23

WithConstructorArgument có quá tải mà phải mất một Func<NinjectContext,T>, ví dụ, bạn có thể sử dụng:

....WithConstructorArgument("context",ninjectContext =>HttpContext.Current);

mà sẽ gọi 'gọi lại cung cấp 'lambda trong xử lý yêu cầu và có được giá trị chính xác tại thời điểm đó trong thời gian [như trái ngược với bạn gọi quá tải khác và cung cấp một giá trị không đổi mà nhận được s tính theo thời gian Bind<>].

(Nếu bạn không cố gắng giả lập ngữ cảnh, tôi cho rằng bạn sẽ cân nhắc sử dụng nội dung)

+0

Cú pháp đó dường như không biên dịch. Nó biên dịch với x => HttpContext.Current, nhưng điều này không đạt được kết quả mong đợi. Có thể vì tôi nhận được ninjectkernel của tôi từ một nhà máy (tĩnh)? –

+0

Khi kiểm tra kỹ hơn, có vẻ như bây giờ tôi đã có được ngữ cảnh chính xác, nhưng vấn đề của tôi phải nằm ở một nơi khác. Thx –

+0

cho bản ghi: đó là do cài đặt lại RedirectToRoute yêu cầu cookie. –

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