Ho un'interfaccia chiamata IContext
. A tal fine, non importa cosa fa, tranne quanto segue:
T GetService<T>();
Quello che fa questo metodo è guardare l'attuale contenitore DI dell'applicazione e tenta di risolvere la dipendenza. Penso che sia abbastanza standard.
Nella mia applicazione ASP.NET MVC, il mio costruttore ha questo aspetto.
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
Quindi, piuttosto che aggiungere più parametri nel costruttore per ogni servizio (perché questo diventerà davvero fastidioso e dispendioso in termini di tempo per gli sviluppatori che estendono l'applicazione) Sto usando questo metodo per ottenere servizi.
Ora, si sente male . Tuttavia, il modo in cui attualmente lo giustifico nella mia testa è questo: posso deriderlo .
Io posso. Non sarebbe difficile prendere in giro IContext
per testare il controller. Dovrei comunque:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
Ma come ho detto, sembra sbagliato. Eventuali pensieri / abusi sono benvenuti.
public SomeClass(Context c)
. Questo codice è abbastanza chiaro, no? Si afferma, that SomeClass
dipende da a Context
. Err, ma aspetta, non lo fa! Si basa solo sulla dipendenza X
che ottiene dal contesto. Ciò significa che ogni volta che apporti una modifica Context
, potrebbe rompersi SomeObject
, anche se hai cambiato solo Context
s Y
. Ma sì, si sa che avete solo cambiato Y
, non X
, quindi SomeClass
va bene. Ma scrivere un buon codice non riguarda ciò che sai, ma ciò che il nuovo dipendente sa quando guarda il tuo codice per la prima volta.