【问题标题】:Multiple applications working in one 'shell'多个应用程序在一个“外壳”中工作
【发布时间】:2011-10-02 02:09:50
【问题描述】:

我正在尝试使用 MEF 来执行此操作,但可能我使用了错误的技术。

我有 2 个应用程序(现在都有更多想法)一个是我正在转换为 Silverlight 的桌面应用程序。另一个只是适合相同结构的想法。我想将这两个应用程序作为单独的自包含应用程序并从 shell 站点内运行它们。我一直在尝试从 MEF 开始,但我对它的了解还不够,无法知道我做错了什么,或者它不是正确的技术。

目前我使用 MVVM-light 作为我的框架,我在这方面取得了巨大的成功,并且现在对它非常熟悉。我的每个应用程序都是独立的...这意味着如果我将它们设置为从我的网络服务器独立运行,我可以自己使用它们。

当我尝试使用 mef 将它们放入我的 shell 时,问题就出现了。

这是我的第一个模块容器的代码:

public partial class MEFDoctorsModuleContainer : Page, IPartImportsSatisfiedNotification
    {
        private System.Uri _requestedUri;

        public MEFDoctorsModuleContainer()
        {
            InitializeComponent();

        }

        [Import]
        public IDeploymentCatalogService CatalogService { get; set; }

        [ImportMany(AllowRecomposition = true)]
        public Lazy<UserControl, IMetadataContent>[] MEFModuleList { get; set; }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            _requestedUri = e.Uri;

            CompositionInitializer.SatisfyImports(this);
        }


        public void OnImportsSatisfied()
        {
            CatalogService.AddXap("WavelengthIS.Referee.PhysicianMaster.xap");

            //MEFModuleList.ToList()
            //       .ForEach(module =>
            //       {
            //           if ((module.Metadata.ContainerType == this.GetType().ToString() &&
            //               (module.Value.GetType().ToString() == "WavelengthIS.Referee.PhysicianMaster.MainPage.xaml")))
            //           {
            //               content.Items.Add(module.Value);
            //           }
            //       });

            MEFModuleList.ToList()
                  .ForEach(delegate(Lazy<UserControl, IMetadataContent> module)
                           {
                               if ((module.Metadata.ContainerType == this.GetType().ToString() && (module.Value.GetType().ToString() == "WavelengthIS.Referee.PhysicianMaster.App.xaml")))
                                   content.Items.Add(module.Value);
                           });
        }
    }
}

目前 xap 仅包含一个项目,但最终它将由我的数据、视图模型和客户服务项目组成。但即便如此,它也会崩溃。它似乎不喜欢 viewmodellocator。

(module.Value.GetType().ToString() == "WavelengthIS.Referee.PhysicianMaster.App.xaml")))

以前等于这个

(module.Value.GetType().ToString() == "WavelengthIS.Referee.PhysicianMaster.MainPage.xaml")))

但我认为这行不通,因为我实际上是在导入一个应用程序而不仅仅是一个页面。

所以我的问题是:鉴于我正在尝试做的事情,我最好的选择是什么?

我没有卡在 MEF 上,但我确实需要一个 Shell 应用程序,该应用程序使用 SL4 中的导航框架将独立程序加载到其中。我需要 MVVM-Light 工作,因为我非常喜欢这个框架,即使我编写了没有它的 MVVM Enterprise 应用程序,我更喜欢将它放在我的技巧包中。我不喜欢 hocus pocus...IOC 和 Dependency Injection 不在讨论范围内,因为我还不习惯使用该技术,如果我需要使用它,我会找到其他方法来做到这一点。

【问题讨论】:

    标签: silverlight-4.0 mvvm mef mvvm-light


    【解决方案1】:

    尝试让 ViewModelLocator 成为动态的,就像在这篇文章中一样:http://rickrat.wordpress.com/2011/01/24/using-mef-to-link-view-model-locator-and-load-assembly-uis-dynamically/

    它适用于 WPF,也适用于 SL4。 MEF 是解决这个问题的正确方法。我用 MEF 和 MVVM light 一次又一次地在 WPF 中做同样的事情。这里也没有恶作剧...... :)

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多