Динамическая загрузка модулей с помощью SimpleInjector
У меня есть приложение WPF, которое использует Caliburn.Micro и обеспечивает рамку для различных типов оболочек. Все эти оболочки реализуют интерфейс IShell
,
В качестве примера давайте возьмем главное окно, которое действует как хост, и tabcontrol для размещения различных загруженных оболочек, по одной вкладке для каждой оболочки. Каждую оболочку можно закрыть, закрыв вкладку.
В настоящее время он использует MEF для поддержки IOC, композиции (с атрибутами) и своего дочернего контейнера.
Оболочка открывается при действии пользователя: он выбирает файл, в котором хранится информация о плагине и другие данные.
На основе данных этого файла и некоторых фиксированных типов (например, отчетов) создается и размещается оболочка во фрейме.
Все компоненты, которые находятся в сборках плагинов и некоторые другие компоненты каркаса, должны быть привязаны к оболочке, некоторые другие будут компонентами из каркаса.
Когда пользователь закрывает кран, динамически созданная область может быть удалена.
Поскольку фрейм в настоящее время отвечает за создание компонентов оболочки плагина и должен добавить эти представления / модели представления в инфраструктуру фрейма
Калибровочный бутстраппер для рамки выглядит так
protected override void Configure()
{
// register host assembly
AssemblyScanner.AddAssembly(typeof(AppBootstrapper).Assembly);
m_container = new Container();
container.RegisterSingle<IWindowManager, WindowManager>();
container.RegisterSingle<IEventAggregator, EventAggregator>();
container.RegisterSingle<IShellFactory, ShellFactory>();
// view and viewmodel registrations for the shell
// scan binaries folder for all implementations of IShell
var shells = AssemblyScanner.ScanForType<IShell>();
// register them as a collection and lifetimescoped
foreach (var shell in shells)
{
m_container.Register(shell, shell, new LifetimeScopeLifestyle());
}
m_container.RegisterAll<IShell>(shells);
m_container.Verify();
}
Фабрика по созданию снарядов
public IEnumerable<IShell> GetAll()
{
using (m_container.BeginLifetimeScope())
{
var instances = m_container.GetAllInstances<IShell>();
return instances;
}
}
В рамке основного вида модели фабрика называется
protected override void OnInitialize()
{
var shells = m_factory.GetAll();
Items.AddRange(shells);
}
Плагины определяют их необходимые регистрации, которые также будут доступны в течение всей жизни.
Вызов var shells = m_factory.GetAll();
происходит сбой, за исключением того, что служба с заданной областью запрашивается вне области, которая имеет смысл.
После прочтения документов и примеров я не уверен, как создать это с SimpleInjector.
Создание и управление дочерними контейнерами кажется неправильным с SimpleInjector. Теперь у меня такое чувство, что я что-то упускаю.
Обновить
Да, пользователь может переключать вкладки, может закрывать вкладки, очень похож на VisualStudio, поэтому модальные окна невозможны.
Пользователь выбирает файл на экране, который загружен. Далее вся информация о плагинах собирается и объединяется с плагинами плагина. Теперь у меня есть куча типов (viewmodels, service, ...), из которых создается содержимое вкладки.