6

Tôi có một ứng dụng ASP.NET MVC với một NinjectModule đơn giản:Lỗi kích hoạt HttpContext - Hơn một khớp ràng buộc có sẵn

public class MainModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<AppSettings>().ToSelf().InSingletonScope(); 
     Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem 
     Bind<MainDbContext>().ToSelf().InRequestScope(); 
     Bind<UserInfo>().ToSelf().InRequestScope(); 
    } 
} 

Đây là mã ràng buộc duy nhất trong toàn bộ ứng dụng của tôi. Khi tôi chạy ứng dụng của tôi, tôi ngay lập tức nhận được lỗi runtime này:

Error activating HttpContext
More than one matching bindings are available.
Activation path:
3) Injection of dependency HttpContext into parameter httpContext of constructor of type UserInfo
2) Injection of dependency UserInfo into parameter userInfo of constructor of type HomeController
1) Request for HomeController

Suggestions:
1) Ensure that you have defined a binding for HttpContext only once.

Thông báo lỗi dường như được nói rằng tôi đã xác định các HttpContext ràng buộc nhiều hơn một lần, nhưng những điều khoản ràng buộc duy nhất trong toàn bộ ứng dụng đang trong MainModule và tôi đã chỉ xác định rõ ràng một ràng buộc cho HttpContext. Nếu tôi nhận xét ra rằng dòng mã, tôi ngừng nhận được lỗi, nhưng HttpContext mà được tiêm là không chính xác (đó là một sản phẩm nào, mới được khởi tạo HttpContext thay vì HttpContext.Current).

nhắn

Lỗi không mô tả trình tự chính xác tiêm tôi mong chờ để xảy ra ...

HttpContext nên được tiêm vào constructor của UserInfo, trông như thế này:

public class UserInfo 
{ 
    private readonly HttpContext _httpContext; 

    public UserInfo(HttpContext httpContext) 
    { 
     _httpContext = httpContext; 
    } 

    // ... etc ... // 
} 

UserInfo nên được tiêm vào hàm tạo của HomeController, trông giống như sau:

public class HomeController : Controller 
{ 
    private readonly AppSettings _appSettings; 
    private readonly UserInfo _userInfo; 

    public HomeController(AppSettings appSettings, UserInfo userInfo) 
    { 
     _appSettings = appSettings; 
     _userInfo = userInfo; 
     ViewData[Token.AppSettings] = _appSettings; 
     ViewData[Token.UserInfo] = _userInfo; 
    } 

    // ... actions here ... // 
} 

Tại sao điều này dẫn đến lỗi? Điều này có vẻ giống như một kịch bản tiêm phụ thuộc rất đơn giản. Theo cách nào tôi định nghĩa ràng buộc cho HttpContext nhiều lần?

+0

Bạn đã hiển thị cho chúng tôi mô-đun chính. Bạn havent nói với chúng tôi nếu bạn đang sử dụng Ninject.Web.MVC3 và/hoặc nơi hạt nhân của bạn đang nhận được tạo ra. Lỗi này cho thấy bạn đang thực thi tải mô-đun vào một Hạt nhân nhiều hơn một lần, ví dụ: bằng cách kích hoạt nó trong bạn 'Global' /' HttpApplication' xây dựng/bắt đầu (trong đó có hầu như luôn luôn> 1). –

Trả lời

5

Nếu bạn đang sử dụng phần mở rộng Ninject.MVC3 hơn bạn phải gỡ bỏ

Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem 

vì HttpContext ràng buộc đã được phần mở rộng thêm vào.

+0

Có, tôi đang sử dụng gói nuget Ninject.MVC3 và bạn nói đúng, loại bỏ ràng buộc đó khắc phục sự cố. Ban đầu tôi nghĩ rằng tôi đã nhận được một 'HttpContext' trống khi tôi gỡ bỏ ràng buộc, nhưng điều đó hóa ra là do cái gì khác. Dù sao, cảm ơn bạn đã giúp đỡ của bạn! – devuxer