Esto no es necesariamente así. Mientras su registrador estático expone un método para:
- La inyección de las clases que desea inyectar o
- La inyección de la DI de contenedores en una llamada al método apropiado antes de ejecutarlo (por ejemplo, en algo así como el asp .net global.asax Método Application_Start), entonces deberías estar bien.
Aquí hay un ejemplo. Tome la siguiente clase para DI:
public class Logger : ILogger
{
public void Log(string stringToLog)
{
Console.WriteLine(stringToLog);
}
}
public interface ILogger
{
void Log(string stringToLog);
}
Y aquí está nuestra clase estática que necesita un registrador:
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);
}
}
Ahora, en un arranque global para su aplicación (en este caso, en mi global.asax .cs), puede crear instancias de su Contenedor DI, y luego entregarlo a su clase estática.
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");
}
Y listo! Ahora está funcionando con DI en sus clases estáticas.
Espero que ayude a alguien. Estoy volviendo a trabajar una aplicación que utiliza MUCHAS clases estáticas, y hemos estado usando esto con éxito desde hace un tiempo.
Me parece más a la resolución de dependencia que a la inyección de dependencia. La clase estática ahora tiene conocimiento del marco de dependencia. Pero no sería difícil adaptarlo para evitarlo. (Resolver en application_start e inicializar con dependencias resueltas, en lugar de suministrar el resolver en la inicialización). –
La pregunta es acerca de cómo inyectar una clase estática en una clase estática. Se trata de cómo inyectar una instancia no estática en una clase estática. Esto parece una respuesta a la siguiente declaración en la respuesta anterior: "También es bastante difícil inyectar algo a una clase estática" –
Esto parece demasiado complejo para algo tan simple como un registrador. – rolls