C# 作为配置属性的不可变类型
可以将不可变类型用作.NET配置API的配置属性吗 假设我有一个名为MyClass的不可变类型:C# 作为配置属性的不可变类型,c#,.net,configuration,serialization,C#,.net,Configuration,Serialization,可以将不可变类型用作.NET配置API的配置属性吗 假设我有一个名为MyClass的不可变类型: public class ImmutableClass { private readonly int value; public ImmutableClass(int value) { this.value = value; } public int Value { get { return this.value;
public class ImmutableClass
{
private readonly int value;
public ImmutableClass(int value)
{
this.value = value;
}
public int Value
{
get { return this.value; }
}
}
我想在ConfigurationSection中将此类型用作配置属性:
public class MyConfigurationSection : ConfigurationSection
{
[ConfigurationProperty("foo")]
public ImmutableClass Foo
{
get { return (ImmutableClass)base["foo"]; }
set { base["foo"] = value; }
}
}
执行此操作时,我无法序列化和反序列化MyConfigurationSection,因为它会引发以下异常:
System.Configuration.ConfigurationErrorsException:属性“Criteria”的值无法转换为字符串。错误是:找不到支持与类型为“FindCriterion”的属性“Criteria”的字符串进行转换的转换器
如果我从ConfigurationElement派生ImmutableClass,则在尝试序列化和反序列化配置节时会出现以下异常:
System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.MissingMethodException:未为此对象定义无参数构造函数
我完全控制ImmutableClass,所以我可以实现任何需要的接口
有什么方法可以挂接到配置API中,以便以这种方式使用ImmutableClass吗?您可以使用一些方法来帮助流程进行(链接到System.Configurations.ConfigurationConverter)
真正的问题是你为什么要给自己制造这么多麻烦?只是有些时候,与其打起来,倒不如退后一步,接受它。如果您试图以除为您指定的特定方式之外的任何方式来完成此框架的某些部分,则会令人沮丧。…就个人而言,我认为您最好将配置部分中的数据(似乎需要可变)以及如何在对象模型中表示这些数据分开。没有什么能阻止你拥有两种表现形式——一种是用于配置的简单(DTO/POCO)版本,另一种是用于在应用程序中实际使用的自定义版本(在本例中是不可变的)。我会放弃这个诅咒,因为这个想法注定要失败。所有配置节处理程序都必须具有默认(无参数)构造函数。不可变对象的情况并非如此 最简单的解决方案是在配置和应用程序之间放置另一个抽象级别。您可以应用配置提供程序模式,将配置部分的“免费”可变类转换为不可变类,然后由应用程序使用 我必须说,这就是应该如何使用配置部分。我知道有赖特后卫的选择,但我以前从未使用过 代码可能如下所示: 配置处理程序
public class SectionHandler : ConfigurationSection
{
[ConfigurationProperty("foo")]
public MyObject ConfigurationValue
{
get { return (MyObject) this["foo"]; }
}
}
将配置值从XML文件中取出并放入对象后,使用配置提供程序模式使用应用程序中的配置
配置提供程序可能如下所示:
public MyConfigurationProvider : IMyconfigurationProvider
{
public MyImmutabble ConfigurationValue
{
get
{
var configurationvalue = (MyObject) ConfigurationManager.GetSection("mySection");
return new MyImmutable(configurationvalue.ConfigurationValue);
}
}
}
这就是我做这件事的方式,到目前为止,它一直在为我服务
希望能有所帮助。+1。谢谢,效果很好。我同意在大多数情况下,随波逐流会更容易,这也是我通常做的,但这是一个特殊情况…很高兴知道。。。我实际上在试验不可变类型和xaml序列化。我希望类型转换器也能为我工作!在大多数情况下我都会同意,这也是我通常做的,但这是一个特殊情况。在正常情况下,我完全同意你的看法,这也是我的正常做法,但这是一个特殊情况。我只是按照Will的建议使用TypeConverts,效果很好,所以你最初的说法是不正确的。