Инжекция свойства с Единицей, вызывающей переполнение стека

Я использовал Единицу долгое время, но я всегда использовал ее с инжекцией конструктора. Чтобы сократить количество классов, которые я должен ввести в свои модели представления (поскольку мои команды полагаются на них), я думал, что попытаюсь создать понятие, которое использует Инжекцию Свойства, и таким образом аннулируйте требование для больших списков параметров конструктора. Вот сценарий...

Я создаю Модель Представления, которая имеет Команды, расположенные на свойствах, которые используют/обновляют Модель Представления промывания в некотором роде. Я хочу передать экземпляр Модели Представления в конструкторов Команд, расположенных на свойствах View Models. Например.

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 возвращается вообще). Теперь я ожидал бы, что Единица создаст экземпляр MainViewModel сначала затем, поскольку это - в основном одиночный элемент, затем посмотрите по просьбе Модели Представления и создайте передачу Команды в недавно созданном MainViewModel, но очевидно я неправ.

Какие-либо идеи?

6
задан M4N 6 September 2010 в 21:56
поделиться

1 ответ

Это 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");
9
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: