Eu tenho uma interface chamada IContext. Para isso, não importa realmente o que faz, exceto o seguinte:
T GetService<T>();
O que esse método faz é examinar o contêiner DI atual do aplicativo e tentar resolver a dependência. Bastante padrão, eu acho.
No meu aplicativo ASP.NET MVC, meu construtor se parece com isso.
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
Portanto, em vez de adicionar vários parâmetros no construtor para cada serviço (porque isso será realmente irritante e demorado para os desenvolvedores que estendem o aplicativo), estou usando esse método para obter serviços.
Agora, parece errado . No entanto, a maneira como atualmente estou justificando isso é isso - eu posso zombar .
Eu posso. Não seria difícil zombar IContextpara testar o Controlador. Eu teria que de qualquer maneira:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
Mas como eu disse, parece errado. Quaisquer pensamentos / abuso são bem-vindos.
public SomeClass(Context c). Este código é bastante claro, não é? Afirma, that SomeClassdepende de a Context. Err, mas espere, isso não acontece! Ele depende apenas da dependência Xobtida do Contexto. Isso significa que toda vez que você fizer uma alteração Context, poderá quebrar SomeObject, mesmo que você tenha mudado apenas Contexts Y. Mas sim, você sabe que mudou apenas Ynão X, então tudo SomeClassbem. Mas escrever um bom código não é sobre o que você sabe, mas sobre o que o novo funcionário sabe quando olha para o seu código pela primeira vez.