2010-06-05 16 views
6

Bir süredir Unity kullanıyorum ama her zaman kurucu enjeksiyon ile kullandım. Benim görüş modellerime enjekte etmem gereken sınıfların sayısını azaltma çabamda (benim emirlerim onlara güveniyor), Mülkiyet Enjeksiyonunu kullanan bir konsept oluşturmayı deneyeceğim ve böylece büyük yapıcı parametre listelerinin gereksinimini ortadan kaldıracağımı düşündüm. İşte bu senaryo ...Nesne enjeksiyonu Birlik yığın yığılmasına neden

Bazı yollarla hosing View Model özelliğini kullanan/güncelleyen özelliklerde bulunan Komutları olan bir Görünüm Modeli oluşturuyorum. Görünüm Modelinin örneğini Görünüm Modelleri özelliklerinde bulunan Komutların yapıcılarına iletmek istiyorum. Örneğin.

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

I (Visual Studio hiç geri gelirse) Bir StackOverflow istisna olsun MainViewModel sınıfını çözmek

. Şimdi Unity'nin MainviewModel'in bir örneğini oluşturmasını beklerim, daha sonra temelde bir tekil olduğu gibi, sonra da Görünüm Modelinin örneğine bakın ve yeni oluşturulan MainViewModel'de geçen Komutu yaratın, ama açıkçası yanılıyordum.

Herhangi bir fikrin var mı?

cevap

9

Bu, Circular References hatasıdır ve bunun söylendiği gibi, bunu önlemek için geliştiricinin sorumluluğu söz konusudur. Bu yüzden MainViewModel, LoadCustomersCommand referanslarını MainViewModel -> StackOverflow'a yönlendirmektedir.

Yapabileceğiniz Yani sadece

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

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

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

ise ve cevap ve bağlantı için aşağıdaki

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

Teşekkür yapmanız gerekir çözmek için. Durumun böyle olabileceğini düşündüm ama mülkiyet enjeksiyonu nedeniyle, MainViewModel'in özellik sınıfının örneklendiği anda kapsayıcıda olacağını ve 'dairesel' referansın bir sorun olmayacağını düşündüm - ama açıkça değil. Bunu temizlediğiniz için teşekkürler! – Adam

İlgili konular