Mvvm - как получить ключ экземпляра в SimpleIoC


Я использую mvvm light SimpleIoC в проекте Xamarin и использую ключ экземпляра для получения некоторой модели представления.

SimpleIoc.Default.GetInstance<ContextViewModel>("contextIdentifier");

Есть ли способ получить этот ключ экземпляра в самом экземпляре, как и другие зависимости, в конструкторе ?

Я знаю, что могу создать и установить пользовательское свойство для моего ContextViewModel, но поскольку моему классу нужно это значение для работы, мне не нравится идея, что я могу получить "нерабочий экземпляр" этой модели представления.

Отредактируйте с дополнительной информацией, чтобы объяснить, почему я хочу мой экземпляр ViewModel знает о своем идентификаторе:

Это Xamarin.приложение iOS (ViewController создаются раскадровкой).

В моем приложении у меня есть несколько экземпляров одного и того же контроллера вида (и в одном и том же UITabBarController), и поэтому мне нужен другой экземпляр ViewModel для каждого экземпляра контроллера вида.

Поскольку моему ViewModel нужен идентификатор, чтобы получить некоторые данные из базы данных,я подумал, что буду использовать этот идентификатор также в качестве идентификатора экземпляра.

Я могу заставить его работать, получив мой ViewModel экземпляр в методе ViewDidLoad () моего контроллера вида, и вызвать некоторые сеттеры на нем, но мне это не нравится (возможно, я ошибаюсь:)), потому что на мой взгляд, IoC должен возвращать только operationnal экземпляры (без необходимости вызова нескольких сеттеров).

С наилучшими пожеланиями.

2 4

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;
    }
Не стесняйтесь отвечать, если у вас есть более элегантное или встроенное решение.