Tengo una interfaz llamada IContext
. A los efectos de esto, realmente no importa lo que hace, excepto lo siguiente:
T GetService<T>();
Lo que hace este método es mirar el contenedor DI actual de la aplicación e intenta resolver la dependencia. Bastante estándar, creo.
En mi aplicación ASP.NET MVC, mi constructor tiene este aspecto.
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
Entonces en lugar de agregar múltiples parámetros en el constructor para cada servicio (porque esto resultará realmente molesto y tomará mucho tiempo para los desarrolladores que extienden la aplicación) Estoy usando este método para obtener servicios.
Ahora, se siente mal . Sin embargo, la forma en que lo estoy justificando en mi mente es la siguiente: puedo burlarme de ella .
Yo puedo. No sería difícil simular un IContext
para probar el controlador. Tendría que hacerlo de todos modos:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
Pero como dije, se siente mal. Cualquier pensamiento / abuso bienvenido.