C# 未在模型绑定器提供程序中注入我的服务
有什么理由不让注入服务进入我的定制RegisterBinder提供程序吗C# 未在模型绑定器提供程序中注入我的服务,c#,asp.net-mvc,model-binding,.net-core-3.1,custom-model-binder,C#,Asp.net Mvc,Model Binding,.net Core 3.1,Custom Model Binder,有什么理由不让注入服务进入我的定制RegisterBinder提供程序吗 services.AddScoped<IPasswordHasher, PasswordHasher>(); services.AddMvc(options => { RegisterBinderProvider registerBinderProvider =
services.AddScoped<IPasswordHasher, PasswordHasher>();
services.AddMvc(options =>
{
RegisterBinderProvider registerBinderProvider =
DependencyResolver.Current.GetService<RegisterBinderProvider>();
options.ModelBinderProviders.Insert(0, registerBinderProvider);
options.Filters.Add(typeof(ApiExceptionFilter));
});
我希望我已经提供了足够的信息来理解我的问题,谢谢 您可以使用
context
参数在GetBinder
方法中重新选择服务:
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
var service = context.Services.GetRequiredService<IPasswordHasher>();
if (context.Metadata.ModelType == typeof(User))
...
}
public IModelBinder GetBinder(ModelBinderProviderContext)
{
var service=context.Services.GetRequiredService();
if(context.Metadata.ModelType==typeof(用户))
...
}
由于您只创建了
RegisterBinderProvider
的一个实例,并调用AddMvc
和ModelBinderProviders.Insert
方法一次,在启动时尝试解析作用域服务没有多大意义。您可以使用上下文
参数在GetBinder
方法中重新爱上该服务:
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
var service = context.Services.GetRequiredService<IPasswordHasher>();
if (context.Metadata.ModelType == typeof(User))
...
}
public IModelBinder GetBinder(ModelBinderProviderContext)
{
var service=context.Services.GetRequiredService();
if(context.Metadata.ModelType==typeof(用户))
...
}
由于您只创建了
RegisterBinderProvider
的一个实例,并调用AddMvc
和ModelBinderProviders.Insert
方法一次,因此在启动时尝试解析作用域服务没有多大意义。非常感谢!我不得不将注入服务的生命周期从作用域更改为单例,它按照您告诉我的方式工作。如果它是单例,您最好创建一个PasswordHasher
实例并手动注入。我为什么要这样做?我还在其他具有不同生存期范围的服务中使用PasswordHasher
,并且PasswordHasher
的构造函数中也有一个参数。非常感谢!我不得不将注入服务的生命周期从作用域更改为单例,它按照您告诉我的方式工作。如果它是单例,您最好创建一个PasswordHasher
实例并手动注入。我为什么要这样做?我还在其他具有不同生存期范围的服务中使用PasswordHasher
,并且PasswordHasher
的构造函数中也有一个参数。