Mvvm - как получить ключ экземпляра в SimpleIoC
Я использую mvvm light SimpleIoC в проекте Xamarin и использую ключ экземпляра для получения некоторой модели представления.
SimpleIoc.Default.GetInstance<ContextViewModel>("contextIdentifier");
Есть ли способ получить этот ключ экземпляра в самом экземпляре, как и другие зависимости, в конструкторе ?
Я знаю, что могу создать и установить пользовательское свойство для моего ContextViewModel
, но поскольку моему классу нужно это значение для работы, мне не нравится идея, что я могу получить "нерабочий экземпляр" этой модели представления.
Отредактируйте с дополнительной информацией, чтобы объяснить, почему я хочу мой экземпляр ViewModel знает о своем идентификаторе:
Это Xamarin.приложение iOS (ViewController
создаются раскадровкой).
В моем приложении у меня есть несколько экземпляров одного и того же контроллера вида (и в одном и том же UITabBarController
), и поэтому мне нужен другой экземпляр ViewModel для каждого экземпляра контроллера вида.
Поскольку моему ViewModel нужен идентификатор, чтобы получить некоторые данные из базы данных,я подумал, что буду использовать этот идентификатор также в качестве идентификатора экземпляра.
Я могу заставить его работать, получив мой ViewModel экземпляр в методе ViewDidLoad () моего контроллера вида, и вызвать некоторые сеттеры на нем, но мне это не нравится (возможно, я ошибаюсь:)), потому что на мой взгляд, IoC должен возвращать только operationnal экземпляры (без необходимости вызова нескольких сеттеров).
С наилучшими пожеланиями.
2 ответа:
Я не думаю, что есть способ получить доступ к этому идентификатору в конструкторе. Этот идентификатор зарегистрирован внутренне в SimpleIOC. Я бы просто создал новый тип ViewModel и добавил к нему свойство InstanceID.
var viewModel = SimpleIoc.Default.GetInstance<MyViewModel>("contextIdentifier"); viewModel.ID = "contextIdentifier"; public class MyViewModel : ViewModelBase { public string ID { get; set; } }
Похоже, что невозможно получить идентификатор экземпляра изначально, поэтому для того, чтобы быть уверенным, что мой экземпляр полностью работоспособен, и избежать установщиков вызовов в моем ViewController, я, наконец, добавляю интерфейс к моей модели представления и устанавливаю идентификатор экземпляра непосредственно в моем ServiceLocator.
public interface IIdentifiableViewModel { /// <summary> /// Gets or sets the instance key. /// </summary> /// <value>The instance key.</value> string InstanceKey { get; set; } }
В ServiceLocator :
Не стесняйтесь отвечать, если у вас есть более элегантное или встроенное решение.public class ServiceLocator { /// <summary> /// Gets the view model instance by key and pass it to the InstanceKey property /// </summary> /// <returns>The view model by key.</returns> /// <param name="key">Key.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public T GetViewModelByKey<T>(string key) where T : IIdentifiableViewModel { var vm = ServiceLocator.Current.GetInstance<T>(key); ((IIdentifiableViewModel)vm).InstanceKey = key; return vm; }