Silverlight 4.0 多个应用程序在一个';壳牌公司';

Silverlight 4.0 多个应用程序在一个';壳牌公司';,silverlight-4.0,mvvm,mef,mvvm-light,Silverlight 4.0,Mvvm,Mef,Mvvm Light,我正在尝试使用MEF来实现这一点,但可能我使用了错误的技术 我有两个应用程序(两个都是现在更多的想法),一个是我正在转换为Silverlight的桌面应用程序。另一个只是一个适合同一结构的想法。我希望将这两个应用程序作为独立的自包含应用程序,并在shell站点中运行它们。我一直试图从MEF开始,但我对它了解得还不够,无法确定我是否做错了什么,或者这不是正确的技术 目前,我正在使用MVVM light作为我的框架,我已经在这方面取得了巨大的成功,并且现在对它非常熟悉。我的每个应用程序都是自包含的…

我正在尝试使用MEF来实现这一点,但可能我使用了错误的技术

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

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

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

这是我的第一个modulecontainer的代码:

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);
                           });
        }
    }
}
过去是这样的

(module.Value.GetType().ToString() == "WavelengthIS.Referee.PhysicianMaster.MainPage.xaml")))
但我认为这是行不通的,因为我实际上是在导入一个应用程序,而不仅仅是一个页面

所以我的问题是:考虑到我正在努力做什么,我的最佳选择是什么?


我不是停留在MEF上,但我确实需要一个Shell应用程序,它使用SL4中的导航框架将standalones加载到MEF中。我要求MVVM Light工作,因为我非常喜欢这个框架,即使我编写的MVVM企业应用程序没有它,我还是喜欢把它放在我的技巧包里。我不喜欢hocus pocus…IOC和依赖项注入是不可能的,因为我还不习惯使用这项技术,如果我需要使用它,我会找到其他方法来实现这一点。

尝试让ViewModelLocator保持动态,如本文所示:

它适用于我在WPF,也应该在SL4。MEF是正确的方法。我在WPF中一次又一次地做了几乎相同的事情,使用MEF和MVVM light。这里也没有骗局…:)

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