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 IContext
para 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 SomeClass
depende de a Context
. Err, mas espere, isso não acontece! Ele depende apenas da dependência X
obtida do Contexto. Isso significa que toda vez que você fizer uma alteração Context
, poderá quebrar SomeObject
, mesmo que você tenha mudado apenas Context
s Y
. Mas sim, você sabe que mudou apenas Y
não X
, então tudo SomeClass
bem. 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.