2016-06-16 5 views
0

Ich lerne Prism 6.0.0 und habe ein Problem mit AutoWireViewModel Exception. Ich habe keine Ahnung, wie IRegionRepository injiziert wird, wenn ich keine Bindung an diese Schnittstelle habe.AutoWireViewModel Ausnahme

Additionaly ich Ninject und Entity Framework bin mit

Whole projest ist hier: https://github.com/PiotrKowalski93/PrismDemo

Ich lerne aus: https://www.youtube.com/watch?v=ZfBy2nfykqY, seinen Code funktioniert gut, aber er ist mit Prism 5.7.0

Ich möchte meine EmployeesView nach dem Drücken der Taste zeigen.

Mein Container in MainWindow.xaml

<ItemsControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" /> 

Ausnahme wird bei der Inbetriebnahme der Anwendung geworfen:

prism:ViewModelLocator.AutoWireViewModel="True" 

Mein Bootstraper.cs

public class Bootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return Container.Resolve<MainWindow>(); 
    } 

    protected override void InitializeShell() 
    { 
     Application.Current.MainWindow.Show(); 
    } 

    protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 

     Container.RegisterTypeForNavigation<EmployeesView>("Employee");    
    }   
} 

Mein App.xaml.cs Datei:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     Bootstrapper bs = new Bootstrapper(); 
     bs.Run(); 
    } 
} 

Mein MainWindowViewModel.cs

Vielen Dank für jede Hilfe!

+0

Wie sieht Ihr ViewModel-Konstruktor aus? Ich könnte mir vorstellen, dass die Abhängigkeiten des Konstruktors nicht automatisch aufgelöst werden können. – Gui

+1

Ich habe meine Frage bearbeitet. Ich habe es manuell gemacht, aber die Regionen sind leer – PiotrKowalski

+0

Werfen Sie einen Blick auf die innere Ausnahme; Du benutzt Unity, nicht Ninject (soweit ich das beurteilen kann). Microsoft.Practices.Unity.ResolutionFailedException: Auflösung der Abhängigkeit fehlgeschlagen ... Auflösung des Parameters "regionManager" – Gui

Antwort

0

Ok, so gelang es herauszufinden:

  1. Ich löschte Ninject und ich wurde mit nur Unity als mein Haupt-Container.
  2. Ich hatte Chaos in meinen Bitten. Ich löschte alle

    Microsoft.Practices.Prism

    Microsoft.Practices.Prism.MVVM

DLL.

3.I neu Prism-Paket installiert, wahrscheinlich mein Prism.WPF und Prism.Unity war auf Version 6.x.x aber mein Prism-Paket war auf 5.x.x.

Überall musste ich meine Schnittstelle zu Klassen-Mapping-Form Ninject-Modul zu Container-Konfiguration in Unity-Modul verschieben.

+0

Ja, das ist, was ich in meinem Bearbeiten schrieb :-) Sie hatten eine andere IRegionManager-Schnittstelle als die Abhängigkeit des Ansichtsmodells als im Bootstrapper registriert wurde. – Haukinger

0

Sie sollten Ihre Dienste beim Unity-Container Ihres Bootstrappers registrieren, nicht bei einem Ninject-Kernel, der niemals für die Auflösung verwendet wird. Einheit nicht weiß, dass IHrService-HrService aufgelöst werden soll ... versuchen

Container.RegisterType<IHrService, HrService>(); 

auf Ihr Bootstrap-Programm der hinzufügen.

EDIT: Außerdem müssen Sie die richtige IRegionManager zu lösen, das heißt Prism.Regions.IRegionManager von Prism 6. Ihre Lösung eine Menge Verweise auf ältere Prism-Komponenten enthält, und Ihre usings sind Sachen von denen (wie Microsoft.Practices.Prism.Regions.IRegionManager ...)

+0

Ok, so Das Problem ist, dass ich Unity For Prism verwende, um VIew/VIewModels aufzulösen. Zusätzlich habe ich Ninject um Abhängigkeiten für meine View.Models wie Services zu injizieren. Fehler wird von ViewModelLocator ausgelöst. Es kann IRegionManager auflösen, der in MainWindowViewModel ist. Ich habe es nicht registriert, aber auf dem Tutorial, das ich gab es funktioniert. Irgendwie ist es autorisiert. Überprüfen Sie es hier: https://github.com/brianlagunas/InfragisticsWebinarSimpleMVVMPrism/tree/master/PrismDemo – PiotrKowalski

+0

Es registriert den Regionsmanager in 'UnityBootstrapper.ConfigureContainer', und Sie rufen das, so sollte es in Ordnung sein. – Haukinger

1

Wenn Sie die supported IoC containers für Prism WPF betrachten, sehen Sie, dass wir Unterstützung für Ninject haben. Damit dies funktioniert, müssen Sie das Prism.Ninject-Paket anstelle von Prism.Unity verwenden.

Packages

Der nächste logische Schritt ersetzt die UnityBootstrapper Basisklasse von der Klasse NinjectBootstrapper. Ich bin mit Ninject nicht vertraut, also bin ich mir nicht sicher, ob Sie alle Typen registrieren müssen oder ob Ninject eine Möglichkeit bietet, nicht registrierte Typen automatisch aufzulösen.

Eine andere Lösung besteht darin, Ihr Ninject durch Unity zu ersetzen, um näher am Sample zu sein, aber das ist nicht Teil der Frage :). Es gibt offizielle Unterstützung für Ninject, also hält dich nichts davon ab, deinen vertrauten IoC-Container zu finden.

Zusätzliche Anmerkung: Der Grund, warum einige Dinge funktionieren und andere nicht, ist, weil einige IoC-Container (wie Unity) Instanzen von konkreten Typen ohne Konfiguration auflösen können, während andere (wie Autofac) dies mit einigen zusätzlichen Konfiguration zulassen (AnyConcreteTypeNotAlreadyRegisteredSource im Fall von Autofac).

+0

Danke, aber das war nicht sehr hilfreich. Die Frage ist, warum es nicht funktioniert. Unity sollte meinen IRegionManager wie in Beispiel (Version 5.x) automatisch freigeben. – PiotrKowalski

+0

Aber danke für Informationen :) – PiotrKowalski