To niekoniecznie musi tak być. Dopóki statyczny rejestrator naraża metodę:
- wstrzyknięciu klas chcesz wtryskiwanego lub
- wtrysk kontenera DI w odpowiednim wywołanie metody przed uruchomieniem go (powiedzmy w czymś takim jak asp .net global.asax Application_Start), powinieneś być w porządku.
Oto przykład. Podjąć następujące klasy dla DI:
public class Logger : ILogger
{
public void Log(string stringToLog)
{
Console.WriteLine(stringToLog);
}
}
public interface ILogger
{
void Log(string stringToLog);
}
A oto nasza klasa statyczna, która potrzebuje Rejestrator:
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);
}
}
Teraz w globalnym uruchamiania dla aplikacji (w tym przypadku, moim global.asax .cs), możesz utworzyć instancję DI Container, a następnie przekazać ją do swojej klasy statycznej.
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");
}
I presto! Jesteś teraz uruchomiony z DI w swoich klasach statycznych.
Nadzieję, że pomaga komuś. Ponownie pracuję nad aplikacją, która korzysta z DUŻYCH klas statycznych i od pewnego czasu używamy tego z powodzeniem.
Wygląda mi to bardziej na rozwiązywanie zależności niż wstrzyknięcie zależności. Klasa statyczna ma teraz wiedzę o strukturze zależności. Ale nietrudno go przystosować, aby tego uniknąć. (Rozwiązuj w app_start i zainicjuj z rozwiązanymi zależnościami, zamiast dostarczać resolver podczas inicjalizacji.) –
Pytanie dotyczy wstrzykiwania klasy statycznej do klasy statycznej. Zajmuje się tym, jak wstrzyknąć niestatyczną instancję do klasy statycznej. To wygląda jak odpowiedź na następujące stwierdzenie w poprzedniej odpowiedzi: "Również jest dość trudno wstrzyknąć cokolwiek do klasy statycznej" –
To wydaje się zbyt skomplikowane dla czegoś tak prostego, jak rejestrator. – rolls