Funzioni dell'iniezione e dell'aiuto di dipendenza dall'unità

1

Ho un set di servizi che sono usati per leggere / scrivere nel database. Questi vengono iniettati nei miei controller:

ISystemSettingService _systemSettingService = null;
IStatusTypeService _statusTypeservice = null;

public MyController(
    ISystemSettingService systemSettingService,
    IStatusTypeService statusTypeservice)
{
    _systemSettingService = systemSettingService;
    _statusTypeservice = statusTypeservice;
}

Quindi quando ho bisogno di qualcosa da _systemSettingService posso facilmente ottenerlo. Ora ho anche alcune classi / funzioni helper statiche che chiamo da MyController . In queste funzioni ho spesso bisogno di accedere ai servizi in modo da poter accedere al DB. per esempio. Ho una funzione Validate(string userData, ISystemSettingService systemSettingService) che accetta alcuni dati trasmessi dall'utente.

Finora, nella funzione Validate ho passato il _systemSettingService così posso usarlo. Non sono sicuro che sia corretto.

La mia domanda - il mio approccio è corretto o, nella funzione Validate dovrei creare un contenitore di unità in Resolve un'istanza del mio ISystemSettingService o, come ho letto in precedenza, la mia classe helper NON dovrebbe essere statico, e dovrei iniettare ISystemSettingService nel costruttore che apparentemente renderà più semplice il test delle unità.

Sono un po 'confuso! Grazie.

    
posta Rick 03.02.2018 - 13:01
fonte

2 risposte

1

Le tue domande sembrano un po 'confuse riguardo al fatto che Validate sia una funzione o una classe, ma per semplicità, supponiamo che sia una funzione.

Se ti ho capito bene, assicurati che la tua funzione Validate utilizzi internamente lo stesso oggetto ISystemSettingService di MyController . Passandolo come un parametro come

 Validate(userData, _systemSettingService)

in tutti i luoghi in cui viene chiamato Validate è sicuramente un approccio di lavoro. Tuttavia, rendendo Validate non statico, puoi effettivamente raggiungere lo stesso obiettivo in un modo più leggibile e meno soggetto a errori. Quindi, se tutte le chiamate alla versione statica di Validate utilizzerebbero _systemSettingService come secondo parametro, senza eccezioni, quindi rendendolo non statico e salvando il secondo parametro, IMHO è l'alternativa migliore.

L'utilizzo di un contenitore DI per la funzione helper probabilmente renderà il codice più lungo, meno leggibile, più complesso e soggetto a errori, poiché devi assicurarti che il metodo Resolve restituirà lo stesso systemSettingService oggetto fornito a% codice%. IMHO è meglio usare un contenitore DI esclusivamente dove chiaramente rende le cose più semplici.

Nel caso in cui MyController sia un metodo di una classe helper Validate , si applicano le stesse misure: passare l'oggetto Validator direttamente al metodo non è intrinsecamente sbagliato, ma passarlo al costruttore di ISystemSettingService e rendere Validator non-statico probabilmente produrrà un codice più gestibile.

    
risposta data 03.02.2018 - 14:55
fonte
0

Now I also have some static helper classes/functions

Questo è dove stai andando male.

Normalmente come nella risposta a @docbrowns consiglierei di avere una classe non statica con un parametro di costruzione, molto simile al tuo controller.

Tuttavia! Ho notato che il nome della tua classe implica (almeno per me) che i valori forniti da ISystemSettingService siano parametri di impostazione invariati per la tua applicazione?

In questo caso vorrei andare oltre e cercare di eliminare del tutto il servizio. Caricando questo tipo di impostazioni dal file app.config e inserendole direttamente come tipo di valore appropriato nei servizi che le richiedono.

La mia opinione su questo problema è che, sebbene fornisca impostazioni di configurazione dinamicamente da un servizio o da un database, ti viene fornito un "pannello di controllo" per l'applicazione distribuita. A lungo termine, sei molto meglio con queste impostazioni gestite dalla distribuzione. Ciò fornisce una pista di controllo e maggiore sicurezza su come verrà eseguito esattamente un servizio distribuito, senza dover prendere in considerazione la connettività di rete, la memorizzazione nella cache o altri errori

    
risposta data 03.02.2018 - 15:29
fonte

Leggi altre domande sui tag