c# - 如何修复错误 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));
}
}
}
}
解决方案
推荐阅读
- android - 应用新版本更新未显示在 Google Play 上
- java - 如果使用下载管理器完成下载,如何显示警报
- python - Scrapy / Parse几个具有相同功能的类别和子类别
- r - 在 R 中创建具有多个变量的数据框
- cmake - 如何组织具有菱形依赖的庞大的单体代码库?
- php - 使用 MYSQL 数据库在 PHP 中准备语句
- javascript - 如何使用微路由器验证有效载荷?
- ruby-on-rails - 在 Ruby on Rails 中使用 ActionCable 更新多个 div 的最佳实践是什么?
- ruby-on-rails - Rails 提交按钮不保存数据
- sql - 搜索非英文文本的数据