2013-08-29 4 views
8

Mam aplikację MVC4, która używa Unity do rozwiązywania zależności. Jedną z rzeczy, które mamy, jest dekorator rejestrów dla kontenera Unity - wyłącznie w celu rejestrowania, gdy jakakolwiek zależność nie powiedzie się.Błędy rejestracji jednostek na typach, których nie rozwiązuję.

Zauważyłem, że istnieje znaczna liczba typów, które nie potrafią rozwiązać problemu, że moja aplikacja nie jest jawnie rozstrzygająca. Te typy to:

IControllerFactory 
IControllerActivator 
IViewPageActivator 
ModelMetadataProvider 
ITempDataProvider 
IActionInvoker 
IAsyncActionInvoker 

wyjątki rzucane są tak:

Typ ITempDataProvider nie ma dostępnego konstruktora.

... z własnym rodzajem.

Te wyjątki występują tylko podczas uruchamiania aplikacji, a na razie rejestrujemy je i kontynuujemy. Dzięki temu aplikacja działa dobrze nawet po wystąpieniu błędów.

Nienawidzę połknąć błędy bez ważnego powodu, i bez zrozumienia, co jest próbą rozwiązania tych problemów, nie mam żadnego powodu.

Pytania:

1) Czy ktoś wie, kto/co stara się rozwiązać te? To nie jest nigdzie w mojej bazie kodu. 2) Jeśli gdzieś w ramach tego próbują być rozwiązane, czy oczekuje się, że moja aplikacja zapewni rozwiązanie w jedności? 3) Czy jest to po prostu oczekiwane zachowanie i powinienem przełknąć te wyjątki?

Rozumiem, że nie jest to wiele do zrobienia, ale mam nadzieję, że ktoś inny widział tego rodzaju błędy i będzie mógł wskazać mi właściwy kierunek.

Odpowiedz

7

Masz podłączono Unity jako DependencyResolver w MVC, zgadza się? Wszystkie typy, które widzisz, są używane wewnętrznie przez samą ramkę MVC, a to właśnie ona (MVC) stara się je rozwiązać.

Kod MVC pod maską rejestruje błąd, jeśli coś nie zostanie rozwiązane i wróci do standardowej implementacji. Robi się to w ten sposób, że istnieje jednolity sposób dołączania niestandardowych implementacji tych rzeczy, jeśli ich potrzebujesz.

Nie powinieneś robić nic z tymi wyjątkami - po prostu pozwól im wypłynąć z powrotem do rozmówcy, a MVC zrobi to, co trzeba.

+0

Zaakceptowałem to jako odpowiedź, ponieważ twoje wyjaśnienie, że to oczekiwane zachowanie było dokładnie tym, czego szukałem. Dziękuję, doceniam to. – Silas

+0

Myślę, że ta odpowiedź nie jest dokładna. Właściwie musisz złapać ten wyjątek i zwrócić null – Illidan

+0

Głosowałem za tą odpowiedzią; jednak pracuję w środowisku korporacyjnym. Czy istnieje jakaś dokumentacja, na którą możesz zwrócić uwagę, aby wesprzeć odpowiedź? – Thomas

2

Jeśli rozwiążesz klasę poprzez Unity, która nie ma konstruktora bez parametrów, Unity rekurencyjnie spróbuje rozwiązać typy parametrów jednego z konstruktorów, chyba że wyraźnie powiesz, że nie ... Jeśli to się nie powiedzie, Otrzymuj błędy, takie jak te, które widzisz dla typów, które nie zostały bezpośrednio rozwiązane. Więc jest prawdopodobne, że jesteś rozwiązywaniu swojej klasy, który ma konstruktora, że ​​trwa klasy MVC, która sama ma parametry konstruktora takich jak ModelMetaDataProvider itd

Przykład określania konstruktora:

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

To bardzo ciekawa myśl - taka, którą muszę zbadać. Nie wierzę, że tak jest - jednak przy tak dużej konfiguracji jedności, jaką mamy w tym kodzie, z pewnością znajduje się ona w zakresie możliwości. Wrócę z tobą, chociaż może to zająć trochę czasu, zanim przejrzę mój kod. – Silas

+1

W innej notatce powiedziałeś: "Jedność rekurencyjnie spróbuje rozwiązać typy parametrów jednego z konstruktorów, chyba że wyraźnie powiesz, żeby nie ..." - jak można powiedzieć jedności, aby tego nie robić? – Silas

+1

Podaj konstruktor do użycia i wartości do wprowadzenia w konfiguracji Unity. Zaktualizowałem moją odpowiedź. – Haney

Powiązane problemy