2012-04-12 40 views
0

我有一個使用Ninject(NuGet安裝)的ASP.NET MVC 3項目。我想了解如何使用它將依賴關係注入到非MVC對象中。如何在ASP.NET MVC應用程序中爲非MVC對象使用Ninject

我有一些看起來類似於下面的代碼。我如何使用Ninject在下面的對象中獲取IStore的具體實例?

public class SomeObject 
{ 
    private static IStore _store; 

    public static IStore CurrentStore 
    { 
     get 
     { 
      if (_store == null) 
      { 
       // Get Instance of _store. 
      } 
      return _store; 
     } 
    } 
} 

在Global.asax中:

protected Application_BeginRequest() 
{ 
    IStore store = SomeObject.CurrentStore; 
} 

在NinjectWebCommon.cs:

private static void RegisterServices(IKernel kernel) 
    { 
     // Module that binds a concrete type of IStore. 
     kernel.Load<WebModule>(); 
    } 

回答

1

對於請求處理的最簡單的方法是不要做它在Global.asax,但在IHttpModule的。還有,如果你添加綁定了的HttpModule,你可以採取的依賴構造函數的參數:

Bind<IHttpModule>().To<MyHttpModule>(); 
+0

此方法工作正常,但它意味着我必須檢查_store爲null並將其值設置在我的模塊中,該值將在每個請求中運行。有更清潔的方法嗎? – 2012-04-13 05:05:16

0

它看起來像這樣混淆DI容器& Web應用程序之間的邊界。

你可能需要的是一個類來檢索商店。這個類然後可以決定從哪裏實際檢索商店。它也會有初始化例程,可以在啓動時調用它。這樣,您的Ninject模塊不會獲取Web應用程序代碼,您可以配置商店如何基於上下文加載(例如,測試可能與生產不同)。

相關問題