2017-01-19 2 views
0

Je suis familier avec l'utilisation de MEF dans .NET Framework 4.6. * Mais pas dans .NET Core. Je suis en train de me tromper avec le modèle Hamburger du Template 10 pour voir s'il est adapté à mes besoins mais je n'ai pas été capable de comprendre comment composer mes modèles de vue en utilisant MEF.Modèle 10 injection de déphasage en utilisant MEF

Ma question est comment puis-je naviguer vers une vue en utilisant le service de navigation de telle sorte que son modèle de vue sera injecté par MEF?

+0

Gardez à l'esprit que T10 est plus d'une page premier cadre, alors que quelque chose comme Caliburn.Micro est plus approprié pour MEF (qui est une inclusion de première classe dans ce cadre), car il s'agit d'un premier cadre ViewModel. En réponse à la question sacrément difficile. Étant donné que les machines virtuelles dans T10 sont généralement liées à la page au moment du design. – mvermef

+0

Merci. Va vérifier Caliburn.Micro pour voir si elle est plus appropriée. –

Répondre

0

Mon mauvais, je ne l'avais pas repéré ceci:

How do I use a Unity IoC container with Template10?

En fin de compte, je suis allé pour une solution comme ceci:

public interface IView 
{ 
    ViewModelBase ViewModel { get; } 
} 

[Export] 
public sealed partial class MainPage : Page, IView 
{ 
    public ViewModelBase ViewModel 
    { 
     get 
     { 
      return VM as ViewModelBase; 
     } 
    } 

    [Import] 
    public MainPageViewModel VM { get; set; } 

    public MainPage() 
    { 
     InitializeComponent(); 
     NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled; 
    } 
} 

Et dans les App.xaml.cs:

public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args) 
    { 
     var config = new ContainerConfiguration(); 
     _container = config.WithAssembly(GetType().GetTypeInfo().Assembly).CreateContainer(); 
     await NavigationService.NavigateAsync(typeof(Views.MainPage)); 
    }  

    public override INavigable ResolveForPage(Page page, NavigationService navigationService) 
    { 
     _container.SatisfyImports(page); 
     return (page as IView)?.ViewModel; 
    } 
0

J'ai un moyen d'obtenir ce fonctionnement, mais il semble un peu le code malodorant donc de meilleures réponses sont les bienvenues. J'ai créé une classe statique contenant une instance du CompositionHost. Il a une méthode pour résoudre les importations. Le code derrière la vue appelle la classe statique pour créer son modèle de vue.

public static class Container 
{ 
    public static CompositionHost Host { get; set; } 

    public static T Get<T>() 
    { 
     T obj = Host.GetExport<T>(); 
     Host.SatisfyImports(obj); 
     return obj; 
    } 
} 

Dans la classe App:

public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args) 
    { 
     var config = new ContainerConfiguration(); 
     Container.Host = config.WithAssembly(GetType().GetTypeInfo().Assembly).CreateContainer(); 

     await NavigationService.NavigateAsync(typeof(Views.MainPage)); 
    } 

Dans le code de la vue derrière:

public sealed partial class MainPage : Page 
{ 
    private MainPageViewModel ViewModel { get; } 

    public MainPage() 
    { 
     InitializeComponent(); 
     NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled; 
     ViewModel = Container.Get<MainPageViewModel>(); 
     DataContext = ViewModel; 
    } 
} 
+0

garder à l'esprit que la réflexion pourrait jeter une courbe dans uwp (pas exactement. Net core, mais à proximité, seule autre chose que je me souviens avec MEF au moins la version 4.6 ne gère pas les génériques ouverts MEFContrib je pense avoir des solutions pour cela) . – mvermef

+0

Merci. Connaissez-vous un moyen d'obtenir l'assemblage sans réflexion? –

+0

C'est la conception de MEF. Impossible de supprimer les blocs de base. – mvermef