首页 > 解决方案 > 如何修复错误 System.InvalidOperationException: Unable to resolve service for type 获取服务时?

问题描述

一天中的美好时光,我遇到了一个问题:当使用 MainViewModel 服务时抛出异常,告诉我如何解决这个问题?我是 mvvm 的新手,所以我还不是特别精通依赖注入,也不太了解如何解决这个问题。

这是错误 -链接

CreateViewModel它是一个委托

public delegate TViewModel CreateViewModel<out TViewModel>() where TViewModel : ViewModelBase;

应用程序.xaml.cs

namespace DormitoryManagementSystem.WPF
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private IHost _host;
 
        public App()
        {
            _host = CreateHostBuilder().Build();
        }
 
        public static IHostBuilder CreateHostBuilder(string[] args = null)
        {
            return Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(config =>
            {
                config.AddJsonFile("appsettings.json");
                config.AddEnvironmentVariables();
            })
            .ConfigureServices((context, services) =>
            {
                string connectionString = context.Configuration.GetConnectionString("default");
            
                services.AddDbContext<DormitoryManagementSystemDbContext>(o => o.UseSqlServer(connectionString));
                services.AddSingleton(new DormitoryManagementSystemDbContextFactory(connectionString));
                services.AddSingleton<IAuthenticationService, AuthenticationService>();
                services.AddSingleton<IUserService, UserService>();
                services.AddSingleton<IPasswordHasher, PasswordHasher>();
                services.AddSingleton<IDormitoryManagementSystemViewModelFactory, DormitoryManagementSystemViewModelFactory>();
                services.AddSingleton<CreateViewModel<CommandantViewModel>>(service =>
                {
                     return () => new CommandantViewModel();
                });
 
                services.AddScoped<INavigator, Navigator>();
                services.AddScoped<IAuthenticator, Authenticator>();
                services.AddScoped<MainViewModel>();
                services.AddScoped(service => new MainWindow(service.GetRequiredService<MainViewModel>()));
            
            });
        }
    }
}

主视图模型.cs

using System.Windows.Input;
using DormitoryManagementSystem.WPF.Commands;
using DormitoryManagementSystem.WPF.State.Authenticators;
using DormitoryManagementSystem.WPF.State.Navigators;
using DormitoryManagementSystem.WPF.ViewModels.Factories;
 
namespace DormitoryManagementSystem.WPF.ViewModels
{
    public class MainViewModel : ViewModelBase
    {
        private readonly DormitoryManagementSystemViewModelFactory _viewModelFactory;
        
        public INavigator Navigator { get; set; }
        public IAuthenticator Authenticator { get; }
        
        public ICommand UpdateCurrentViewModelCommand { get; }
        
        public MainViewModel(DormitoryManagementSystemViewModelFactory viewModelFactory, INavigator navigator, IAuthenticator authenticator)
        {
            _viewModelFactory = viewModelFactory;
            Navigator = navigator;
            Authenticator = authenticator;
 
            UpdateCurrentViewModelCommand = new UpdateViewModelCommand(viewModelFactory, navigator);
            
            UpdateCurrentViewModelCommand.Execute(ViewType.Commendant);
        }
 
    }
}

DormitoryManagementSystemViewModelFactory.cs

using System;
using DormitoryManagementSystem.WPF.State.Navigators;
 
namespace DormitoryManagementSystem.WPF.ViewModels.Factories
{
    public class DormitoryManagementSystemViewModelFactory : IDormitoryManagementSystemViewModelFactory
    {
        private readonly CreateViewModel<CommandantViewModel> _createCommandantViewModel;
        
        public DormitoryManagementSystemViewModelFactory(CreateViewModel<CommandantViewModel> createCommandantViewModel)
        {
            _createCommandantViewModel = createCommandantViewModel;
        }
 
        public ViewModelBase CreateViewModel(ViewType viewType)
        {
            switch (viewType)
            {
                case ViewType.Commendant:
                    return _createCommandantViewModel(); 
                
                case ViewType.Login:
                    return null;
                    
                default:
                    throw new ArgumentOutOfRangeException(nameof(viewType));
            }
        }
    }
}

标签: c#wpfxamlmvvm

解决方案


推荐阅读