属性的自定义配置活页夹

时间:2017-02-02 16:15:16

标签: c# asp.net-core asp.net-core-1.1

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

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

皱纹是我的类作为int属性,通常绑定到配置文件中的int值,但可以绑定到字符串“disabled”。在引擎盖下,我希望属性的值为-1,如果它绑定到字符串“disabled”。

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

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

2 个答案:

答案 0 :(得分:4)

看来,由于ConfigurationBinder使用类型的TypeDescriptor来获取转换器,我做我想做的唯一方法是实现自定义类型转换器并将其插入类I的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);
    }
}

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

答案 1 :(得分:0)

我最近偶然发现了一个相同的问题,并提出了稍微不同的解决方案。

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

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

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