该类型不能用作泛型类型或方法中的类型参数 'TTo'。没有隐式引用转换
The type cannot be used as type parameter 'TTo' in the generic type or method. There is no implicit reference conversion
我目前正在尝试使用 Unity 将 ViewModel 注入我的 WPF 应用程序。
我倾向于使用 ViewModelLocator
class 将我所有的 ViewModel 存储在一个区域中,以便在它们之间快速导航
我已将我的应用分成四个项目:
KeystonePP.Models
- 持有我的 EF 模型
KeystonePP.Startup
- 主要启动逻辑
KeystonePP.ViewModels
- ViewModel 及其接口
KeystonePP.Views
- 浏览量
我在一个单独的项目中有一个 IViewModelLocator
界面:KeystonePP.ViewModels
public interface IViewModelLocator
{
// No code here. Just a contract
}
这是由我ViewModelLocator
class
实现的
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>();
}
}
我收到以下错误:
The type 'KeystonePP.Startup.MainWindow' cannot be used as type parameter 'TTo' in the generic type or method 'UnityContainerExtensions.RegisterType(IUnityContainer, params InjectionMember[])'. There is no implicit reference conversion from 'KeystonePP.Startup.MainWindow' to 'KeystonePP.ViewModels.Utility.Interfaces.IViewModelLocator'.
我是不是太复杂了,还是我遗漏了一些简单的 Unity 设置?
您想在其实现中注册抽象。
IUnityContainer container = new UnityContainer();
container.RegisterType<IViewModelLocator, ViewModelLocator>();
container.RegisterType<MainWindow>();
你打电话解决的时候就是这样 MainWindow
var mainWindow = container.Resolve<MainWindow>();
mainWindow.Show();
容器会在解析时知道如何根据抽象注入实现。
我目前正在尝试使用 Unity 将 ViewModel 注入我的 WPF 应用程序。
我倾向于使用 ViewModelLocator
class 将我所有的 ViewModel 存储在一个区域中,以便在它们之间快速导航
我已将我的应用分成四个项目:
KeystonePP.Models
- 持有我的 EF 模型
KeystonePP.Startup
- 主要启动逻辑
KeystonePP.ViewModels
- ViewModel 及其接口
KeystonePP.Views
- 浏览量
我在一个单独的项目中有一个 IViewModelLocator
界面:KeystonePP.ViewModels
public interface IViewModelLocator
{
// No code here. Just a contract
}
这是由我ViewModelLocator
class
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>();
}
}
我收到以下错误:
The type 'KeystonePP.Startup.MainWindow' cannot be used as type parameter 'TTo' in the generic type or method 'UnityContainerExtensions.RegisterType(IUnityContainer, params InjectionMember[])'. There is no implicit reference conversion from 'KeystonePP.Startup.MainWindow' to 'KeystonePP.ViewModels.Utility.Interfaces.IViewModelLocator'.
我是不是太复杂了,还是我遗漏了一些简单的 Unity 设置?
您想在其实现中注册抽象。
IUnityContainer container = new UnityContainer();
container.RegisterType<IViewModelLocator, ViewModelLocator>();
container.RegisterType<MainWindow>();
你打电话解决的时候就是这样 MainWindow
var mainWindow = container.Resolve<MainWindow>();
mainWindow.Show();
容器会在解析时知道如何根据抽象注入实现。