我熟悉在.NET Framework 4.6中使用MEF。*但不熟悉.NET Core。我正在使用模板10中的汉堡模板来查看它是否适合我的需求,但我还没有弄清楚如何使用MEF来构建我的视图模型。
我的问题是如何使用导航服务导航到视图,以便MEF注入其视图模型?
答案 0 :(得分:0)
我有一种方法可以使这个工作,但似乎有点代码臭,所以欢迎更好的答案。我创建了一个包含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;
}
}
答案 1 :(得分:0)
我的坏,我没有发现这个:
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;
}