猿问

该类型不能用作泛型类型或方法中的类型参数“TTo”。没有隐式引用转换

我目前正在尝试使用 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 设置?


慕哥6287543
浏览 125回答 1
1回答

慕的地8271018

你想用它们的实现注册抽象。IUnityContainer container = new UnityContainer();container.RegisterType<IViewModelLocator, ViewModelLocator>();container.RegisterType<MainWindow>();这样当你打电话解决MainWindowvar mainWindow = container.Resolve<MainWindow>();mainWindow.Show();容器将知道如何在解析时基于抽象注入实现。
随时随地看视频慕课网APP
我要回答