Il y a beaucoup d'endroits dans le .NET Framework qui utilise l'injection de dépendance. Tout d'abord, .NET Framework utilise beaucoup de patterns GoF et certains d'entre eux s'appuient fortement sur Dependency Injection. Par exemple, Decorator Design Pattern utilise toujours injection Constructor et Strategy Design Pattern utilise l'injection Constructor ou d'une méthode d'injection:
// Decorator on Streams (uses Constructor Injection)
var ms = new MemoryStream();
var bs = new BufferedStream(ms);
// Strategy of sorting (uses Method Injection)
var list = new List<int>();
list.Sort(new CustomComparer());
// Strategy of sorting (Constructor Injection)
var sortedArray = new SortedList<int, string>(
new CustomComparer());
// Strategy of starting new task using TaskScheduler
// (Method Injection)
var task = Task.Factory.StartNew(
() => { },
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default);
// All method that takes IFormatProvider and
// similar strategies is an example of the Method Injection
IFormatProvider provider = null;
42.ToString(provider);
Toute utilisation de Abstract Factory Design Pattern signifie que vous allez à l'objet usine « injecter » à l'aide d'injection Constructor ou d'une méthode d'injection et il y a une beaucoup d'exemples dans .NET Framework de ce modèle comme DbProviderFactory.Pour obtenir plus d'exemple qui montrera ce que les types BCL utilisent Constructor Injection, j'ai écrit une requête LINQ simple (je le montrerai plus tard) qui énumère tous les types accessibles pour trouver des types avec un constructeur public qui accepte un interface ou type abstrait en tant que paramètre. Cette requête a montré beaucoup d'autres usages du constructeur Injection dans .NET Framework (ici quelques exemples):
// ResourceReader takes a Stream
Stream ms = new MemoryStream();
var resourceReader = new ResourceReader(ms);
// BinaryReader/BinaryWriter, StreamReader/StreamWriter
// takes a Stream as well
var textReader = new StreamReader(ms);
// MethodCall takes a IMessage
IMessage message = new System.Runtime.Remoting.Messaging.MethodResponse(null, null);
var methodCall = new System.Runtime.Remoting.Messaging.MethodCall(message);
// Icon takes a Stream
var icon = new System.Drawing.Icon(ms);
// DbEnumerator takes a IDataReader
IDataReader dataReader = new DataTableReader(new DataTable());
var dbEnumerator = new System.Data.Common.DbEnumerator(dataReader);
Ceci est seulement la liste limitée des types et .NET Framework contient beaucoup plus de types qui repose sur cette technique. Constructor Injection était une technique largement utilisée bien avant que ce terme apparaisse, donc je ne suis pas surpris que cela soit si largement utilisé. Vous pouvez utiliser suivant LINQ-requête pour obtenir beaucoup plus d'autres échantillons d'injection constructeur (et avec une légère modification, vous pouvez écrire une requête qui va trouver Méthode modèles d'injection):
var types =
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.SelectMany(t => t.GetConstructors()
.Where(c => c.GetParameters()
.Any(cp =>
(cp.ParameterType.IsAbstract ||
cp.ParameterType.IsInterface))))
.Select(ci => new {Type = ci.DeclaringType, Constructor = ci.GetConstructorInfo()})
.Where(t => !t.Type.Namespace.Contains("Internal"));
il semble que vous êtes confus quant à ce l'injection de dépendance est vraiment. –
@Mauricio Scheffer Probablement; C'est pourquoi j'espère trouver une classe dans le framework .NET qui l'utilise. Ce sera le parfait cas d'exemple du monde réel pour m'aider à le comprendre. –
Ce lien vous aidera à mieux comprendre la DI que certaines classes .NET FX: http://stackoverflow.com/questions/130794/what-is-dependency-injection. – Steven