Unity-Statische Konstanteneigenschaft Injektion
Ich habe zwei Klassen, eine, die legt den container mit der Registrierung Arten und eine davon enthält eine statische Eigenschaft, die ich möchte einzuspritzen. Mein Problem ist das Eigentum ist nie durch Injektion also, wenn ich eine Methode aufrufen, wird die Eigenschaft immer den Wert null.
public class ClassOne
{
public void Method()
{
Container.RegisterType<IClass, ClassImplOne>("ImplOne");
Container.RegisterType<IClass, ClassImplTwo>("ImplTwo");
}
}
public static class ClassTwo
{
[Dependency]
public static IClass SomeProperty { get; set; }
public static void SomeOtherMethod()
{
SomeProperty.AnotherMethod();
}
}
Wenn ich entfernen Sie die Abhängigkeit Attribut und in ClassOne eine einfache
ClassTwo.SomeProperty = Container.Resolve<IClass>("ImplOne");
funktioniert es einwandfrei, aber ich möchte wissen, ob es möglich ist, dies zu tun, ohne explizit einen Wert zuweisen der Eigenschaft (also der container injizieren durch Attribute)?
Edit:
Dank. Ich habe entfernt die statische Deklaration von ClassTwo und in ClassOne Hinzugefügt RegisterType und Lösen für ClassTwo und auch InjectionProperty:
Container.RegisterType<IClass, ClassImplOne>("ImplOne", new InjectionProperty("SomeProperty"));
aber es funktioniert immer noch nicht :S
- Bearbeitet meine Antwort genauer zu sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einheit injizieren von Abhängigkeiten, wenn die Klasse wird aufgelöst durch die Einheit. Eine statische Klasse kann nicht erstellt werden, so dass die Einheit kann nicht Spritzen Abhängigkeiten.
Anstatt eine Statische Klasse, die Verwendung der Einheit zu lösen, ein pseudo-singleton-Klasse (
ContainerControlledLifetimeManager
) von ClassTwo. Auf diese Weise die Einheit injiziertIClass
zuClassTwo
wennClassTwo
erstellt wird (behoben, bei Unity-container) und so konfiguriert ist, wie singleton, haben Sie immer die gleichen instace vonClassTwo
im ganzen lifecicle Ihrer Anwendung.Die Sie beheben müssen ClassTwo durch die Einheit.
Und wenn Sie benötigen, ClassTwo:
Dass die config in ClassTwo:
ABER das ist keine tolle Lösung, ich glaube, dein problem ist mit der phylosophy DI. Sie müssen die Kaskade der Abhängigkeiten von der oberen Ebene Klassen Ihrer app. Lösen Sie die Obere Schicht Klassen in einer expliziten Art und Weise. (
Container.Resolve
) und Abhängigkeiten Injektion Kaskade Dank der Magie der Einheit. Wenn 2 Klassen (top-Ebene oder nicht) müssen mit derselben Instanz vonClassTwo
Einheit tun die schmutzige Arbeit, wenn Sie konfiguriertClassTwo
mitContainerControlledLifetimeManager
.In anderen Worten, Sie brauchen nicht statische Klasse, die Sie injizieren die gleiche Instanz einer Klasse in andere Klassen als brauchen.
Bearbeitet nach der Berücksichtigung der Stellungnahmen:
Gibt es eine Vielzahl von Gründen, warum zu Zeiten, die Sie noch wollen oder brauchen, um die Verwendung von statischen Klassen statt cascading alles durch die Einheit.
Wenn die statische Klasse hat eine Abhängigkeit zu einer anderen Klasse, die Sie würde sein wollen, konfigurierbar/austauschbar über Ihre Einheit Konfiguration, die ich lieber mit einem factory-pattern, wie hier beschrieben Wie zu beheben Abhängigkeit in der statischen Klasse mit Unity? oder einfach nur das zuweisen einer Funktion zu lösen, die Abhängigkeit, wenn nötig, eher als Verweis auf die Container aus der statischen Klasse. Ein Vorteil liegt auch darin, dass alle Ihre Einheit Konfiguration kann an der gleichen Stelle.
In Ihrem Fall könnte es so Aussehen:
Und in Ihrer Einheit-Konfiguration hinzufügen diese: