2015-12-25 3 views
4

Мне нужно передать объект из одной модели представления в другую. В моей текущей реализации я создал статический экземпляр ProductVM, после этого example, а затем получил доступ к его свойству из экземпляра. Но передача статического экземпляра в долгосрочной перспективе не кажется сплошной.Как передать объект в ViewModel с использованием инъекции зависимостей?

private static ProductVM _instance = new ProductVM(); 
public static ProductVMInstance { get { return _instance; } } 

При исследовании альтернатив обеспечения статического экземпляра вида модели, я наткнулся, constructor injection в качестве опции.

Вопрос:

Кто-нибудь есть пример, о том, как осуществить инъекцию CTOR для прохождения объектов? (Желательно не использовать рамки третьей стороны)

ProductsVM: (вид модели, которая имеет свойство быть отправлена)

public ProductModel SelectedProduct { get; set; } 

CustomerOrdersVM: (вид модели, которая нуждается в SelectedProduct быть передана в)

public class CustomerOrdersViewModel : IPageViewModel 
{ 

    public CustomerOrdersViewModel() 
    {     

    } 
} 
+1

Какого контейнера IoC вы используете? Это важно для ответа, так как каждый контейнер IoC (DI) имеет свой собственный API – Tseng

+0

@Tseng Я использую ApplicationVM для регистрации каждой виртуальной машины. Не использовать какой-либо контейнер IoC в частности. http://hastebin.com/osopigozoc.avrasm –

ответ

1

Принятый ответ в представленном вами example link фактически описывает впрыск конструктора. Оба ответа 1 и 2 технически описывают «инъекцию конструктора». Чтобы реализовать инсталляцию конструктора без сторонней структуры для вашего случая, вам по существу нужно либо передать экземпляр SelectedProduct, либо экземпляр ProductVM в конструктор CustomerOrdersVM. Единственное, что осталось - это всеобъемлющий класс или viewmodel, который служит в качестве «инжектора», который управляет построением экземпляра CustomerOrdersVM и экземпляром ProductVM (или, по крайней мере, имеет ссылку на экземпляр, который он может передать на ctoror CustomerOrdersVM):

public class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 
     ProductsViewModel = new ProductsVM(); 
     OrdersViewModel = new CustomerOrdersVM(ProductsViewModel); 
    } 
    public CustomerOrdersVM OrdersViewModel { get; private set; } 

    public ProductsVM ProductsViewModel { get; private set; } 
} 

Я работал над проектом MVVM (главным образом), который использовал инжектор конструктора без встроенного инжектора третьей стороны. Это имело смысл, потому что у нас был всеобъемлющий объект (он служил в качестве основной родительской модели просмотра и инжектора, технически), в которой в качестве своих свойств были использованы несколько viewmodels. Тем не менее, он в конечном итоге стал несколько громоздким, потому что некоторые модели просмотра потребовали бы, казалось бы, случайной другой модели просмотра в своем конструкторе. В зависимости от того, насколько четко разделены ваши модели представлений из ваших моделей или баз данных/внешних служб, модульное тестирование моделей просмотра также может стать более сложным, потому что вы можете начать использовать логику в своей модели просмотра, которая требует полной зависимости от данных производства.

Это заставляет меня спросить вас ... зачем вам выбранный продукт в CustomerOrderVM? Это связано с тем, что пользовательское взаимодействие установит свойство SelectedProduct в ProductsVM, и ваш CustomerOrdersVM должен будет знать об этом? Если это так, подумали ли вы о внедрении EventAggregator Pattern? Когда кто-то из моей команды выполнил это, он сделал передачу информации между режимами просмотра полным бризом. В моделях просмотра будет ссылка на eventaggregator и подписаться на события при построении. Таким образом, когда ваш пользователь выбирает продукт, ваш ProductVM может принять меры и опубликовать событие, на которое ваш CustomerOrdersVM может подписаться и принять меры.

+0

Event Aggregator не подходит для всех случаев, особенно для навигации. Но ОП недостаточно определил вариант использования – Tseng

+0

@Ценг выберет продукт из ProductVM и установит количество. Затем этот SelectedProduct необходимо передать в CustomerOrdersVM, чтобы его можно было добавить в SelectedOrder. Btw Я использую AppVM для регистрации каждого vm, поэтому я просто передал CustomerOrdersVM в ProductVM и получил доступ к SelectedProduct через объект. Я думаю о рефакторинге к шаблону EventAggregator, хотя он кажется полезным. –

1

Rowbear закрыл корпус EventAggregators. Они не могут использоваться во всех ситуациях.

Шаблон EventAggregator полезен только в том случае, если целевой объект ViewModel (и соответствующий ему вид) уже создан, потому что только тогда ViewModel будет зарегистрирован для события, на которое будет реагировать.

Это не подходит для случаев, когда ViewModel/View должен быть создан или перемещен, прежде чем его можно будет отобразить. Одним из примеров является приложение для смартфонов, в котором вы нажимаете на продукт и получаете его детали или что-то в этом роде.

В этом случае вам нужен навигационный сервис, где вы можете пройти определенный параметр (productId, orderId и т.д.) для навигации вызова, как navigationService.Navigate("OrderDetails", orderId); и ваше ViewModels реализовать какое-то INavigationAware интерфейса, который называется в соответствии с Вашим навигационной службы, если ViewModel реализует этот интерфейс.

public class OrderDetailsViewModel : ViewModelBase, INavigationAware 
{ 
    public async void OnNavigatedFrom(object parameter) 
    { 
     var orderId = (int)parameter; 
     var order = await orderRepository.GetOrderByIdAsync(orderId); 

     // display your order in the ViewModel here 
    } 
} 

Есть много рамок, которые приходят со службой навигации, наиболее популярной для корпоративных приложений является основой Prism MVVM (изначально разработанной Microsoft)

+0

в этом случае, CustomerOrdersVM будет зарегистрирован до открытия ProductView. Поэтому я думаю, что EventAggregator может стать для вас способом. У меня нет службы навигации как таковой, я использую список виртуальных машин для навигации, как показано в ссылке на ваш предыдущий комментарий. –

Смежные вопросы