这是我目前所做的。我试图创建一个新的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教程