2017-08-23 1 views
4

J'utilise mvvm light SimpleIoC dans un projet Xamarin et utilise une clé d'instance pour obtenir un modèle de vue.Mvvm - Comment obtenir la clé d'instance dans SimpleIoC

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

Y at-il un moyen d'obtenir cette clé d'instance dans l'instance lui-même comme d'autres dépendances, dans le constructeur?

Je sais que je peux créer et définir une propriété personnalisée sur mon ContextViewModel mais comme ma classe a besoin de cette valeur pour fonctionner, je n'aime pas l'idée que je puisse obtenir une "instance non-opérationnelle" de ce modèle.

Modifier avec plus d'informations, pour expliquer pourquoi je veux que mon exemple ViewModel connaître son identifiant:

C'est une application Xamarin.iOS (ViewController sont créés par story-board).

Dans mon application, j'ai plusieurs instances du même contrôleur de vue (et dans le même UITabBarController), et ainsi, j'ai besoin d'une instance ViewModel différente pour chaque instance de contrôleur de vue. Comme mon ViewModel a besoin d'un identifiant pour obtenir des données de la base de données, j'ai pensé que j'utiliserais cet identifiant aussi comme identifiant d'instance.

Je peux le faire fonctionner en obtenant mon instance ViewModel dans la méthode ViewDidLoad() de mon contrôleur de vue, et appeler certains Setters, mais je n'aime pas ça (peut-être que je me trompe :)) parce que dans Dans mon esprit, un IoC ne devrait renvoyer que des instances opérationnelles (sans avoir besoin de plusieurs setters).

Cordialement.

+1

Je ne comprends pas ce que vous essayez de faire. Pourquoi l'instance devrait-elle savoir (et se soucier) de sa clé d'instance? – Fildor

+0

Eh bien, peut-être que je fais mal, mais dans mon application, j'ai plusieurs instances du même contrôleur de vue, et donc, j'ai besoin d'une instance ViewModel différente pour chaque instance de contrôleur de vue. Comme mon ViewModel a besoin d'un identifiant pour obtenir des données de la base de données, j'ai pensé que j'utiliserais cet identifiant aussi comme identifiant d'instance. – n3k

+0

Ah, difficile ... Pouvez-vous montrer comment ils sont liés? Votre classe ViewController a-t-elle un champ ViewModel? Comment créez-vous votre ViewController? Je pourrais imaginer si vous avez injecté le viewmodel dans le viewcontroller par ctor param, vous pouvez définir un champ dans ce ctor sur le viewmodel, donc il sera entièrement initialisé lorsque le contrôleur devient opérationnel ... pouvez-vous me suivre? – Fildor

Répondre

1

Il semble qu'il ne soit pas possible d'obtenir l'ID d'instance nativement, pour être sûr que mon exemple est entièrement Opérationnels, et éviter setters d'appel dans mon ViewController, je enfin ajouter une interface à mon avis modélisez et définissez l'identifiant d'instance directement dans mon ServiceLocator.

public interface IIdentifiableViewModel 
{ 
    /// <summary> 
    /// Gets or sets the instance key. 
    /// </summary> 
    /// <value>The instance key.</value> 
    string InstanceKey { get; set; } 
} 

Dans le 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; 
    } 

Ne hésitez pas à répondre si vous avez une solution plus élégante ou intégrée.

1

Je ne pense pas qu'il existe un moyen d'accéder à cet ID dans le constructeur. Cet identifiant est enregistré en interne dans SimpleIOC. Je voudrais simplement créer un nouveau type de ViewModel et lui ajouter une propriété InstanceID.

var viewModel = SimpleIoc.Default.GetInstance<MyViewModel>("contextIdentifier"); 
viewModel.ID = "contextIdentifier"; 

public class MyViewModel : ViewModelBase 
{ 
    public string ID { get; set; } 
}