2010-09-02 51 views
2

我有以下的HttpHandler:HttpHandler的使用Ninject返回房產注入空

public class NewHandler : IHttpHandler 
{ 
    [Inject] 
    public IFile FileReader 
    { 
     get; 
     set; 
    } 

    public NewHandler() 
    { 
    } 

    public void ProcessRequest(System.Web.HttpContext context) 
    { 
     .... 
     var something = SomeMethod(FileReader); 
     .... 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 
} 

這是我Ninject模塊在Global.asax。

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IFile>().To<FileWrapper>().InSingletonScope(); 
    } 
} 

每次處理程序觸發時,FileReader都是NULL。我錯過了什麼嗎?這是使用Ninject進行屬性注入的正確方法嗎?

謝謝

回答

3

這是使用Ninject進行屬性注入的正確方法,但它不起作用。您可能使用類似NinjectMvcApplication類作爲您的應用程序的基類,它處理控制器和控制器可能使用的所有內容(服務,存儲庫)的依賴注入。但是HttpHandlers沒有被ControllerFactory實例化,因此沒有任何東西需要注入注入。

也許有更好的方法來做到這一點,但我用服務定位器來解決依賴。見http://code.dortikum.net/2010/08/05/asp-net-mvc-di-with-common-service-locator-and-ninject/

UPDATE:

嘗試這樣:

public class NewHandler : IHttpHandler 
{ 
    private readonly IFile _fileReader; 

    public NewHandler() 
    { 
     _fileReader = ServiceLocator.Current.GetInstance<IFile>(); 
    } 

    public void ProcessRequest(System.Web.HttpContext context) 
    { 
     .... 
     var something = SomeMethod(_fileReader); 
     .... 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 
} 
+0

謝謝!我讀了這篇文章,很有意思。爲了試用它,我相應地修改了我的應用程序,但在ProcessRequest觸發時我仍然設法在FileReader屬性中獲得NULL。 – Thomas 2010-09-02 21:01:09

+0

@Thomas - 查看我的更新 – Necros 2010-09-03 00:19:39

+0

是的,該方法有效。仍然很好奇,爲什麼不能按照控制器的相同方式進行屬性注入。可能與請求管道有關。如果有人知道,請讓我知道。 Necros,再次感謝! – Thomas 2010-09-03 00:32:56