Я немного подумал о том, как лучше внедрить внедрение зависимостей непосредственно в язык C #. Я нашел потенциальное решение, о котором я хотел бы услышать ваше мнение. Я не использовал много фреймворков для внедрения зависимостей, поэтому, возможно, я что-то упускаю
В любом случае, идея состоит в том, чтобы иметь возможность объявлять свойства как «инъецируемые», используя ключевое слово. Когда объект создается, и это свойство не инициализируется с помощью конструктора или инициализатора объекта, он запрашивает экземпляр этого типа свойства у некоторой глобальной службы.
Точно так же вы регистрируете обработчики для различных типов этой службы, чтобы вы могли создать экземпляр внедренного типа свойства.
Преимущество использования такой архитектуры IMO заключается в том, что она довольно гибкая и простая в использовании. Недостатком является то, что при каждом вызове класса, в котором есть инъекция, могут возникать некоторые дополнительные сложности при вызове синглтона.
Опять же, это проблема только для классов, которые часто создаются в высокопроизводительном решении, поэтому это не должно быть проблемой. Возможно, вы могли бы использовать какую-то фабрику в этих случаях.
Мысли, проблемы, вопросы, лучшие идеи?
Код
public class SomeClass
{
public SomeClass()
{
//implicit behavior if Animal is not set in constructor or initializer
this.Animal = GlobalInjector.Get(this,typeof(Mammal))
}
public injectable Mammal Animal
{
get;
set;
}
}
GlobalInjector.Register(typeof(Mammal), () => return new Mammal(someParameter));
Ответы:
Есть вещи, которые принадлежат языкам, и вещи, которых нет. Давным-давно C признал, что IO не принадлежит языку, поскольку он является внешним по отношению к вычислительной модели и может быть реализован с помощью библиотек функций.
Инъекция зависимостей такая. Он является внешним по отношению к языку и может быть реализован с помощью соответствующих структур.
Одной из проблем современных языков является то, что они пытаются сделать слишком много. В конечном итоге эти языки рушатся под собственным весом, поскольку программисты бегут на более простые языки.
источник
Не нужен
Одна из вещей, которые мне больше всего нравятся в лучших DI-средах, которые я использовал, это то, что код конфигурации верхнего уровня - единственная часть вашего кода, которую нужно знать о DI. Автоматическое подключение выполняется на уровне контейнера и конфигурации / «загрузки модуля», и код вашего приложения может быть полностью не замечен.
Это означает, что нет атрибутов, нет волшебных строк, нет соглашения. Каждый фрагмент кода знает только то, что он принимает код в своем конструкторе (/ properties / method), и это все.
С таким дизайном вам вообще не нужно менять язык для поддержки Dependency Injection.
Это потенциально опасно
Больше всего я боюсь в интегрированной с языком системе внедрения зависимостей, что она создаст барьер для любой другой реализации, но в некотором аспекте, вероятно, загорится в угол.
Некоторые способы, которыми это могло нарисовать себя в углу:
источник
Вы видели среду управляемой расширяемости, которая поставляется с .NET 4? Вот статья, которую я написал с некоторыми примерами. По сути, это форма внедрения зависимостей, встроенная в .NET, с дополнительными функциями обнаружения во время выполнения.
Инъекции собственности выглядят так:
Инъекции конструктора выглядят так:
Вы можете импортировать поля, выполнять необязательный импорт, импортировать наборы сервисов, в том числе выполнять ленивый импорт с метаданными, чтобы вы могли искать подходящий сервис для создания экземпляров. Вы можете даже повторно импортировать во время выполнения, чтобы искать новые расширения.
источник
источник