Ich verwende den Unity IoC-Container zum Auflösen meiner Objekte. Ich bin jedoch auf ein Problem gestoßen. Wenn ich mehr als einen Konstruktor habe - woher weiß Unity, welchen er verwenden soll? Es scheint den mit Parametern zu verwenden, wenn ich einen mit und einen ohne habe. Kann ich ihm explizit sagen, welcher Konstruktor verwendet werden soll?Angeben des Konstruktors für den zu verwendenden Unity-IoC-Container
Speziell hatte ich einen Fall ähnlich der folgenden Person Klasse mit zwei Konstruktoren. In diesem Fall möchte ich, dass der IoC-Container den Standardkonstruktor verwendet - ohne Parameter -, aber er wählt denjenigen mit Parametern.
Dies schlägt offensichtlich fehl, da das SomeValueObject nicht erstellt werden kann - ohne zu wissen, was in den String-Parameter injiziert werden soll. Der Fehler gibt es:
Auflösung der Abhängigkeit fehlgeschlagen, Type = "MyApp.Person", name = "". Ausnahmebedingungsnachricht lautet: Die aktuelle Buildoperation (Buildschlüssel Buildschlüssel [MyApp.Person, null]) ist fehlgeschlagen: Der Parameter obj konnte nicht aufgelöst werden, wenn versucht wird, den Konstruktor MyApp.Person (MyApp.SomeValueObject obj) aufzurufen. (Strategietyp BuildPlanStrategy, Index 3)
Der Behälter Anmeldung:
Container.RegisterType<Person, Person>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
Und die Lösung:
var person = Container.Resolve<Person>();
Ist nicht der Punkt von IoC, Interfaces zu verwenden ??? – Martin
Sicher, und das mache ich meistens. Aber das machte für die Frage keinen Unterschied. – stiank81
@Martin Viele Programmierer verwenden Klassen und vermeiden die falsche Allgemeingültigkeit, eine Schnittstelle zu erstellen und dann nur eine Implementierung davon zu haben. Es vermeidet auch die Menge an stinkendem IoC-Kabel, die Sie in den meisten Unternehmensanwendungen sehen, lässt aber dennoch einige Implementierungen bei Bedarf abschalten. http://programmers.stackexchange.com/questions/133471/writing-testable-code-vs-avoiding-speculative-generality –