Strona główna > Przykłady > [C#] Konfiguracja Unity i XamlParseException

[C#] Konfiguracja Unity i XamlParseException

Niedawno pierwszy raz użyłem microsoftowego kontenera Unity do wstrzykiwania zależności w mojej aplikacji WPF opartej o wzorzec MVVM.  Zagadnienie dependency injection przystępnie przybliżył mi cykl artykułów na xoft.pl , a samo Unity zostało bardzo zrozumiale opisane na mtaulty.com . Bez  problemów napisałem kod, który w codebehind widoku tworzy kontener, rejestruje potrzebne implementacje interfejsów używanych w ViewModelu i ustawia DataContext na uzyskany z kontenera obiekt ViewModel.

IUnityContainer uc = new UnityContainer();
uc.RegisterType(typeof(IMojTyp1), typeof(MojTyp1));
uc.RegisterType(typeof(IMojTyp2), typeof(MojTyp2));
uc.RegisterType(typeof(IMojTyp3), typeof(MojTyp3));
uc.RegisterType(typeof(IMojTyp4), typeof(MojTyp4));
this.DataContext = uc.Resolve<MainViewModel>();

Następnie postanowiłem przenieść rejestrację typów do pliku konfiguracyjnego App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <container>
      <register type="MojNamespace.IMojTyp1, MojAssembly"
                mapTo="MojNamespace.MojTyp1, MojAssembly"/>
      <register type="MojNamespace.IMojTyp2, MojAssembly"
            mapTo="MojNamespace.MojTyp2, MojAssembly"/>
      <register type="MojNamespace.IMojTyp3, MojAssembly"
            mapTo="MojNamespace.MojTyp3, MojAssembly"/>
      <register type="MojNamespace.IMojTyp4, MojAssembly"
            mapTo="MojNamespace.MojTyp4, MojAssembly"/>
    </container>
  </unity>
</configuration>

Teoretycznie wiedziałem jak to zrobić , ale praktyka okazała się jak zwykle bezlitosna: zażądała ofiary z czasu i ukorzenia się przed bezwzględnymi Exceptionami. Nie chciałem się poddać.  Zaatakowany przez drapieżne wyjątki użyłem najbardziej śmiercionośnej broni w całym IT, czyli google.

Na największą uwagę zasłużył XamlParseException.

Komunikat nie mówił mi nic, oprócz tego (czego nie było trudno się domyśleć), że był powiązany z właśnie wstawioną linijką kodu.

uc.LoadConfiguration();

Na szczęście na stackoverflow przeczytałem jak dowiedzieć się czegoś więcej o wyjątku. Wstawiłem do klasy App dwie metody.

///<summary> 
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        // hook on error before app really starts
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        base.OnStartup(e);
    }

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        // put your tracing or logging code here (I put a message box as an example)
        MessageBox.Show(e.ExceptionObject.ToString());
    }
}

Dlaczego mój program odmawiał posłuszeństwa?

Zdecydowanie zbyt długo trwało zanim do tego doszedłem. Okazało się że nazwa zestawu (assembly name), którą podawałem w pliku konfiguracyjnym, nie była nazwą zestawu tylko nazwą projektu. Domyślnie po utworzeniu nowej solucji obie nazwy są takie same, ale ja zmieniałem nazwę projektu i nie zmieniłem nazwy zestawu.

Advertisements
Kategorie:Przykłady Tagi: , , , ,
  1. Anonimowy
    7 września 2012 o 3:49 pm

    bezużyteczne informacje

    • 9 listopada 2012 o 9:35 pm

      z perspektywy czasu, trudno się nie zgodzić – rzeczywiście bezużyteczne 🙂

  1. No trackbacks yet.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: