Ich habe ein wenig darüber nachgedacht, wie die Abhängigkeitsinjektion besser direkt in eine C # -ähnliche Sprache integriert werden kann. Ich habe eine mögliche Lösung gefunden, zu der ich gerne Ihre Meinung hören würde. Ich habe nicht viele Frameworks für die Abhängigkeitsinjektion verwendet, daher kann es sein, dass ich etwas übersehen habe
Auf jeden Fall besteht die Idee darin, Eigenschaften mithilfe eines Schlüsselworts als "injizierbar" deklarieren zu können. Wenn ein Objekt instanziiert wird und diese Eigenschaft nicht über den Konstruktor oder den Objektinitialisierer initialisiert wird, fordert es eine Instanz dieses Eigenschaftstyps von einem globalen Dienst an.
In ähnlicher Weise registrieren Sie Handler für verschiedene Typen für diesen Dienst, damit Sie den injizierten Eigenschaftstyp instanziieren können.
Der Vorteil dieser Art von Architektur IMO ist, dass sie ziemlich flexibel und einfach zu bedienen ist. Der Nachteil ist, dass das Aufrufen des Singletons jedes Mal, wenn Sie eine Klasse mit Injection initiieren, mit einem gewissen Aufwand verbunden sein kann.
Andererseits ist dies nur ein Problem für Klassen, die in einer Hochleistungslösung häufig instanziiert werden, sodass es kein großes Problem sein sollte. Vielleicht könnten Sie in diesen Fällen eine Art Fabrik benutzen.
Gedanken, Probleme, Fragen, bessere Ideen?
Code
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));