【问题标题】:Template 10 dependency injection using MEF使用 MEF 的模板 10 依赖注入
【发布时间】:2017-06-04 08:59:29
【问题描述】:

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

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

【问题讨论】:

  • 请记住,T10 更像是一个页面优先框架,而像 Caliburn.Micro 之类的东西更适合 MEF(这是该框架中的一流包含),因为它是一个 ViewModel第一个框架。在回答这个问题时非常困难。由于 T10 中的 VM 通常在设计时绑定到 Page。
  • 谢谢。将检查 Caliburn.Micro 看它是否更合适。

标签: dependency-injection mef template10


【解决方案1】:

我有一种方法可以让这个工作,但似乎代码有点臭,所以欢迎更好的答案。我创建了一个包含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;
    }
}

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

在视图后面的代码中:

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

【讨论】:

  • 请记住,反射可能会在 uwp 中抛出一条曲线(不完全是 .net 核心,但很接近,我记得 MEF 的另一件事,至少 4.6 中的版本没有处理开放泛型 MEFContrib I认为有一些解决方案)。
  • 谢谢。您是否碰巧知道一种无需反射即可获取程序集的方法?
  • 那是MEF的设计。无法移除基本块。
【解决方案2】:

我的错,我没有发现这个:

How do I use a Unity IoC container with Template10?

最后,我找到了这样的解决方案:

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

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多