Ich habe eine MVC4-Anwendung, die Unity zur Abhängigkeitsauflösung verwendet. Eines der Dinge, die wir haben, ist ein Logger-Decorator für den Unity-Container - zu dem einzigen Zweck der Protokollierung, wenn eine Abhängigkeitsauflösung fehlschlägt.
Ich stelle fest, dass es eine erhebliche Anzahl von Typen gibt, die nicht aufgelöst werden können und die meine App NICHT explizit löst. Diese Typen sind:
%Vor%Die ausgelösten Ausnahmen sind alle wie folgt:
Der Typ ITempDataProvider
hat keinen barrierefreien Konstruktor.
... mit einem eigenen Typ.
Diese Ausnahmen treten nur beim Start der Anwendung auf, und im Moment protokollieren wir sie und fahren fort. Somit läuft die Anwendung auch nach dem Auftreten der Fehler einwandfrei.
Ich hasse es, Fehler ohne guten Grund zu schlucken, und ohne zu verstehen, was versucht, diese zu lösen, habe ich keinen guten Grund.
Fragen:
1) Weiß jemand, wer versucht, diese zu lösen? Es ist nirgendwo in meiner Codebasis. 2) Wenn irgendwo im Framework versucht wird, gelöst zu werden, wird erwartet, dass meine App für diese eine Auflösung in Unity bereitstellt? 3) Oder ist das nur erwartetes Verhalten, und ich sollte diese Ausnahmen verschlucken?
Ich verstehe, dass dies nicht viel ist, aber ich hoffe, dass jemand anderes diese Art von Fehlern gesehen hat und mir in die richtige Richtung zeigen kann.
Sie haben Unity als DependencyResolver in MVC angeschlossen, richtig? Alle diese Typen, die Sie sehen, werden intern vom MVC-Framework selbst verwendet, und es wird versucht, sie zu lösen.
Der MVC-Code unter der Haube fängt den Fehler auf, wenn etwas nicht auflöst und auf die Standardimplementierung zurückfällt. Es ist so gemacht, dass es eine einheitliche Möglichkeit gibt, benutzerdefinierte Implementierungen dieser Dinge zu verwenden, wenn Sie sie wollen.
Sie sollten nichts mit diesen Ausnahmen machen müssen - lassen Sie sie einfach zum Anrufer zurückfließen, und MVC wird das Richtige tun.
Wenn Sie eine Klasse über Unity auflösen, die keinen parameterlosen Konstruktor hat, versucht Unity rekursiv, die Parametertypen für einen der Konstruktoren aufzulösen, es sei denn, Sie sagen es explizit nicht ... Wenn das fehlschlägt, erhalten Sie Fehler wie die, die Sie für Typen sehen, die Sie möglicherweise nicht direkt gelöst haben. Es ist also wahrscheinlich, dass Sie IHRE Klasse auflösen, die einen Konstruktor hat, der eine MVC-Klasse übernimmt, die selbst Konstruktorparameter wie ModelMetaDataProvider
usw. hat.
Beispiel für die Angabe von Konstruktor:
%Vor%Tags und Links c# asp.net-mvc-4 unity-container