Тип нельзя использовать в качестве параметра типа 'TTo' в универсальном типе или методе. Нет неявного преобразования ссылок - PullRequest
1 голос
/ 17 июня 2019

В настоящее время я пытаюсь использовать Unity для внедрения ViewModels в мое приложение WPF.

Я склонен использовать класс ViewModelLocator для хранения всех моих моделей ViewMell в одной области, для быстрой навигации между ними

Я разделил свое приложение на четыре проекта:

KeystonePP.Models - содержит мою модель EF

KeystonePP.Startup - логика основного запуска

KeystonePP.ViewModels - ViewModels и их интерфейсы

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' нельзя использовать в качестве параметра типа 'TTo' в универсальном типе или методе 'UnityContainerExtensions.RegisterType (IUnityContainer, params InjectionMember [])'. Не существует неявного преобразования ссылок из KeystonePP.Startup.MainWindow в KeystonePP.ViewModels.Utility.Interfaces.IViewModelLocator.

Я слишком усложнился или упустил что-то простое, настраивая Unity?

1 Ответ

1 голос
/ 17 июня 2019

Вы хотите зарегистрировать абстракции с их реализациями.

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

таким образом, когда вы звоните, чтобы решить MainWindow

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

контейнер будет знать, как внедрить реализацию на основе абстракции при разрешении.

...