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));
Antworten:
Es gibt Dinge, die in Sprachen gehören, und Dinge, die nicht dazu gehören. Vor langer Zeit hat C erkannt, dass IO nicht in die Sprache gehört, da es außerhalb des Rechenmodells liegt und mit Funktionsbibliotheken implementiert werden kann.
Abhängigkeitsinjektion ist so. Es ist außerhalb der Sprache und kann mit geeigneten Frameworks implementiert werden.
Eines der Probleme mit modernen Sprachen ist, dass sie versuchen, zu viel zu tun. Schließlich brechen diese Sprachen unter ihrem eigenen Gewicht zusammen, während Programmierer zu einfacheren Sprachen fliehen.
quelle
Es wird nicht benötigt
Eines der Dinge, die mir an den besten DI-Frameworks, die ich verwendet habe, am besten gefallen, ist, dass der Konfigurationscode der obersten Ebene der einzige Teil Ihres Codes ist, der über DI Bescheid wissen muss. Die automatische Verkabelung erfolgt auf Container- und Konfigurations- / "Modul-Lade" -Ebene, und Ihr Anwendungscode kann dies völlig vergessen.
Dies bedeutet keine Attribute, keine magischen Zeichenketten, keine Konvention. Jeder Code weiß nur, dass er Code in seinem Konstruktor akzeptiert (/ properties / Methods), und das ist alles.
Bei einem solchen Design müssen Sie die Sprache überhaupt nicht ändern, um Dependency Injection zu unterstützen.
Es ist möglicherweise gefährlich
Das, was ich an einem sprachintegrierten Abhängigkeitsinjektionssystem am meisten fürchte, ist, dass es eine Barriere gegen jede andere Implementierung bilden würde, sich aber wahrscheinlich in gewisser Hinsicht in eine Ecke streichen würde.
Einige Möglichkeiten, wie es sich in eine Ecke malen könnte:
quelle
Haben Sie das mit .NET 4 gelieferte Managed Extensibility Framework gesehen ? Hier ist ein Artikel, den ich mit einigen Beispielen geschrieben habe. Grundsätzlich handelt es sich um eine in .NET integrierte Form der Abhängigkeitsinjektion mit den zusätzlichen Funktionen zur Erkennbarkeit zur Laufzeit.
Eigenschaftsinjektionen sehen folgendermaßen aus:
Konstruktorinjektionen sehen folgendermaßen aus:
Sie können Felder importieren, optional importieren, Sammlungen von Diensten importieren, einschließlich des verzögerten Imports mit Metadaten, damit Sie nach einem geeigneten Dienst zum Instanziieren suchen können. Sie können zur Laufzeit sogar erneut importieren, um nach neuen Erweiterungen zu suchen.
quelle
quelle