如何更好地将配置元素映射到应用程序对象?

时间:2011-04-24 17:49:50

标签: c# mapping app-config system.configuration configurationelement

我有一个.NET应用程序,它有一个自定义配置,可以在启动时重构一些类。这不是简单的(de)序列化,而是更复杂和混合。

class FooElement : ConfigurationElement
{
     static ConfigurationProperty propValue = new ConfigurationProperty("value", typeof(int));
     static ConfigurationProperty propType = new ConfigurationProperty("type", typeof(string));

     [ConfigurationProperty("value")]
     public int Value
     {
         get { return (int)this[propValue] }
         set { this[propValue] = value }
     }

     [ConfigurationProperty("type")]
     public string Type
     {
         get { return (int)this[propType] }
         set { this[propType] = value }
     }
}

class Foo : IFoo
{
    public int Value { get; set; 
    public string Type { get; set; }
}

一些配置元素按属性重复应用程序对象,但我不想在我的应用程序中使用元素,为此我创建了轻量级对象。我可以称之为POCO。

目前我有下一个:配置:

<elements>
    <add type="MyProj.Foo, MyProj" value="10" />
</elements>

代码:

elements.Select(e => (IFoo)Activator.CreateInstance(e.Type, e));

public Foo(FooElement element)
{
    this.Value = element.Value;
}

如何更好地做到这一点?也许使用IoC或类似的东西。

1 个答案:

答案 0 :(得分:2)

interface IConfigurationConverter<TElement, TObject>
{
    TObject Convert(TElement element);
}

class FooConfigurationConverter : IConfigurationConverter<FooElement, Foo>
{
    public Foo Convert(FooElement element)
    {
        return new Foo { Value = element.Value };
    }
}

FooConfigurationConverter converter = IoC.Resolve<IConfigurationConverter<FooElement, Foo>>();
Foo foo = converter.Convert(element);