Pertanyaan Injeksi properti dengan Unity menyebabkan tumpukan overflow


Saya telah menggunakan Unity cukup lama tetapi saya selalu menggunakannya dengan injeksi konstruktor. Dalam upaya untuk mengurangi jumlah kelas saya harus menyuntikkan ke dalam model pandangan saya (karena perintah saya bergantung pada mereka) saya pikir saya akan mencoba membuat konsep yang menggunakan Injeksi Properti dan dengan demikian membatalkan persyaratan untuk daftar parameter konstruktor besar. Ini skenarionya ...

Saya membuat Model Tampilan yang memiliki Perintah yang terletak pada properti yang menggunakan / memperbarui Model Tampilan Selang dalam beberapa cara. Saya ingin menyampaikan contoh Model Tampilan ke dalam konstruktor dari Perintah yang terletak pada properti Lihat Model. Misalnya.

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

Ketika saya menyelesaikan kelas MainViewModel saya mendapatkan pengecualian StackOverflow (jika Visual Studio kembali sama sekali). Sekarang saya akan mengharapkan Unity untuk menciptakan sebuah instance dari MainViewModel pertama kemudian karena pada dasarnya adalah tunggal, kemudian melihat contoh dari Model Tampilan dan membuat Command lewat di MainViewModel yang baru dibuat, tetapi jelas saya salah.

Ada ide?


6
2018-06-05 21:53


asal


Jawaban:


Ini adalah Referensi Edaran kesalahan, dan ini seperti yang dikatakannya, ini adalah tanggung jawab pengembang untuk menghindarinya. Jadi referensi MainViewModel ke LoadCustomersCommand yang merupakan referensi untuk MainViewModel -> StackOverflow.

Jadi, satu-satunya yang bisa Anda lakukan adalah

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

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

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

dan untuk menyelesaikannya Anda harus melakukan hal-hal berikut

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

9
2018-06-06 09:15