這不一定如此。只要你的靜態記錄公開了一種方法:在類似的ASP運行它(比如之前的類
- 注入你想注入,或
- 注射的DI容器在適當的方法調用.net global.asax Application_Start方法),那麼你應該沒問題。
下面是一個例子。看看下面的類DI:
public class Logger : ILogger
{
public void Log(string stringToLog)
{
Console.WriteLine(stringToLog);
}
}
public interface ILogger
{
void Log(string stringToLog);
}
下面是我們的靜態類,它需要一個記錄:
public static class SomeStaticClass
{
private static IKernel _diContainer;
private static ILogger _logger;
public static void Init(IKernel dIcontainer)
{
_diContainer = dIcontainer;
_logger = _diContainer.Get<ILogger>();
}
public static void Log(string stringToLog)
{
_logger.Log(stringToLog);
}
}
現在,在全球啓動了您的應用程序(在這種情況下,我的Global.asax .cs),你可以實例化你的DI容器,然後把它交給你的靜態類。
public class Global : Ninject.Web.NinjectHttpApplication
{
protected override IKernel CreateKernel()
{
return Container;
}
static IKernel Container
{
get
{
var standardKernel = new StandardKernel();
standardKernel.Bind<ILogger>().To<Logger>();
return standardKernel;
}
}
void Application_Start(object sender, EventArgs e)
{
SomeStaticClass.Init(Container);
SomeStaticClass.Log("Dependency Injection with Statics is totally possible");
}
而且急!你現在已經開始在你的靜態類中使用DI了。
希望能幫助別人。我正在重新開發一個使用很多靜態類的應用程序,我們現在已經成功地使用了它。
在我看來更像是依賴解析比依賴注入。靜態類現在已經瞭解了依賴框架。但要避免它,並不難。 (在application_start中解析並使用已解析的依賴項進行初始化,而不是在初始化時提供解析器。) – 2014-09-02 15:52:39
問題是關於將靜態類注入靜態類。這涉及如何將非靜態實例注入靜態類。 這看起來像是對以前的回答中的以下陳述的迴應:「同樣很難將任何東西注入靜態類」 – 2015-05-11 15:25:17
對於像記錄器這樣簡單的事情,這看起來過於複雜。 – rolls 2017-04-30 03:34:29