2010-06-05 67 views
6

我一直在使用Unity很長一段時間,但我一直使用它與構造函數注入。爲了減少我必須注入到視圖模型中的類的數量(因爲我的命令依賴於它們),我想我會嘗試創建一個使用屬性注入的概念,從而消除對大型構造函數參數列表的需求。這是場景...Unity的屬性注入導致堆棧溢出

我正在創建一個視圖模型,它具有位於以某種方式使用/更新軟管視圖模型的屬性上的命令。我希望將View Model的實例傳遞給位於View Models屬性中的Commands的構造函數。例如。

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()); 

當我解決MainViewModel類時,我得到一個StackOverflow異常(如果Visual Studio回來的話)。現在我期望Unity首先創建一個MainViewModel的實例,然後它基本上是一個單例,然後查看View Model的實例並創建傳遞給新創建的MainViewModel的Command,但顯然我錯了。

任何想法?

回答

9

這是Circular References錯誤,正如它所說的,這是開發者的責任,以避免它。因此,MainViewModel引用LoadCustomersCommand,它是對MainViewModel - > StackOverflow的引用。

所以唯一可以做的是

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

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

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

,並解決你需要做以下

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

感謝您的回答和你的鏈接。我認爲可能是這種情況,但由於屬性注入,我認爲在實例化屬性類時,MainViewModel應該在容器中,「循環」引用不會成爲問題 - 但顯然不是問題。感謝您的清理! – Adam 2010-06-07 10:46:03