2010-06-05 9 views
6

Ich habe Unity für eine ganze Weile verwendet, aber ich habe es immer mit Konstruktor Injektion verwendet. In dem Bemühen, die Anzahl der Klassen zu reduzieren, die ich in meine Ansichtsmodelle injizieren muss (da meine Befehle darauf angewiesen sind), dachte ich, ich würde versuchen, ein Konzept zu erstellen, das Property Injection verwendet und somit die Anforderung für die großen Konstruktorparameterlisten aufhebt. Hier ist das Szenario ...Property Injection mit Unity verursacht Stapelüberlauf

Ich erstelle ein View-Modell, das Befehle auf Eigenschaften, die das Hosing View Model in irgendeiner Weise verwenden/aktualisieren, hat. Ich möchte die Instanz des Ansichtsmodells an die Konstruktoren der Befehle übergeben, die sich in den Eigenschaften der Ansichtsmodelle befinden. Z.B.

public MainViewModel 
{ 
    public MainViewModel() 
    { 
     Customers = new ObservableCollection<CustomerViewModel>(); 
    }   

    [Depedency("LoadCommand")] 
    public ICommand LoadCustomersCommand { get; set; } 

    public ObservableCollection<CustomerViewModel> Customers { get; private set; } 
} 

public LoadCustomersCommand : ICommand 
{ 
    public LoadCustomersCommand(MainViewModel mainViewModel) 
    { 
     //Store view model for later use 
    } 

    //... implementation 
} 

//Setup code in App.Xaml 

IUnityContainer unityContainer = new UnityContainer(); 
unityContainer.RegisterType<ICommand, LoadCommand>("LoadCommand"); 
unityContainer.RegisterType<MainViewModel>(new ContainerControlledLifetimeManager()); 

Wenn ich die MainViewModel Klasse löse ich eine Ausnahme Stackoverflow (wenn Visual Studio überhaupt zurückkommt). Jetzt würde ich erwarten, dass Unity zuerst eine Instanz des MainViewModels erstellt, dann im Grunde ein Singleton, dann schaue auf die Instanz des View-Modells und erstelle die Command-Übergabe im neu erstellten MainViewModel, aber offensichtlich liege ich falsch.

Irgendwelche Ideen?

Antwort

9

Dies ist Circular References Fehler, und dies wie gesagt, das ist Entwickler Verantwortung, es zu vermeiden. Daher verweist MainViewModel auf LoadCustomersCommand, das auf MainViewModel -> StackOverflow verweist.

So ist die einzige Sie tun können, ist

public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     Customers = new ObservableCollection<CustomerViewModel>(); 
    }   

    //no dependency. 
    public ICommand LoadCustomersCommand { get; set; } 

    public ObservableCollection<CustomerViewModel> Customers { get; private set; } 
} 

und Sie müssen lösen werden folgende

var mainModel = unityContainer.Resolve<MainViewModel>(); 
mainModel.LoadCustomersCommand =  unityContainer.Resolve<ICommand>("LoadCommand"); 
+0

Danke für die Antwort und Ihre Verbindung zu tun. Ich dachte, das könnte der Fall sein, aber aufgrund der Property-Injektion dachte ich, das MainViewModel wäre zum Zeitpunkt der Instanziierung der Properties-Klasse im Container gewesen, und die 'zirkuläre' Referenz wäre kein Problem - aber offensichtlich nicht. Danke für die Reinigung! – Adam

Verwandte Themen