2012-04-22 124 views
5

我試着在How can I implement Ninject or DI on asp.net Web Forms?發現了以下解決方案(賈森的回答)依賴注入與Ninject 3 ASP.NET網站

  1. 創建一個新的ASP.NET Web窗體項目
  2. 使用的NuGet添加Ninject。網絡LIB(這也將拉低Ninject.Web.Common和Ninject庫)
  3. 註冊您的自定義綁定在App_Start/NinjectWebCommon.cs/RegisterServices方法
  4. 使用屬性:在您的網頁注入

在ASP.NET Web應用程序中很有效。

問題是我想在ASP.NET 網站中使用Ninject for DI,而不是Web應用程序。

我註冊NinjectWebCommon/RegisterServices自定義綁定:

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

在網頁中我把它注射:

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()); 
    } 
} 

它總是拋出一個空引用異常和內部NinjectWebCommon.cs是斷點從未到達過 - 與Web應用程序不同。

還應該做什麼使Ninject 3在網站上工作?

+0

請注意,由於調試器太晚,所以會觸發斷點。如果你在'kernel.Bind <...> ...'之前編寫'Debugger.Break()',它會觸發該行。 – nebffa 2014-06-26 01:50:42

回答

10

我的第一個建議是...

不要使用ASP.NET網站。忘記它們存在。不惜一切代價避免它們。他們是過時的年代的倒退,只是因爲遺留原因而仍然存在。

我的第二條建議是...

如果你堅持繼續使用網站項目,在頭痛藥大量投資,因爲你會需要它。

我的第三個建議是...的

見的第一個忠告。

我的第四條建議是...

如果你有超過它是否是一個網站項目或沒有,然後就放棄了使用Ninject或任何其他DI的想法完全沒有控制容器。網站項目從Web應用程序站點繼承不同的基類。你不會以同樣的方式工作,而且你可能花太多時間試圖使它合適。

編輯:

基本上,代碼模型作品非常不同的Web站點和Web應用程序之間。您只需查看Web應用程序在Web Application應用程序中沒有名稱空間的事實。這應該告訴你這些有多大的不同。

我不完全確定激活過程甚至在兩者中都起作用。

然而,說了這麼多。你的代碼有一個明顯的問題。你的頁面來自System.Web.UI.Page而不是Ninject.Web.PageBase

+0

+1爲幽默。唉,很難重新編寫所有這些遺留代碼的行。 – AFD 2012-04-22 23:03:42

+0

@AndreiDrynov - 我當時很認真。網站項目是地獄,他們對你施加了很多限制。祝你好運。 – 2012-04-22 23:08:19

+0

我已經使用過你提到過的頭痛藥機))) – AFD 2012-04-22 23:11:13

1

根據你鏈接到的另一個問題,你需要你的頁面繼承自Ninject.Web.PageBase。看起來你的頁面是從System.Web.UI.Page繼承的,它不知道如何注入你的依賴倉庫。

+0

埃裏克,不幸的是,PageBase希望看到NinjectHttpApplication ,但網站不使用該類 – AFD 2012-04-22 23:07:29

+0

然後我懷疑你運氣不好。您需要*東西*將Ninject掛接到您的頁面。 – 2012-04-22 23:12:10