Mvvm - Как получить ключ экземпляра в SimpleIoC
Я использую mvvm light SimpleIoC в проекте Xamarin и использую ключ экземпляра, чтобы получить некоторую модель представления.
SimpleIoc.Default.GetInstance<ContextViewModel>("contextIdentifier");
Есть ли способ получить этот ключ экземпляра в самом экземпляре, как и другие зависимости, в конструкторе?
Я знаю, что могу создать и установить собственное свойство на моем ContextViewModel
но так как моему классу нужно это значение для работы, мне не нравится идея, что я могу получить "неоперационный экземпляр" этой модели представления.
Измените с дополнительной информацией, чтобы объяснить, почему я хочу, чтобы мой экземпляр ViewModel знал об его идентификаторе:
Это приложение Xamarin.iOS (ViewController
созданы раскадровкой).
В моем приложении у меня есть несколько экземпляров одного и того же контроллера представления (и в том же UITabBarController
) и так, мне нужен отдельный экземпляр ViewModel для каждого экземпляра контроллера представления.
Поскольку моей ViewModel нужен идентификатор для получения данных из базы данных, я решил использовать этот идентификатор также в качестве идентификатора экземпляра.
Я могу заставить его работать, получая мой экземпляр ViewModel в методе ViewDidLoad() моего контроллера представления, и вызывая на нем несколько Setters, но мне это не нравится (возможно, я ошибаюсь:)), потому что, на мой взгляд, IoC должен возвращать только рабочие экземпляры (без необходимости вызова нескольких установщиков).
С наилучшими пожеланиями.
2 ответа
Кажется, что невозможно получить идентификатор экземпляра изначально, поэтому, чтобы быть уверенным, что мой экземпляр полностью операционален, и избегать установщиков вызовов в моем 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;
}
Не стесняйтесь отвечать, если у вас есть более элегантное или встроенное решение.
Я не думаю, что есть способ получить доступ к этому идентификатору в конструкторе. Этот идентификатор зарегистрирован внутри компании SimpleIOC. Я просто сделал бы новый тип ViewModel и добавил бы к нему свойство InstanceID.
var viewModel = SimpleIoc.Default.GetInstance<MyViewModel>("contextIdentifier");
viewModel.ID = "contextIdentifier";
public class MyViewModel : ViewModelBase
{
public string ID { get; set; }
}