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, если тебе нужна Конфигурация, не создавайте новую, используйте эту!
Как это сделать?