我有一个 WPF 应用程序,它使用 Caliburn.Micro 并为不同类型的外壳提供框架。所有这些外壳都实现了接口IShell
。
作为一个例子,让我们以一个充当主机的主窗口和一个选项卡控件来承载不同的加载的 shell,每个 shell 一个选项卡。每个外壳都可以通过关闭选项卡来关闭。
目前它使用 MEF 来支持 IOC、组合(带有属性)和它的子容器。
在用户操作时打开一个外壳:他选择了一个存储插件信息和其他数据的文件。
基于此文件数据和一些固定类型(如报告),在框架中创建和托管外壳。
位于插件程序集中的所有组件和一些其他框架组件都应限定在外壳中,其他一些将是框架中的组件。
当用户关闭水龙头时,可以释放动态创建的范围。
由于框架目前负责创建插件外壳组件,并且需要将这些视图/视图模型添加到框架基础架构中
框架的 caliburn 引导程序如下所示
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,因此不可能有模式窗口。
用户在加载的屏幕上选择一个文件。接下来收集所有插件信息并与平台插件合并。现在我有一堆类型(视图模型,服务,...),标签内容是从这些类型构建的。