Как лучше сопоставить элементы конфигурации с объектами приложения? - PullRequest
2 голосов
/ 24 апреля 2011

У меня есть приложение .NET, которое имеет пользовательскую конфигурацию для восстановления некоторых классов при запуске. Это не простая (де) сериализация, она более сложная и смешанная.

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.

В настоящее время у меня есть следующее: Config:

<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 Ответ

2 голосов
/ 21 июля 2011
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);
...