我目前正在尝试使用Unity将ViewModel注入我的WPF应用程序中。
我倾向于使用ViewModelLocator
类将所有ViewModel存储在一个区域中,以便在它们之间快速导航
我将我的应用分为四个项目:
KeystonePP.Models
-拥有我的EF模型
KeystonePP.Startup
-主要启动逻辑
KeystonePP.ViewModels
-ViewModel及其接口
KeystonePP.Views
-浏览次数
我在一个单独的项目中有一个IViewModelLocator
界面:KeystonePP.ViewModels
public interface IViewModelLocator
{
// No code here. Just a contract
}
这是由我的ViewModelLocator
类实现的
public class ViewModelLocator : ObservableObject, IViewModelLocator
{
// Lots of code here
}
在我的KeystonePP.Startup
项目中,我对MainWindow.xaml.cs
构造函数的调整如下:
public partial class MainWindow : Window
{
public MainWindow (IViewModelLocator viewModelLocator)
{
InitializeComponent();
DataContext = viewModelLocator;
}
}
但是,当我在App.xaml.cs
中尝试以下代码时,出现错误警告:
public partial class App : Application
{
/// <summary>
/// Startup Logic for App
/// </summary>
/// <param name="e"></param>
protected override void OnStartup (StartupEventArgs e)
{
base.OnStartup(e);
IUnityContainer container = new UnityContainer();
container.RegisterType<IViewModelLocator, MainWindow>();
}
}
我收到以下错误:
类型'KeystonePP.Startup.MainWindow'在通用类型或方法'UnityContainerExtensions.RegisterType(IUnityContainer,params InjectionMember [])'中不能用作类型参数'TTo'。没有从“ KeystonePP.Startup.MainWindow”到“ KeystonePP.ViewModels.Utility.Interfaces.IViewModelLocator”的隐式引用转换。
我变得太复杂了,还是错过了一些简单的设置Unity的事情?
答案 0 :(得分:1)
您要在其实现中注册抽象。
IUnityContainer container = new UnityContainer();
container.RegisterType<IViewModelLocator, ViewModelLocator>();
container.RegisterType<MainWindow>();
以这种方式在您呼叫解决MainWindow
var mainWindow = container.Resolve<MainWindow>();
mainWindow.Show();
解析时,容器将知道如何基于抽象注入实现。