【问题标题】:Not getting my service injected in Model Binder Provider没有在 Model Binder Provider 中注入我的服务
【发布时间】:2020-05-26 20:58:56
【问题描述】:

我没有将注入服务注入到我的自定义 RegisterBinderProvider 中有什么原因吗?

            services.AddScoped<IPasswordHasher, PasswordHasher>();

            services.AddMvc(options =>
            {
                RegisterBinderProvider registerBinderProvider = 
                     DependencyResolver.Current.GetService<RegisterBinderProvider>();
                options.ModelBinderProviders.Insert(0, registerBinderProvider);
                options.Filters.Add(typeof(ApiExceptionFilter));
            });

在这段代码之后,当我在 RegisterBinderProvider 类中时,我看到 PasswordHasher 服务的值为 null。但是,我在插入RegisterBinderProvider之前检查了已经注入的服务,我可以在其中找到PasswordHasher。

如果您需要,这是我的自定义 BinderProvider:

    public class RegisterBinderProvider : IModelBinderProvider
    {
        private readonly IPasswordHasher _passwordHasher;

        public RegisterBinderProvider(IPasswordHasher passwordHasher)
        {
            _passwordHasher = passwordHasher;
        }

        public IModelBinder GetBinder(ModelBinderProviderContext context)
        {
            if (context.Metadata.ModelType == typeof(User))
            {
                return new RegisterBinder(_passwordHasher);
            }

            return null;
        }
    }

希望我提供了足够的信息来理解我的问题,谢谢!

【问题讨论】:

    标签: c# asp.net-mvc model-binding .net-core-3.1 custom-model-binder


    【解决方案1】:

    您可以使用context 参数在GetBinder 方法中重新使用该服务:

    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
            var service = context.Services.GetRequiredService<IPasswordHasher>();
            if (context.Metadata.ModelType == typeof(User))
            ...
    }
    

    由于您只创建了 RegisterBinderProvider 的单个实例并调用了一次 AddMvcModelBinderProviders.Insert 方法,因此尝试在启动时解析作用域服务没有多大意义。

    【讨论】:

    • 非常感谢!我不得不将注入服务的生命周期从作用域改为单例,它按照你告诉我的方式工作。
    • 如果是单例,你还不如创建一个PasswordHasher的实例并手动注入。
    • 我为什么要这样做?我还在其他具有不同生命周期范围的服务中使用PasswordHasherPasswordHasher 在其构造函数中也有一个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2015-10-24
    • 2019-09-06
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多