Dependency injection 使用MEF的模板10依赖项注入

Dependency injection 使用MEF的模板10依赖项注入,dependency-injection,mef,template10,Dependency Injection,Mef,Template10,我熟悉在.NET Framework 4.6*中使用MEF,但不熟悉在.NET Core中使用MEF。我正在摆弄模板10中的汉堡包模板,看看它是否适合我的需要,但我还没有弄清楚如何使用MEF组合视图模型 我的问题是,如何使用导航服务导航到视图,使其视图模型由MEF注入?我有一种方法可以让它工作,但它似乎有点代码臭,因此欢迎更好的答案。我创建了一个静态类,其中包含CompositionHost的一个实例。它有一个解析导入的方法。视图的代码隐藏调用静态类来创建其视图模型 public static

我熟悉在.NET Framework 4.6*中使用MEF,但不熟悉在.NET Core中使用MEF。我正在摆弄模板10中的汉堡包模板,看看它是否适合我的需要,但我还没有弄清楚如何使用MEF组合视图模型


我的问题是,如何使用导航服务导航到视图,使其视图模型由MEF注入?

我有一种方法可以让它工作,但它似乎有点代码臭,因此欢迎更好的答案。我创建了一个静态类,其中包含
CompositionHost
的一个实例。它有一个解析导入的方法。视图的代码隐藏调用静态类来创建其视图模型

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;
    }
}
在视图的代码隐藏中:

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;
    }
}
公共密封部分类主页面:第页
{
私有MainPageViewModel视图模型{get;}
公共主页()
{
初始化组件();
NavigationCacheMode=Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
ViewModel=Container.Get();
DataContext=ViewModel;
}
}

我的错,我没有发现这一点:

最后,我选择了这样的解决方案:

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;
    }
}
在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;
    }

请记住,T10更像是一个页面优先的框架,其中类似Caliburn.Micro的东西更适合MEF(它是该框架中的第一类包含),因为它是一个ViewModel优先的框架。回答这个问题相当困难。因为T10中的VM通常在设计时绑定到页面。谢谢。我将查看Caliburn.Micro,看看它是否更合适。请记住,反射可能会在uwp中抛出一条曲线(不完全是.net core,但很接近,我记得MEF的另一件事是至少4.6中的版本没有处理开放泛型MEFContrib,我认为有一些解决方案)。谢谢。你知道一种无反射的组装方式吗?那就是MEF的设计。无法删除基本块。
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;
    }