1

J'essaie d'implémenter Unity dans une application WPVM MVF, mais il me manque une vue d'ensemble.Caliburn.Micro + Unity 2.1 + MVVM: exemple de code

En ce moment j'ai créé un programme d'amorçage comme ceci:

public class MainBootstrapper : Bootstrapper<MainViewModel> 
    { 
    private UnityContainer container; 

    protected override void Configure() 
    { 
     container = new UnityContainer(); 
     container.RegisterType<IServiceLocator, UnityServiceLocator>(new ContainerControlledLifetimeManager()); 
     container.RegisterType<IWindowManager, WindowManager>(new ContainerControlledLifetimeManager()); 
     container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager()); 
    } 

    protected override object GetInstance(Type service, string key) 
    { 
     if (service != null) 
     { 
     return container.Resolve(service); 
     } 

     if (!string.IsNullOrWhiteSpace(key)) 
     { 
     return container.Resolve(Type.GetType(key)); 
     } 

     return null; 
    } 

    protected override IEnumerable<object> GetAllInstances(Type service) 
    { 
     return container.ResolveAll(service); 
    } 

    protected override void BuildUp(object instance) 
    { 
     container.BuildUp(instance); 
    } 
    } 

Comment ce qui est la meilleure façon d'utiliser? Ce code fonctionne actuellement:

public class MainViewModel : PropertyChangedBase 
    { 
    public MainViewModel() 
    { } 

    [Dependency] 
    public Sub1ViewModel Sub1VM { get; set; } 
    [Dependency] 
    public Sub2ViewModel Sub2VM { get; set; } 
    } 

le MainView a ceci:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <ContentControl Grid.Row="0" Name="Sub1VM" /> 
    <ContentControl Grid.Row="1" Name="Sub2VM" /> 

</Grid> 

tout d'abord: le code que je partage, est-ce la bonne façon d'utiliser l'unité + Caliburn? Maintenant, disons que mon Sub1VM utilise un modèle 'M1', mais Sub2VM doit utiliser le même modèle pour afficher des informations mais pas en faisant une autre instance du modèle M1. (singleton)

Comment cela fonctionne-t-il maintenant? Montrer que j'utilise un IServiceLocator dans chaque constructeur viewmodel? Quelqu'un pourrait-il partager un échantillon de code pour l'expliquer?

Répondre

1

Tout d'abord je suis d'accord avec McDonnellDean que vous devriez lire l'article sur les écrans, et Composition Conductors (si j'étais vous, je lis tous les articles avant que trop de comprendre comment fonctionne Caliburn.Micro.). En plus de cela, vous avez correctement implémenté Unity et vous pouvez vérifier Unity as IoC Container for Caliburn.Micro pour plus d'informations. De l'autre côté, vous mélangez ici deux concepts, à savoir Dependency Injection et MVVM. En ce qui concerne votre question sur le modèle, je préférerais aussi l'injection de constructeur, et si vous voulez une seule instance du modèle, peut-être vous pouvez injecter un Factory qui crée ce modèle pour vous et l'envelopper dans deux modèles de vue différents et l'exposer à travers le deux propriétés différentes. Enfin, je vous encourage vraiment à lire les tutoriels (start here), au moins les rubriques de base.

+0

merci pour le lien 'start here' – juFo

+0

@juFo, je vous en prie. –

1

Je ne connais pas Unity en particulier mais votre configuration semble correcte.

Comme pour vos points d'injection. Je dirais que plutôt que de faire l'injection de propriété, vous devriez faire l'injection du constructeur. Ce que vous faites est bien, mais vous pouvez vouloir regarder les écrans et les conducteurs, ceux-ci vous permettent d'ajouter le cycle de vie à vos ViewModels. En général, il ressemblerait à ceci:

  • Bootstrapper ouvre ShellViewModel

  • ShellViewModel prend en MainViewModel par injection Ctor comme IConductorOneActive

  • MainViewModel prend une collection de IScreens.

  • ShellViewModel appelle la méthode d'activation MainViewModels sur MainViewModel.

Voir Screens, Conductors and Composition. Comme je l'ai dit plus haut, votre chemin est correct mais c'est un peu manuel et cela signifie que vous devez tout câbler à la main.

Questions connexes