MvvmLight:SimpleIoc использует предварительно созданный объект

У меня есть класс конфигурации с большим количеством {get; установить;} свойства. Эта конфигурация реализует несколько интерфейсов. Интерфейс имеет только свойства {get;} Таким образом, я уверен, что никто не сможет изменить конфигурацию.

Конфигурацию можно прочитать из XML-файла.

      public interface IMachineConfiguration
{
    string MachineName {get;}
    ...
}
public interface IPrinterConfiguration {...}
public interface IDatabaseConfiguration {...}

public class Configuration : IMachineConfiguration, IPrinterConfiguration, IDatabaseConfiguration, I..
{
    public string MachineName {get; set;}
    ...
}

У меня есть несколько классов и фабрик, которые используют IMachineConfiguration/IPrinterConfiguration и т. д. в качестве входных данных для создания объектов.

Поэтому я использую MvvmLight SimpleIoc в качестве контроллера IOC и регистрирую интерфейсы: «Эй, если вам нужна конфигурация IPrinterConfiguration, спросите у SimpleIoc, он даст правильную!»

Довольно стандартно:

      SimpleIoc.Default.Register<IMachineConfiguration, Configuration>();
SimpleIoc.Default.Register<IPrinterConfiguration, Configuration>();
SimpleIoc.Default.Register<IDatabaseConfiguration, Configuration>();
...

Чтобы получить IPrinterConfiguration:

      IPrinterConfiguration configuration => SimpleIoc.Default.GetInstance<IPrinterConfiguration>();

Хороший! Я скрыл, что на самом деле все интерфейсы используют одну и ту же конфигурацию!

Во время запуска я читаю конфигурацию из файла XML:

      public Configuration ReadConfiguration(string fileName)
{
    using (var file = File.OpenText(fileName))
    {
        var xml = new XmlSerializer(typeof(Configuration));
        return xml.Deserialize(file) as Configuration;
    }
}

Проблема в том, что xml.Deserialize не использует SimpleIoc для получения объекта, он просто использует new.

Конечно, я мог бы скопировать все свойства по одному:

      Configuration XMLConfiguration = ReadConfiguration(...)
Configuraiton SimpleIocConfiguration = SimpleIoc.Default.GetInstance<Configuration>();

// TODO: copy all properties from XMLConfiguration to SimpleIocConfiguration

Но есть много параметров для копирования. А memeberwise copyбыло бы лучше или даже лучше: скажите SimpleIoc использовать XMLConfiguration:

"Эй, SimpleIoc, если тебе нужна Конфигурация, не создавайте новую, используйте эту!

Как это сделать?

0 ответов

Другие вопросы по тегам