Я пытаюсь зарегистрировать динамические реализации для интерфейсов, которые будут вставляться в объекты, созданные моим контейнером IoC (Unity в этом случае).Сопоставление динамического объекта с интерфейсом и регистрация с помощью IoC
Вот подход высокого уровня, я везу:
- Динамически загрузить список свойств из файла JSON. Я использую JSON.NET для этого сейчас.
- Отобразите этот динамический объект в интерфейс. В настоящее время я использую для этого Impromptu.
- Регистрация, что динамический объект с моей IoC контейнер для типа интерфейса
Вот код, который должен «теоретически» работа:
var configJson = File.ReadAllText(".\\Configuration\\DataCollector.json");
dynamic expando = JsonConvert.DeserializeObject(configJson);
var container = new UnityContainer();
var interfaceType = Type.GetType("Manufacturing.Framework.Configuration.IDataCollectorConfiguration", true);
var interfaceInstance = Impromptu.ActLike(expando, interfaceType);
container.RegisterInstance(interfaceType, "IDataCollectorConfiguration", interfaceInstance, new ContainerControlledLifetimeManager());
все хорошо до последней строки. Единству не нравится тот факт, что я не даю ему фактический экземпляр интерфейса, а только экземпляр, типичный для утки.
The type ImpromptuInterface.ActLikeCaster cannot be assigned to variables of type Manufacturing.Framework.Configuration.IDataCollectorConfiguration
Почему я это делаю? Я пытаюсь упростить мою сложную конфигурацию приложения, сохраняя мои настройки как JSON, определяя интерфейсы для сопоставления с этим JSON, а затем мой контейнер IoC автоматически вставляет соответствующую конфигурацию в любой класс, который его запрашивает.
У меня сейчас все хорошо работает. Это на самом деле очень элегантно для конфигурации. Вскоре я расскажу об этом в блогах. –