2012-04-22 36 views
5

Tôi đã thử các giải pháp sau đây được tìm thấy trong How can I implement Ninject or DI on asp.net Web Forms? (Jason của câu trả lời)Dependency Injection với Ninject 3 trong ASP.NET trang web

  1. Tạo một WebForms ASP.NET mới dự án
  2. Sử dụng NuGet để thêm Ninject. lib Web (mà cũng sẽ mang xuống libs Ninject.Web.Common và Ninject)
  3. đăng ký cam kết ràng buộc tùy chỉnh của bạn trong App_Start/NinjectWebCommon.cs/RegisterServices phương pháp
  4. Sử dụng thuộc tính tiêm trên trang của bạn

Hoạt động tốt trong các ứng dụng web ASP.NET.

Vấn đề là tôi muốn sử dụng Ninject cho DI trong một trang web ASP.NET , không phải là một ứng dụng web.

Tôi đã đăng ký cam kết ràng buộc tùy chỉnh trong NinjectWebCommon/RegisterServices:

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ITestRepository>().To<TestRepository>(); 
} 

Trong một trang web tôi tiêm nó:

public partial class _Default : System.Web.UI.Page 
{ 
    [Inject] 
    public ITestRepository _repository { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     System.Diagnostics.Trace.WriteLine(_repository.ExecuteOperation()); 
    } 
} 

Nó luôn luôn ném một ngoại lệ tham chiếu null và breakpoint bên NinjectWebCommon.cs là không bao giờ đạt được - không giống như trong một ứng dụng web.

Điều gì khác nên được thực hiện để làm cho Ninject 3 hoạt động trong một trang web?

+0

Lưu ý rằng điểm ngắt được nhấn vì trình gỡ rối gắn quá muộn. Nếu bạn viết 'Debugger.Break()' trước 'kernel.Bind <...> ...' nó sẽ nhấn vào dòng đó. – nebffa

Trả lời

10

Lời khuyên đầu tiên của tôi cho bạn là ...

Không sử dụng ASP.NET Web Sites. Hãy quên họ tồn tại. Tránh cho họ phải trả tất cả chi phí. Họ là một sự trở lại lỗi thời cho những ngày đau khổ mà chỉ còn ở đây vì những lý do di sản.

mảnh thứ hai của tôi lời khuyên sẽ là ...

Nếu bạn nhấn mạnh vào việc tiếp tục sử dụng một dự án trang web, đầu tư mạnh vào thuốc nhức đầu, vì bạn sẽ cần nó.

Lời khuyên thứ ba của tôi sẽ là ...

Xem lời khuyên đầu tiên.

mảnh thứ tư của tôi lời khuyên sẽ là ...

Nếu bạn đã hoàn toàn không kiểm soát được hay không đó là một dự án trang web hay không, sau đó chỉ cần bỏ trên ý tưởng của việc sử dụng Ninject hoặc bất kỳ DI khác thùng đựng hàng. Các dự án trang web kế thừa từ một nhóm các lớp cơ sở khác với các trang Web Application. Bạn sẽ không làm cho nó hoạt động theo cùng một cách, và có thể bạn sẽ dành quá nhiều thời gian để làm cho nó phù hợp.

EDIT:

Về cơ bản, mô hình mã hoạt động rất khác nhau giữa các trang web và ứng dụng web. Bạn chỉ cần nhìn không xa hơn thực tế là các ứng dụng Web site không có các không gian tên trong khi các ứng dụng Web Application làm. Điều này sẽ cho bạn biết mức độ khác nhau rất lớn.

Tôi không hoàn toàn chắc chắn quá trình kích hoạt thậm chí hoạt động giống nhau trong cả hai.

Tuy nhiên, đã nói tất cả điều đó. Có một vấn đề rõ ràng với mã của bạn. Trang của bạn xuất phát từ System.Web.UI.Page thay vì Ninject.Web.PageBase

+0

+1 cho sự hài hước. Than ôi, rất khó để viết lại tất cả các dòng mã cũ đó. – AFD

+0

@AndreiDrynov - Tôi đã nghiêm túc. Dự án trang web là địa ngục, và họ đặt rất nhiều hạn chế về bạn. Chúc may mắn. –

+0

Tôi đã sử dụng máy thuốc nhức đầu mà bạn đã đề cập))) – AFD

1

Theo câu hỏi khác mà bạn đã liên kết, bạn cần trang của mình để kế thừa từ Ninject.Web.PageBase. Dường như trang của bạn được kế thừa từ System.Web.UI.Page, trang này không biết cách chèn kho lưu trữ phụ thuộc của bạn.

+0

Eric, bất ngờ PageBase muốn xem NinjectHttpApplication , nhưng các trang web không sử dụng lớp đó – AFD

+0

Sau đó, tôi nghi ngờ bạn đang gặp may. Bạn cần * một cái gì đó * để móc Ninject vào trang của bạn. –

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