Несколько приложений, работающих в одной «оболочке» - PullRequest
0 голосов
/ 10 июля 2011

Я пытаюсь использовать MEF для этого, но, возможно, я использую неправильную технологию.

У меня есть 2 приложения (оба - больше идей прямо сейчас). Одно из них - настольное приложение, которое я конвертирую в Silverlight. Другая - это просто идея, которая вписывается в ту же структуру. Я хочу взять оба приложения как отдельные автономные приложения и запускать их из оболочки сайта. Я пытался начать это с MEF, но пока не знаю достаточно об этом, чтобы понять, делаю ли я что-то не так, или это не правильная технология.

В настоящее время я использую MVVM-light в качестве фреймворка, я добился большого успеха в этом и уже довольно хорошо знаком с ним. Каждое из моих приложений автономно ... это означает, что я могу использовать их самостоятельно, если я настрою их запуск с автономного веб-сервера.

Проблема возникает, когда я пытаюсь вставить их в свою оболочку, используя mef.

Это код моего первого модуля-контейнера:

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 состоит только из одного проекта, но в конечном итоге он будет состоять из моих данных, ViewModel и сервисных проектов для клиента. Но даже тогда это терпит крах. Это, кажется, не нравится 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 без него, я предпочитаю иметь его в своем арсенале трюков. Мне не нравится фокус-фокус ... IOC и Dependency Injection не обсуждаются, потому что мне пока не удобно пользоваться этой технологией, и если мне нужно ее использовать, я найду другой способ сделать это.

1 Ответ

0 голосов
/ 14 июля 2011

Попробуйте использовать динамический ViewModelLocator, как в этом посте: http://rickrat.wordpress.com/2011/01/24/using-mef-to-link-view-model-locator-and-load-assembly-uis-dynamically/

У меня это работает в WPF, должно быть и в SL4. MEF - верный путь к этому. Я делал практически то же самое в WPF снова и снова, с MEF и MVVM light. Здесь тоже нет фокус-покуса ...:)

...