2013-08-29 5 views
8

Ich habe eine MVC4-Anwendung, die Unity für die Abhängigkeitsauflösung verwendet. Eines der Dinge, die wir haben, ist ein Logger-Decorator für den Unity-Container - für den einzigen Zweck der Protokollierung, wenn eine Abhängigkeitsauflösung fehlschlägt.Unity-Registrierungsfehler bei Typen, die ich nicht auflösen kann

Ich finde, dass es eine beträchtliche Anzahl von Arten, die lösen scheitern, dass meine App Lösung nicht explizit. Diese Typen sind:

IControllerFactory 
IControllerActivator 
IViewPageActivator 
ModelMetadataProvider 
ITempDataProvider 
IActionInvoker 
IAsyncActionInvoker 

Die Ausnahmen geworfen sind wie folgt aus:

Der Typ ITempDataProvider keinen zugänglich Konstruktor haben.

... mit einem eigenen Typ.

Diese Ausnahmen treten nur beim Start der Anwendung auf, und jetzt protokollieren wir sie und fahren fort. Somit läuft die Anwendung auch nach dem Auftreten der Fehler einwandfrei.

Ich hasse Schluck Fehler ohne guten Grund, und ohne zu verstehen, was diese in erster Linie zu lösen versucht, ich habe keinen guten Grund.

Fragen:

1) Wer weiß, wer/was diese zu lösen versucht? Es ist nirgendwo in meiner Codebasis. 2) Wenn irgendwo im Framework versucht wird, gelöst zu werden, wird erwartet, dass meine App in Unity eine Lösung für diese bereitstellen wird? 3) Oder ist das nur erwartetes Verhalten, und ich sollte diese Ausnahmen schlucken?

Ich verstehe, dass dies nicht viel zu tun ist, aber ich hoffe, dass jemand anderes diese Art von Fehlern gesehen hat und mir in die richtige Richtung zeigen kann.

Antwort

7

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 (MVC).

Der MVC-Code unter der Haube fängt den Fehler auf, wenn sich 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.

+0

Ich akzeptierte dies als Antwort, da Ihre Klarstellung, dass dies erwartetes Verhalten ist, genau das war, wonach ich suchte. Danke, ich weiß das zu schätzen. – Silas

+0

Ich denke, diese Antwort ist nicht korrekt. Eigentlich müssen Sie diese Ausnahme abfangen und null zurückgeben – Illidan

+0

Ich habe diese Antwort gewählt; Ich arbeite jedoch in einer Unternehmensumgebung. Gibt es Unterlagen, auf die Sie mich hinweisen können, um die Antwort zu unterstützen? – Thomas

2

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 ausdrücklich nicht ... Wenn das fehlschlägt Erhalte Fehler wie die, die du siehst, für Typen, die du vielleicht nicht direkt gelöst hast. So ist es wahrscheinlich, dass Sie Ihre Klasse sind die Lösung, die einen Konstruktor hat, der eine MVC-Klasse nimmt, die sich Konstruktor Parameter wie ModelMetaDataProvider hat usw.

Beispiel zum Festlegen Konstruktor:

<register type="IMyThing" mapTo="MyThing"> 
    <constructor> 
    <param name="x" type="MyType1" />   
    <param name="y" type="MyType2" /> 
    </constructor> 
</register> 
+0

Das ist ein sehr interessanter Gedanke - einen, den ich untersuchen muss. Ich glaube nicht, dass dies der Fall ist - aber mit so viel Einheitskonfiguration, wie wir es in diesem Kodex haben, ist es sicherlich gut im Bereich der Möglichkeiten. Ich werde mit dir zurückkommen, auch wenn es einige Zeit dauern könnte, bis ich meinen Code durchgekämmt habe. – Silas

+1

Anders gesagt, Sie haben gesagt: "Unity versucht rekursiv, die Parametertypen für einen der Konstruktoren aufzulösen, es sei denn, Sie sagen es ausdrücklich nicht zu ..." - Wie sagt man EINHEIT NICHT, dies zu tun? – Silas

+1

Geben Sie den zu verwendenden Konstruktor und die Werte an, die in die Unity-Konfiguration injiziert werden sollen. Meine Antwort wurde aktualisiert. – Haney

Verwandte Themen