Динамическая загрузка модулей с помощью 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, ...), из которых создается содержимое вкладки.

0 ответов

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