Я немного подумал о том, как лучше внедрить внедрение зависимостей непосредственно в язык 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));