使用SimpleInjector加载动态模块

时间:2015-04-24 14:35:10

标签: c# wpf caliburn.micro simple-injector lifetime-scoping

我有一个WPF应用程序,它使用Caliburn.Micro并为不同类型的shell提供框架。所有这些shell都在实现接口IShell

作为一个例子,我们可以选择一个主窗口作为主机,一个tabcontrol来托管不同的加载shell,每个shell都有一个选项卡。关闭标签可以关闭每个shell。

目前它使用MEF进行IOC支持,组合(带属性)和它的子容器。

在用户操作时打开shell: 他选择了一个存储插件信息和其他数据的文件。

基于此文件数据和一些固定类型(如报告),在框架中创建并托管shell。

位于插件程序集和一些其他框架组件中的所有组件都应该作用于shell,其他一些组件将是框架中的组件。

当用户关闭水龙头时,可以处理动态创建的范围。

由于框架目前负责创建插件shell组件,并且需要将这些视图/视图模型添加到框架基础结构

框架的校准引导程序如下所示

 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,因此不可能有模态窗口。

用户在加载的屏幕上选择一个文件。 接下来收集所有插件信息并与plaform插件合并。 现在我有一堆类型(viewmodels,service,...),用于构建选项卡内容。

0 个答案:

没有答案