В .NET Framework есть много мест, где используется Dependency Injection.Прежде всего .NET Framework использует множество шаблонов GoF, и некоторые из них в значительной степени зависят от внедрения зависимостей.Например, Шаблон проектирования декоратора всегда использует конструктор Injection, а Шаблон проектирования стратегии использует конструктор Injection или Method 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);
Любое использование Абстрактная фабрикаШаблон проектирования означает, что вы собираетесь «внедрить» объект фабрики, используя конструктор «Инъекция» или «Инъекция метода», и в .NET Framework есть множество примеров этого шаблона, например DbProviderFactory .
Чтобы получить больше примеров, которые покажут, что типы BCL используют Constructor Injection, я написал простой запрос LINQ (я покажу его позже), который перечисляет все доступные типы для поиска типов с помощью открытого конструктора, который принимает интерфейс илиабстрактный тип как параметр.В этом запросе было показано много других применений Constructor Injection в .NET Framework (здесь приведены некоторые примеры):
// 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);
Это только ограниченный список типов, и .NET Framework содержит еще много типов, основанных на этом методе.Конструктор инъекций широко использовался техникой задолго до появления этого термина, поэтому я не удивляюсь, что он так широко используется.Вы можете использовать следующий LINQ-запрос, чтобы получить еще много других примеров внедрения конструктора (и с небольшой модификацией вы можете написать запрос, который найдет шаблоны внедрения метода):
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"));