Questo non è necessariamente così. Finché il vostro registratore statico espone un metodo per:
- Iniezione delle classi che si desidera iniettato, o
- iniezione del DI Container in una chiamata di metodo appropriato prima di eseguirlo (voce in qualcosa di simile al asp .net global.asax Application_Start metodo), quindi si dovrebbe andare bene.
Ecco un esempio. Prendere la seguente classe per DI:
public class Logger : ILogger
{
public void Log(string stringToLog)
{
Console.WriteLine(stringToLog);
}
}
public interface ILogger
{
void Log(string stringToLog);
}
Ed ecco la nostra classe statica che ha bisogno di un registratore:
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);
}
}
Ora, in una startup globale per la vostra applicazione (in questo caso, a mio global.asax .cs), è possibile creare un'istanza del contenitore DI, quindi consegnarlo alla classe statica.
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");
}
E presto! Ora sei attivo e funzionante con DI nelle tue classi statiche.
La speranza che aiuta qualcuno. Sto rielaborando un'applicazione che utilizza un sacco di classi statiche, e lo stiamo usando con successo da un po 'di tempo.
fonte
2012-08-20 20:47:44
Mi sembra più simile alla risoluzione delle dipendenze dell'iniezione di dipendenza. La classe statica ora ha conoscenza del framework delle dipendenze. Ma non sarebbe difficile adattarlo per evitarlo. (Risolvere in application_start e inizializzare con dipendenze risolte, anziché fornire il resolver durante l'inizializzazione.) –
La domanda riguarda l'iniezione di una classe statica in una classe statica. Questo riguarda come iniettare un'istanza non statica in una classe statica. Questa sembra una risposta alla seguente affermazione nella risposta precedente: "Inoltre è abbastanza difficile iniettare qualcosa in una classe statica" –
Questo sembra troppo complesso per qualcosa di semplice come un logger. – rolls