将带有Caliburn Micro和MEF的MVVM WPF解决方案集成到带有CodBackend和页面导航的旧WPF应用程序中

将带有Caliburn Micro和MEF的MVVM WPF解决方案集成到带有CodBackend和页面导航的旧WPF应用程序中,wpf,caliburn.micro,Wpf,Caliburn.micro,去年,我使用页面导航构建了一个WPF应用程序,没有MVVM。 最近,我被要求为同一个客户构建一个新的应用程序,我使用Caliburn Micro和MEF在WPF MVVM中实现了这一点。现在,我的客户要求我将新应用程序集成到旧应用程序中 我的想法是向旧应用程序添加一个新页面,并将新应用程序的shell集成到此页面的ContentControl中 我现在的问题是,旧应用程序是由 在app.xaml中输入,而新应用程序是由引导程序启动的,如 AppBootstrapper看起来像什么 class A

去年,我使用页面导航构建了一个WPF应用程序,没有MVVM。 最近,我被要求为同一个客户构建一个新的应用程序,我使用Caliburn Micro和MEF在WPF MVVM中实现了这一点。现在,我的客户要求我将新应用程序集成到旧应用程序中

我的想法是向旧应用程序添加一个新页面,并将新应用程序的shell集成到此页面的ContentControl中

我现在的问题是,旧应用程序是由

在app.xaml中输入,而新应用程序是由引导程序启动的,如

AppBootstrapper看起来像什么

class AppBootstrapper : Bootstrapper<ShellViewModel>
{
    private CompositionContainer container;

    protected override void Configure()
    {
        container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));

        CompositionBatch batch = new CompositionBatch();

        batch.AddExportedValue<IWindowManager>(new WindowManager());
        batch.AddExportedValue<IEventAggregator>(new EventAggregator());
        batch.AddExportedValue(container);

        container.Compose(batch);
    }

    protected override object GetInstance(Type serviceType, string key)
    {
        string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
        var exports = container.GetExportedValues<object>(contract);

        if (exports.Count() > 0)
        {
            return exports.First();
        }

        throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
    }

} 
因此,据我所知,对于新应用程序,引导程序会初始化整个应用程序,调用ShellViewModel,最终调用ShellView

因为我在新应用程序中使用EventAggregator从一个viewmodel向另一个viewmodel发送消息,所以我认为我不能摆脱bootstrapper而使用Caliburn Micro的view first模型

所以我的问题是:我可以自己从我的旧应用程序中调用引导程序吗?如果可以,我应该将它的实例存储在哪里?如何告诉Caliburn Micro将ShellView放在哪里


非常感谢您的帮助。

CM非常轻巧,在这些情况下,确实值得一看源代码,以了解特定类实际在做什么

引导程序之所以能够工作,是因为在应用程序的资源文件中声明它会强制对其进行实例化。构造函数在实例上调用Start,从而设置聚合器、IOC等

如果要将应用程序加载到另一个应用程序的ContentControl中,我看不出它为什么不启动CM,因为加载的应用程序的资源仍将被处理、实例化和启动引导程序等。您在测试项目中尝试过吗?这可能是你的第一个选择


在某些领域,CMs默认的Bootstrapper实现可能并不理想,但乍一看,我看不到任何明显的问题,也不知道在加载子应用程序时,应用程序事件(如OnStartup等)会发生什么,所以您可能想看看这一点。最糟糕的情况是,您可以为子应用程序推出自己的引导程序,然后使用经过调整的功能重新构建。

谢谢您的回答。我将深入研究源代码,看看能找到什么。