2010-06-05 36 views
6

Tôi đã sử dụng Unity trong một thời gian khá lâu nhưng tôi đã luôn sử dụng nó với công cụ xây dựng. Trong một nỗ lực để giảm số lượng các lớp tôi phải tiêm vào các mô hình khung nhìn của mình (như các lệnh dựa vào chúng) Tôi nghĩ tôi sẽ thử tạo một khái niệm sử dụng Property Injection và do đó quash yêu cầu cho các danh sách tham số constructor lớn. Đây là kịch bản ...Tiêm tài sản với Unity gây tràn ngăn xếp

Tôi đang tạo Mô hình xem có Lệnh nằm trên thuộc tính sử dụng/cập nhật Mô hình xem hosing theo một cách nào đó. Tôi muốn chuyển thể hiện của View Model vào các hàm tạo của các lệnh nằm trên các thuộc tính View Models. Ví dụ.

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

Khi tôi giải quyết lớp MainViewModel, tôi nhận được ngoại lệ StackOverflow (nếu Visual Studio trở lại). Bây giờ tôi mong đợi Unity sẽ tạo ra một thể hiện của MainViewModel đầu tiên sau đó vì nó về cơ bản là một singleton, sau đó nhìn vào thể hiện của View Model và tạo Command truyền vào trong MainViewModel vừa mới tạo, nhưng rõ ràng là tôi đã sai.

Bất kỳ ý tưởng nào?

Trả lời

9

Đây là lỗi Circular References và điều này như đã nói, đây là trách nhiệm của nhà phát triển để tránh điều đó. Vì vậy, tham chiếu MainViewModel để LoadCustomersCommand đó là refferences để MainViewModel -> StackOverflow.

Vì vậy, duy nhất bạn có thể làm là

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

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

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

và để giải quyết bạn sẽ cần phải làm như sau

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

Cảm ơn cho câu trả lời và liên kết của bạn. Tôi nghĩ rằng có thể là trường hợp nhưng do tiêm tài sản Tôi nghĩ rằng MainViewModel sẽ có được trong container tại thời điểm lớp tài sản được khởi tạo và tham chiếu 'tròn' sẽ không phải là một vấn đề - nhưng rõ ràng là không. Cảm ơn bạn đã dọn dẹp! – Adam

Các vấn đề liên quan