属性的自定义配置绑定器

     2023-03-09     184

关键词:

【中文标题】属性的自定义配置绑定器【英文标题】:Custom Configuration Binder for Property 【发布时间】:2017-06-19 19:31:29 【问题描述】:

我在 ASP.NET Core 1.1 解决方案中使用配置绑定。基本上,我的 ConfigureServices 启动部分中有一些简单的绑定代码,如下所示:

services.AddSingleton(Configuration.GetSection("SettingsSection").Get<SettingsClass>());

问题在于,我的类作为 int 属性通常绑定到配置文件中的 int 值,但可以改为绑定到字符串“disabled”。在后台,如果属性绑定到字符串“disabled”,我希望该属性的值为 -1。

它可能比这更复杂,但为了简洁起见,我正在简化。

我的问题是:我如何提供一个自定义绑定器/转换器来覆盖 SettingsClass 中特定属性的配置绑定,以便在进行字符串转换时它将“禁用”转换为 -1,而不是抛出一个“禁用”的异常不能转换为 Int32?

【问题讨论】:

【参考方案1】:

看来,由于 ConfigurationBinder 使用类型的 TypeDescriptor 来获取转换器,所以我要做的唯一方法是实现自定义类型转换器并将其插入到我的类的 TypeDescriptor 中m 转换为(在本例中为 Int32)。

所以,基本上,在配置发生之前添加这个:

TypeDescriptor.AddAttributes(typeof(int), new TypeConverterAttribute(typeof(MyCustomIntConverter)));

MyCustomIntConverter 看起来像这样:

public class MyCustomIntConverter  : Int32Converter

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    
        if (value != null && value is string)
        
            string stringValue = value as string;
            if(stringValue == "disabled")
            
                return -1;
            
        
        return base.ConvertFrom(context, culture, value);
    

似乎有点矫枉过正,因为现在“禁用”将始终转换为 -1 用于应用程序中的任何地方的 Int32。如果有人知道一种侵入性较小的方法,请告诉我。

【讨论】:

【参考方案2】:

我最近偶然发现了同样的问题,并提出了略有不同的解决方案。

我的想法是使用默认绑定机制。就我而言,我想获得HashSet 的新实例,其值存储在我的数据库中的proper array format 中。我创建了一个类,我将我的配置绑定到一个private 在我的配置中命名的属性和一个public 属性,它使用private 为我创建一个HashSet 的实例。看起来有点像这样:

// settings.json

    option: 
        ids:[1,2,3],
    

还有class

public class Options

    public HashSet<int> TrueIds
    
        get
        
            return RestrictedCategoryIds?.ToHashSet();
        
    

    private int[] Ids get; set; 

然后您可以使用BindNonPublicProperties 来确保活页夹将填充您的private 属性。

// Startup.cs
services.Configure<Options>(Configuration, c => c.BindNonPublicProperties = true);

您说在您的情况下,这可能不像将“禁用”转换为-1那么简单,但也许我的想法会激发您以不同的方式解决这个问题。

【讨论】:

自定义模型绑定器未针对 ASP.NET Core 2 中的单个属性触发

】自定义模型绑定器未针对ASP.NETCore2中的单个属性触发【英文标题】:CustommodelbindernotfiringforasinglepropertyinASP.NETCore2【发布时间】:2019-09-0406:16:22【问题描述】:我已经尝试过this,但我不认为这是我的情况。This也不起作用。我正... 查看详情

资源绑定器(代码片段)

...ndle;45/*6java.util包下提供了一个资源绑定器,便于获取属性配置文件中的内容。7使用以下这种方式的时候,属性配置文件xxx.properties必须放到类路径下。8*/9publicclassResourceBundleTes 查看详情

使用自定义模型绑定器的递归模型绑定

...视图模型,其中包含一个IStep列表。每个步骤都有自己的属性和验证。他在视图上序列化向导(作为 查看详情

.NET Core 自定义模型绑定器调用默认模型绑定器

】.NETCore自定义模型绑定器调用默认模型绑定器【英文标题】:.NETCoreCustommodelbindercalldefaultmodelbinder【发布时间】:2018-08-2209:55:43【问题描述】:我正在尝试在.NETCore中实现一些将小数四舍五入到小数点后两位的中间件。所有其他... 查看详情

Web API 验证不使用自定义模型绑定器触发

】WebAPI验证不使用自定义模型绑定器触发【英文标题】:WebAPIValidationnottriggerwithcustommodelbinder【发布时间】:2017-04-1912:35:44【问题描述】:我正在使用WebAPI5构建Web服务。我正在通过扩展IModelBinder接口以将复杂类型作为参数映射到... 查看详情

没有绑定器的 RxSwift 自定义数据类型转换

】没有绑定器的RxSwift自定义数据类型转换【英文标题】:RxSwiftCustomDataTypeConvertionwithoutBinders【发布时间】:2018-08-2410:19:03【问题描述】:我是RxSwift的新手,正在使用其中一个应用程序。我遇到了一个问题,在我的viewModel中我得... 查看详情

Asp.net Core 模型绑定器接受布尔类型的随机整数

...时间】:2019-10-0115:01:31【问题描述】:假设模型具有布尔属性:publicclassPersonpublicstringNameget;set;publicboolIsMaleget;set;当尝试发布以下负载时:"name":"B 查看详情

泛型类型的自定义模型绑定

】泛型类型的自定义模型绑定【英文标题】:Custommodelbindingforgenerictype【发布时间】:2019-12-0721:02:42【问题描述】:我有一个ASP.NetMVC4应用程序,我正在尝试创建自定义模型绑定器。它必须处理的模型是这样的:publicclassCompressedJs... 查看详情

27.泛型算法和绑定器

#include<iostream>#include<vector>#include<algorithm>//包含了C++STL里面的泛型算法#include<functional>//包含了函数对象和绑定器usingnamespacestd;#if0/*五、泛型算法=template+迭代器+函数对象特点一& 查看详情

android小部件中的绑定器事务失败[重复]

】android小部件中的绑定器事务失败[重复]【英文标题】:Failedbindertransactioninandroidwidget[duplicate]【发布时间】:2011-12-1021:19:06【问题描述】:可能重复:failedbindertransactiononwidgetupdate当我尝试在我的android小部件中更新位图时遇到问... 查看详情

复杂对象和模型绑定器 ASP.NET MVC

】复杂对象和模型绑定器ASP.NETMVC【英文标题】:ComplexobjectandmodelbinderASP.NETMVC【发布时间】:2015-03-2812:27:13【问题描述】:我有一个模型对象结构,其中包含一个Foo类,其中包含一个带有字符串值的Bar。publicclassFoopublicBarBar;publicc... 查看详情

如何将数据绑定器写入数据列表中的图像标签

】如何将数据绑定器写入数据列表中的图像标签【英文标题】:Howtowritethedatabinderintotheimagetagindatalist【发布时间】:2015-04-0105:30:09【问题描述】:我正在使用img标签,但我得到了错误。我知道这是一个简单的错误。但我不知道。... 查看详情

为啥 ASP.Net MVC 模型绑定器将空 JSON 数组绑定到 null?

】为啥ASP.NetMVC模型绑定器将空JSON数组绑定到null?【英文标题】:WhydoestheASP.NetMVCmodelbinderbindanemptyJSONarraytonull?为什么ASP.NetMVC模型绑定器将空JSON数组绑定到null?【发布时间】:2014-05-3106:09:55【问题描述】:这是我的模型类:publi... 查看详情

asp.net core mvc 2中抽象类的模型绑定器

】asp.netcoremvc2中抽象类的模型绑定器【英文标题】:Modelbinderforabstractclassinasp.netcoremvc2【发布时间】:2018-06-2105:19:23【问题描述】:我一直在尝试为ASP.NETCore2中的抽象类实现模型绑定器,但没有成功。我特别研究了两篇文章,看... 查看详情

使用模型绑定器时在 ASP.NET MVC 中往返视图数据

】使用模型绑定器时在ASP.NETMVC中往返视图数据【英文标题】:Round-trippingviewdatainASP.NETMVCwhileusingModelBinders【发布时间】:2011-01-0502:06:03【问题描述】:假设我有一个包含以下“业务对象”的表单:publicclassMyObjectpublicstringNameget;set... 查看详情

c++编程经验(11):std::function和bind绑定器(代码片段)

...holders简介在前面C++集群的项目里面大量应用到了绑定器来做解耦操作,那么,绑定器到底是什么呢?有什么玄妙的地方嘞?其实也不是很玄乎,以前写Qt的时候就经常用到绑定,昨天又发现,其... 查看详情

c++编程经验(11):std::function和bind绑定器(代码片段)

...holders简介在前面C++集群的项目里面大量应用到了绑定器来做解耦操作,那么,绑定器到底是什么呢?有什么玄妙的地方嘞?其实也不是很玄乎,以前写Qt的时候就经常用到绑定,昨天又发现,其... 查看详情

用于 Spring Cloud 的 Kafka 绑定器不使用事务回滚

】用于SpringCloud的Kafka绑定器不使用事务回滚【英文标题】:KafkaBindersforSpringCloudnotrollingbackwithTransactional【发布时间】:2021-09-1904:00:08【问题描述】:我正在尝试通过SpringCloud在事务中向Kafka中的两个单独主题发送消息。在第一条... 查看详情