Ho notato che molti sviluppatori definiscono un'interfaccia per la classe OGNI che verrà iniettata usando il framework DI. Quali sono i vantaggi della definizione di interfacce per ogni classe?Iniezione delle dipendenze e utilizzo delle interfacce?
risposta
Lasciando i vostri componenti dell'applicazione (le classi che contengono logica dell'applicazione) implementare un'interfaccia è importante, dal momento che questo ha promosso il concetto di:
programma a un'interfaccia, non un'implementazione.
Questo è effettivamente il Dependency Inversion Principle. Ciò consente di sostituire, intercettare o decorare dipendenze senza la necessità di cambiare i consumatori di tale dipendenza.
In molti casi, gli sviluppatori violano i principi SOLID quando hanno un mapping quasi uno a uno tra le classi e un'interfaccia. Uno dei principi che è quasi certamente violato è lo Open/closed principle, perché quando ogni classe ha una propria interfaccia, non è possibile estendere (decorare) un insieme di classi con preoccupazioni trasversali (senza l'inganno di generazione di proxy dinamico che è).
Nei sistemi che scrivo, definisco due interfacce generiche che coprono la maggior parte del codice del livello aziendale. Essi sono chiamati ICommandHandler<TCommand>
e un IQueryHandler<TQuery, TResult>
:
public interface ICommandHandler<TCommand>
{
void Handle(TCommand command);
}
public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
TResult Handle(TQuery query);
}
Oltre l'effetto collaterale di non dover definire molte interfacce, questo consente una grande flessibilità e facilità di test. Puoi leggere di più su di esso here e here.
A seconda del sistema che scrivo, mi potrebbe anche utilizzare interfacce come:
IValidator<T>
per la convalida dei messaggiISecurityValidator<T>
per l'applicazione di restrizioni di sicurezza sui messaggiIRepository<T>
, il modello repositoryIAuthorizationFilter<T>
per l'applicazione del filtro di autorizzazione/sicurezza sulle queryIQueryable<T>
.
A seconda del sistema che scrivo, da qualche parte tra l'80% e il 98% di tutti i componenti implementano una di queste interfacce generiche che definisco. Questo rende banale l'applicazione di problemi trasversali a quelli così chiamati joinpoints.
Questo blog ha un sacco di risposte che stai cercando: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/
Se non si progetta per le interfacce, che si sta per essere ostacolati quando arriva il momento di refactoring del codice e/o aggiungere miglioramenti. L'utilizzo di un framework DI non è realmente in discussione quando si tratta di progettare un'interfaccia. Ciò che DI ti dà è la capacità di legare in ritardo e molto meglio scrivere test di unità.
dice che la pagina non è stata trovata.! per favore aggiornare –
- 1. interfacce di registrazione e registrazione delle dipendenze
- 2. Iniezione delle dipendenze nelle prove
- 3. . Iniezione delle dipendenze net-core
- 4. asp.net MVC5 - Iniezione delle dipendenze e AuthorizeAttribute
- 5. Iniezione delle dipendenze ASMX e IoC
- 6. Quale è meglio: Iniezione delle dipendenze + Registro o Iniezione delle dipendenze o Registro globale?
- 7. Utilizzo di Reader Monad per Iniezione delle dipendenze
- 8. Informazioni su Play 2.4 Iniezione delle dipendenze
- 9. Iniezione delle dipendenze in .NET con esempi?
- 10. Iniezione delle dipendenze del servizio angolare fittizio
- 11. Iniezione delle dipendenze come caratteristica della lingua?
- 12. Iniezione delle dipendenze Slim Framework 3
- 13. Iniezione delle dipendenze autowired non riuscita;
- 14. Iniezione delle dipendenze rispetto alle dipendenze gestite rispetto all'oggetto globale
- 15. Iniezione delle dipendenze con XUnit e ASP.NET Core 1.0
- 16. Iniezione delle dipendenze e altri parametri del costruttore: cattive pratiche?
- 17. Iniezione delle dipendenze e ASP.net MVC 5/Web API 2
- 18. Utilizzo immediato delle dipendenze build.gradle in IDE
- 19. Creazione di un AntiForgeryToken tramite Iniezione delle dipendenze
- 20. Iniezione delle dipendenze autowired non riuscita; l'eccezione nidificata è org.springframework.beans.factory.BeanCreationException:
- 21. Iniezione delle dipendenze in WinForms usando Ninject ed Entity Framework
- 22. Iniettare l'iniettore delle dipendenze usando l'iniezione delle dipendenze
- 23. Come creare un contenitore di iniezione delle dipendenze PHP
- 24. Come utilizzare Iniezione delle dipendenze con Entity Framework DbContext?
- 25. Gestione delle dipendenze delle promesse
- 26. Iniezione SQL delle rotaie?
- 27. Gestione delle dipendenze delle formiche
- 28. Best practice dell'iniezione delle dipendenze
- 29. Utilizzo di Spring come framework di iniezione delle dipendenze con il gioco 2.4.x?
- 30. Utilizzo dell'invio delle dipendenze senza alcuna libreria DI
Perché chiudere? Che ne dici di prendere il tempo e lasciare un commento? – aryaxt
-1 Vedere i punti FAQ "Che tipo di domande posso chiedere qui?" e "Quali domande non dovrei chiedere qui". Sono i primi due della lista. –
La tua domanda è una domanda valida e interessante, ma è un po 'vaga e non molto specifica (nessun esempio di codice per esempio), motivo per cui la gente lo ha downvoted e votato per essere chiuso. – Steven