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 se ve así.
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 será realmente molesto y requerirá 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 actualmente es esto: puedo burlarme de él .
Yo puedo. No sería difícil burlarse IContextpara probar el controlador. Tendría que 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.
public SomeClass(Context c). Este código es bastante claro, ¿no? Dice, that SomeClassdepende de a Context. Err, pero espera, no lo hace! Solo se basa en la dependencia Xque obtiene de Context. Eso significa que, cada vez que se realice un cambio en Contextél podría romper SomeObject, a pesar de que sólo cambió Contexts Y. Pero sí, sabes que solo Yno cambiaste X, así que SomeClassestá bien. Pero escribir un buen código no se trata de lo que usted sabe, sino de lo que sabe el nuevo empleado cuando mira su código la primera vez.