2017-07-20 3 views
0

Je ne suis pas si sûr que DryIoc vaut mon temps. Il semble léger et bien supporté dans un environnement multiplateforme (avec Xamarin). Mais je me sens un peu difficile de travailler avec elle (en terme d'explorer tout moi-même). La communauté DryIoc n'est pas non plus très grande (et en lisant quelques réponses sur DryIoc, j'ai reconnu qu'il semble que seul l'auteur saute et donne les réponses =)). Voici mon problème tel que mentionné dans le titre. Supposons que j'ai 2 classes de ViewModel, le second a une propriété qui doit toujours correspondre (cartographiée) avec une propriété du premier, comme celui-ci:Injecter une propriété avec la valeur d'une autre propriété d'un autre objet enregistré?

public class ParentViewModel { 
} 
public class FirstViewModel { 
    public FirstViewModel(ParentViewModel parent){ 
    } 
    public string A { 
     //... 
    } 
} 
public class SecondViewModel { 
    public SecondViewModel(ParentViewModel parent){ 
    } 
    public string A { 
     //... 
    } 
} 

Maintenant, je peux utiliser dryioc pour vous inscrire singleton pour les deux ViewModels mais pour les Deuxièmement, j'ai aussi besoin d'injecter la propriété A avec la valeur de la propriété A de la première. Donc, comme vous pouvez le voir, la première inscription devrait être correcte car aucune dépendance de propriété n'est requise. Cependant, le second devrait avoir sa propriété A dépend du A du premier. Vraiment, je ne peux pas explorer cela moi-même. propriétés de l'injection un certain type enregistré est très bien (et au moins je sais comment faire), mais ici la valeur injectée est une autre propriété d'un certain type enregistré.

J'espère que l'auteur (comme d'habitude) va sauter ici et m'aider. Merci beaucoup.

Répondre

1

Voici le straightforward way (mais peut-être pas le meilleur) pour atteindre que:

using System; 
using DryIoc; 

public class Program 
{ 
    public static void Main() 
    { 
     var container = new Container(); 

     container.Register<ParentViewModel>(); 

     container.Register<FirstViewModel>(Reuse.Singleton); 

     container.Register<SecondViewModel>(Reuse.Singleton, 
      made: PropertiesAndFields.Of.Name("A", r => r.Container.Resolve<FirstViewModel>().A)); 

     var firstVM = container.Resolve<FirstViewModel>(); 
     firstVM.A = "blah"; 

     var secondVM = container.Resolve<SecondViewModel>(); 

     Console.WriteLine(secondVM.A); // should output "blah" 
    } 

    public class ParentViewModel { 
    } 

    public class FirstViewModel { 
     public FirstViewModel(ParentViewModel parent) { } 
     public string A { get; set; } 
    } 

    public class SecondViewModel { 
     public SecondViewModel(ParentViewModel parent) {} 
     public string A { get; set; } 
    } 
} 

À mon avis, la meilleure et plus simple en l'inversion de contrôle: la création du A en dehors des deux VMs puis en les injectant dans les deux.

+0

Merci beaucoup. Pour votre meilleure suggestion à la fin, pensez-vous qu'il est adapté au contenu dynamique (le 'A') qui peut être modifié à l'exécution à tout moment? Cela signifie-t-il que nous devons injecter chaque fois que cela change? Quoi qu'il en soit, cela me semble une meilleure solution, je ne suis pas très familier avec IoC en général, donc ce que je pensais c'est tout mettre en place *** d'abord ***, pas au milieu d'un processus, alors peut-être que je n'a pas pensé à la solution que vous avez suggérée au début. – Hopeless

+0

Simple, si c'est une propriété dynamique, il suffit de passer à une méthode normalement. Ne pas injecter. – dadhi

+0

Je pense que c'est un scénario de cartographie de la propriété dans ce cas (de sorte que c'est automatique). Si vous le définissez manuellement, vous devrez vous rappeler de le définir chaque fois que vous créez les machines virtuelles. En fait, cela peut être facile si vous organisez les machines virtuelles en arbre (ainsi une propriété peut facilement être référencée à une autre dans le même arbre, ou même je n'ai pas besoin de différents hubs référençant le même objet dans un tel arbre. Mais vraiment, je pense que la construction d'un tel arbre n'est pas un couplage lâche et le test des machines virtuelles peut être plus difficile. – Hopeless