Я использовал Единицу долгое время, но я всегда использовал ее с инжекцией конструктора. Чтобы сократить количество классов, которые я должен ввести в свои модели представления (поскольку мои команды полагаются на них), я думал, что попытаюсь создать понятие, которое использует Инжекцию Свойства, и таким образом аннулируйте требование для больших списков параметров конструктора. Вот сценарий...
Я создаю Модель Представления, которая имеет Команды, расположенные на свойствах, которые используют/обновляют Модель Представления промывания в некотором роде. Я хочу передать экземпляр Модели Представления в конструкторов Команд, расположенных на свойствах 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, но очевидно я неправ.
Какие-либо идеи?
Это 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");