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; }
}
Другие вопросы по тегам