该类型不能用作通用类型或方法中的类型参数'TTo'。没有隐式参考转换

时间:2019-06-17 18:29:21

标签: c# wpf unity-container

我目前正在尝试使用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的事情?

1 个答案:

答案 0 :(得分:1)

您要在其实现中注册抽象。

IUnityContainer container = new UnityContainer();
container.RegisterType<IViewModelLocator, ViewModelLocator>();
container.RegisterType<MainWindow>();

以这种方式在您呼叫解决MainWindow

var mainWindow = container.Resolve<MainWindow>();
mainWindow.Show();

解析时,容器将知道如何基于抽象注入实现。