Troppe dipendenze possono indicare che la classe stessa sta facendo troppo. Per determinare se non sta facendo troppo:
Osservando le dipendenze effettive, non vedo nulla che possa essere indicativo di cose brutte che accadono:
IDbContextFactory: creazione del contesto per il database.
OK, probabilmente siamo all'interno di un livello aziendale in cui le classi interagiscono con il livello di accesso ai dati. Sembra a posto.
IMapper: mappatura da entità a modelli di dominio.
È difficile dire qualcosa senza il quadro generale. È possibile che l'architettura sia errata e che la mappatura debba essere eseguita direttamente dal livello di accesso ai dati o che l'architettura sia perfettamente a posto. In tutti i casi, ha senso avere questa dipendenza qui.
Un'altra scelta sarebbe quella di dividere la classe in due: uno che si occupa della mappatura, l'altro che si occupa della logica aziendale reale. Ciò creerebbe uno strato di fatto che separerà ulteriormente il BL dal DAL. Se i mapping sono complessi, potrebbe essere una buona idea. Nella maggior parte dei casi, tuttavia, aggiungerebbe solo una complessità inutile.
IClock - Abstracts DateTime.Oow per aiutare con i test unitari.
Probabilmente non è molto utile avere un'interfaccia (e una classe) separate solo per ottenere l'ora corrente. Vorrei semplicemente passare DateTime.Now
ai metodi che richiedono l'ora corrente.
Una classe separata può avere senso se ci sono altre informazioni, come i fusi orari o gli intervalli di date, ecc.
IPerformanceFactory: misura il tempo di esecuzione per metodi specifici.
Vedi il prossimo punto
ILog - Log4net per la registrazione.
Tale funzionalità trascendente dovrebbe appartenere al framework e le librerie effettive dovrebbero essere intercambiabili e configurabili in fase di esecuzione (ad esempio tramite app.config in .NET).
Sfortunatamente, questo non è (ancora) il caso, che consente di scegliere una libreria e attenersi ad essa, o creare un livello di astrazione per essere in grado di scambiare le librerie in seguito, se necessario. Se la tua intenzione è specificamente quella di essere indipendente dalla scelta della biblioteca, provaci. Se sei abbastanza sicuro che continuerai a utilizzare la libreria per anni, non aggiungere un'astrazione.
Se la libreria è troppo complessa da usare, ha senso un motivo di facciata.
ICollectionWrapperFactory - Crea raccolte (che estende IEnumerable).
Suppongo che questo crei strutture di dati molto specifiche utilizzate dalla logica del dominio. Sembra una classe di utilità. Utilizzare invece una classe per struttura dati con costruttori pertinenti. Se la logica di inizializzazione è leggermente complicata da inserire in un costruttore, utilizzare metodi di fabbrica statici. Se la logica è ancora più complessa, utilizzare il modello factory o builder.
IQueryFilterFactory: genera query basate sull'input che eseguirà query su db.
Perché non è quello nel livello di accesso ai dati? Perché c'è un Filter
nel nome?
IIdentityHelper: recupera l'utente che ha effettuato l'accesso.
Non sono sicuro del motivo per cui esiste un Helper
suffisso. In tutti i casi, anche altri suffissi non saranno particolarmente espliciti ( IIdentityManager
?)
Comunque, ha perfettamente senso avere questa dipendenza qui.
IFaultFactory - Crea diverse FaultExceptions (utilizzo WCF).
È la logica così complessa da richiedere un modello di fabbrica? Perché viene utilizzata l'iniezione di dipendenza? Scambieresti la creazione di eccezioni tra codice di produzione e test? Perché?
Vorrei provare a trasformarlo in semplice throw new FaultException(...)
. Se è necessario aggiungere alcune informazioni globali a tutte le eccezioni prima di propagarle al client, WCF probabilmente ha un meccanismo in cui si rileva un'eccezione non gestita e può cambiarla e riproporla al client.
Misurare la qualità in base ai numeri è generalmente negativo come essere pagato da righe di codice che scrivi al mese. Potresti avere un elevato numero di dipendenze in una classe ben progettata, dato che puoi avere una classe scadente usando poche dipendenze.
Molte dipendenze rendono la logica più difficile da seguire. Se la logica è difficile da seguire, la classe probabilmente sta facendo troppo e dovrebbe essere divisa.