C# 如何检索配置';选项';ModelBinder中的实例?
我正在构建一个自定义ModelBinder,需要从中检索启动时设置的MvcJsonOptions配置实例C# 如何检索配置';选项';ModelBinder中的实例?,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我正在构建一个自定义ModelBinder,需要从中检索启动时设置的MvcJsonOptions配置实例 services.AddMvc(options => {...}) .AddJsonOptions(options => { //I need this 'option' instance from my model binder }); 不确定我是否应该从服务提供商处检索它们,检索它们的最佳方法是什么?Dunno谁告诉过你它不可检索,但所有配置都是通过DI注册的,即使
services.AddMvc(options => {...})
.AddJsonOptions(options => {
//I need this 'option' instance from my model binder
});
不确定我是否应该从服务提供商处检索它们,检索它们的最佳方法是什么?Dunno谁告诉过你它不可检索,但所有配置都是通过DI注册的,即使是
mvcopions
和MvcJsonOptions
,正如你在源代码上清楚看到的那样
和MyBinder
应具有相关性:
public class MyBinder : IModelBinder
{
private readonly MvcJsonOptions jsonOptions;
public MyBinder(IOptions<MvcJsonOptions> options)
{
jsonOptions = options?.Value ?? throw new ArgumentNullException(nameof(options));
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
// Your binding logic here
...
return Task.CompletedTask;
}
}
公共类MyBinder:IModelBinder
{
私有只读MVCJSONOOPTIONS jsonOptions;
公共MyBinder(选项)
{
jsonOptions=options?.Value??抛出新的ArgumentNullException(nameof(options));
}
公共任务BindModelAsync(ModelBindingContext bindingContext)
{
//你的绑定逻辑在这里
...
返回Task.CompletedTask;
}
}
谁说它不能通过DI检索?谢谢你的帮助。剩下的一个问题是ModelBinderProvider是在构建serviceProvider之前以及在声明MvcJsonOption之前创建的。有没有办法在以后全局检索serviceProvider?ModelBinderProvider不需要任何外部依赖项。ModelBinderProvider仅用于创建和返回活页夹。活页夹应该是接收依赖项的活页夹。您应该返回returnnewbindertypemodelbinder(typeof(MyBinder))
返回需要依赖项injectedYep的绑定,几天前刚刚发布了自定义模型绑定文档。回答得好。
public class MyBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (/* some condition to identify your model */)
return new BinderTypeModelBinder(typeof(MyBinder));
return null;
}
}
public class MyBinder : IModelBinder
{
private readonly MvcJsonOptions jsonOptions;
public MyBinder(IOptions<MvcJsonOptions> options)
{
jsonOptions = options?.Value ?? throw new ArgumentNullException(nameof(options));
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
// Your binding logic here
...
return Task.CompletedTask;
}
}