我正在尝试使用ASP注入一个服务到构造函数.Net依赖注入,但得到一个消息,我的空白构造函数是不够的



这是我目前所做的。我试图创建一个新的ThemeManagementViewModel,并注入到一个资源服务使用:

Microsoft.Extensions。DependencyInjection 5.0.1版本的nuget包

public static class Startup
{
public static IServiceProvider ServiceProvider { get; set; }
public static IServiceProvider Init()
{
var serviceProvider = new ServiceCollection().ConfigureServices()
.BuildServiceProvider();
ServiceProvider = serviceProvider;
return serviceProvider;
}
}
public static class DependencyInjectionContainer
{
public static IServiceCollection ConfigureServices(this IServiceCollection services)
{
services.AddSingleton<IDatabaseService, DatabaseService>();
services.AddSingleton<IResourceService, ResourceService>();
services.AddTransient<ThemeManagementViewModel>();
return services;
}
}
public partial class ThemeManagementViewModel : BaseViewModel
{
private readonly IResourceService _resourceService;
public ThemeManagementViewModel(IResourceService resourceService)
{
_resourceService = resourceService;
}
}
public partial class ResourceService : IResourceService
{
private IDatabaseService _databaseService;
public ResourceService(IDatabaseService databaseService)
{
_databaseService = databaseService;
}
}
public interface IResourceService
{
void SetResourceColors();
}

public class ThemeManagementPage : HeadingView
{
private readonly ThemeManagementViewModel _vm;
public ThemeManagementPage()
{
BindingContext  = _vm = new ThemeManagementViewModel();
}
}

当我构建我的应用程序时,它给了我这一行的消息:

BindingContext  = _vm = new ThemeManagementViewModel();

这是我收到的信息

There is no argument given that corresponds to the required 
formal parameter 'resourceService' of 
'ThemeManagementViewModel.ThemeManagementViewModel(IResourceService)'

我认为DI应该将服务插入到ThemeManagementViewModel的构造函数中,但似乎没有工作。

依赖注入不会简单地发生在构造对象的任何地方。你需要显式地遍历你的DI框架。

在这种情况下,您需要调用IServiceProvider对象的GetRequiredService()

var _vm = Startup.ServiceProvider.GetRequiredService<ThemeManagementViewModel>();

同样,从你的代码中,我们没有看到你使用你的DependencyInjectionContainer类。你必须确保你的ConfigureServices方法被显式调用。


我不会施魔法。编译器对它一无所知。你必须明确地使用它。在ASP.net网站项目的环境中,它似乎可以创造奇迹。但这仅仅是因为ASP.net框架处理了你需要在其他类型的项目中显式执行的事情。


  • 如何在。net应用程序中使用DI教程

相关内容

  • 没有找到相关文章