我熟悉在.NET Framework4.6.*中使用MEF,但在.NET核心中不熟悉。我正在摆弄模板10中的汉堡包模板,看看它是否适合我的需要,但我还不能弄清楚如何使用MEF来构建我的视图模型。
我的问题是,我如何使用导航服务导航到视图,以使其视图模型将由MEF注入?
发布于 2017-01-24 01:43:08
我的错,我没有注意到这个:
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;
}发布于 2017-01-20 22:52:45
我有一种方法可以让它工作,但它似乎有点代码臭味,所以欢迎更好的答案。我创建了一个包含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;
}
}https://stackoverflow.com/questions/41745561
复制相似问题