C# 未在模型绑定器提供程序中注入我的服务

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 =

有什么理由不让注入服务进入我的定制RegisterBinder提供程序吗

            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
的构造函数中也有一个参数。