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 IContextper 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 SomeClassdipende da a Context. Err, ma aspetta, non lo fa! Si basa solo sulla dipendenza Xche ottiene dal contesto. Ciò significa che ogni volta che apporti una modifica Context, potrebbe rompersi SomeObject, anche se hai cambiato solo Contexts Y. Ma sì, si sa che avete solo cambiato Y, non X, quindi SomeClassva 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.