Sto provando ad apprendere l'iniezione di dipendenza e ho riscontrato un problema durante il test dell'unità dell'applicazione.Risoluzione dell'iniezione delle dipendenze e test delle unità
Sto scrivendo un'applicazione console e il contenitore viene creata e inizializzata in Main(), è disponibile come get-property
in Program.Container
, in modo da nessuna parte nella mia richiesta mi può chiamare Program.Container.Resolve<..>()
.
Ho una classe ServiceValidator come questo:
public class ServiceValidator
{
private readonly IConfiguration _configuration;
private readonly IService _service;
public ServiceValidator(IConfiguration configuration, IService service)
{
_configuration = configuration;
_service = service;
}
In un'altra classe che uso
ServiceValidator serviceValidator = Program.Container.Resolve<ServiceValidator>();
serviceValidator.VerifyVersion();
E 'la chiamata a Program.Container.Resolve
che mi provoca problemi nel test di unità, in quanto non ha stato configurato
È una cattiva pratica, chiamare la risoluzione sul container? Potrei creare l'istanza ServiceValidator in Main()
e passare l'oggetto in giro, ma ciò sembra stupido poiché causerebbe molti parametri per gli oggetti che sono passati al metodo successivo.
Quindi penso che sia accettabile chiamare Resolve all'interno di una classe, ma il contenitore deve essere configurato per il test dell'unità. Come dovrei farlo, dovrei spostare il container in un altro posto rispetto alla classe Program? Cosa raccomanderesti?
Se è importante, sto usando l'Unità e la C#
Grazie :-)
> Quando si utilizza l'iniezione di dipendenza fino in fondo, >, non sarà necessario passare molti parametri agli oggetti. Non ho mai considerato di fare DI per tutte le classi. Volevo solo fare DI per le classi che usano cose esterne, come servizi web, database, forse configurazione. Se capisco che hai ragione, non chiameresti mai risolutivo o nuovo su qualcosa che non sia un corso di base? Grazie per la risposta :-) – Karsten
È venuto a pensare ad un'altra cosa. Significa che tutti gli oggetti sono creati in anticipo, molto prima che possano essere effettivamente necessari, forse non sono nemmeno necessari? – Karsten
Quando si utilizza completamente il DI, si esegue il bootstrap dell'applicazione recuperando l'oggetto radice dell'applicazione dal contenitore DI e, successivamente, non si accede più direttamente al contenitore. http://docs.google.com/Doc?id=dd2fhx4z_5df5hw8#xefn Gli oggetti verranno creati quando viene creato un oggetto che li ha come dipendenza. In generale, tutti gli oggetti con lo stesso ambito del ciclo di vita vengono istanziati contemporaneamente. Se alcuni oggetti hanno un ambito di vita diverso, è possibile iniettare una fabbrica per istanziarli al momento giusto. –